كيفية استخدام متغير البيئة داخل سلسلة مقتبسة في Bash

StackOverflow https://stackoverflow.com/questions/840536

  •  20-08-2019
  •  | 
  •  

سؤال

لقد جربت أشكالًا مختلفة مما يلي في برنامج نصي bash:

#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

لكن لا يمكنني الحصول على بناء الجملة لتوسيع ملف COLUMNS متغيرات البيئة.

لقد جربت أشكالًا مختلفة مما يلي:

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'

و

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'

و

eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

اقتراحات؟

هل كانت مفيدة؟

المحلول

إذا لم تكن متأكدا، قد تستخدم طلب "العواميد" على المحطة، وننسى الأعمدة:

COLS=$(tput cols)

نصائح أخرى

ومجرد سريع مذكرة / ملخص عن أي الذين جاءوا الى هنا عبر جوجل عن الجواب على السؤال العام طلب في عنوان (كما كنت). أي مما يلي يجب أن تعمل للحصول على الوصول إلى المتغيرات قذيفة داخل الاقتباس:

echo "$VARIABLE"
echo "${VARIABLE}"

واستخدام علامات الاقتباس المفردة هي القضية الرئيسية. وفقا ل باش المرجعي دليل :

<اقتباس فقرة>   

وأرفق الأحرف في علامات الاقتباس المفردة (') يحافظ على قيمة حرفية من كل حرف داخل الاقتباس. قد لا يحدث اقتباس مفردة بين علامات الاقتباس المفردة، حتى عندما يسبقه مائل.   [...]   أرفق الأحرف في علامات الاقتباس المزدوجة (") يحافظ على قيمة حرفية من جميع الشخصيات داخل ونقلت وباستثناء $، `، \، وعندما يتم تمكين التوسع التاريخ، !. الأحرف $ و`الاحتفاظ معنى خاص بهم ضمن علامات اقتباس مزدوجة (انظر شل التوسعات). مائل يحتفظ معنى خاص به فقط عند تليها واحد من الأحرف التالية: $، `، "، \، أو سطر جديد. ضمن علامات اقتباس مزدوجة، تتم إزالة الخطوط المائلة العكسية التي تليها واحدة من هذه الشخصيات. يتم ترك الخطوط المائلة العكسية السابقة حرفا دون معنى خاص معدلة. قد نقل عن الاقتباس المزدوجة ضمن علامات الاقتباس المزدوجة التي سبقته بخط مائل. في حالة التمكين، سيتم تنفيذ التوسع التاريخ إلا إذا نجا من ! الظهور في علامات الاقتباس المزدوجة باستخدام مائل. لم تتم إزالة مائل سبقت !.   المعلمات * الخاصة و@ لها معنى خاص عندما تكون في التنصيص (انظر شل معلمة التوسع).

في حالة محددة طلب في السؤال، $ الأعمدة هي متغير خاص الذي له خصائص غير قياسي (انظر الجواب lhunath في أعلاه).

لاحظ أن COLUMNS يكون:

  1. لا متغير البيئة.إنها معلمة bash عادية يتم تعيينها بواسطة bash نفسه.
  2. تعيين تلقائيا عند استلام أ SIGWINCH الإشارة.

هذه النقطة الثانية تعني عادةً أن لديك COLUMNS سيتم تعيين المتغير فقط في ملفك تفاعلية صدَفَة، لا في البرنامج النصي باش.

إذا كان البرنامج النصي الخاص بك stdin متصلاً بالمحطة الطرفية الخاصة بك، يمكنك البحث يدويًا عن عرض المحطة الطرفية الخاصة بك عن طريق سؤال المحطة الطرفية الخاصة بك:

tput cols

ولاستخدام هذا في أمر SVN الخاص بك:

svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"

(ملحوظة:يجب يقتبس "$@" والابتعاد عن eval ;-))

والبرنامج النصي التالي يعمل بالنسبة لي لقيم متعددة من $COLUMNS. وأتساءل عما إذا كنت لا وضع COLUMNS قبل هذه الدعوة؟

#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

هل كنت أردد $COLUMNS داخل السيناريو الخاص بك لمعرفة ما اذا كان تعيين بشكل صحيح؟

وأنت تفعل ذلك الحق، لذا أعتقد شيء آخر هو على خطأ (وليس تصدير جي الأعمدة؟).

وخدعة لتصحيح هذه الحالات هو جعل أمر المتخصصة (إغلاق للرجال لغة البرمجة). إنشاء شيل اسمه فرق الأعمدة بهذا الأمر:

exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"

وومجرد استخدام

svn diff "$@" --diff-cmd  diff-columns

وبهذه الطريقة التعليمات البرمجية أنظف لقراءة وأكثر وحدات (من أعلى إلى أسفل نهج)، ويمكنك اختبار التعليمات البرمجية الأعمدة فرق لنا كليا على حدة (نهج من أسفل إلى أعلى).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top