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



quotes environment (4)

لاحظ أن COLUMNS هو:

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

تعني النقطة الثانية عادةً أنه سيتم تعيين متغير COLUMNS الخاص بك فقط في shell التفاعلي ، وليس في النص البرمجي bash.

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

tput cols

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

svn diff "[email protected]" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"

(ملاحظة: يجب عليك اقتباس "[email protected]" والابتعاد عن eval ؛-))

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

#!/bin/bash
svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

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

لقد حاولت أشكالا مختلفة من ما يلي:

svn diff [email protected] --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'

و

svn diff [email protected] --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'

و

eval svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

اقتراحات؟


Answer #1

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

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

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

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

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


Answer #2

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

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

هل يمكنك صدى $COLUMNS داخل النص البرمجي لمعرفة ما إذا تم ضبطه بشكل صحيح؟


Answer #3

إذا لم تكن متأكدًا ، فيمكنك استخدام طلب "cols" على المحطة الطرفية ، وننسى COLUMNS:

COLS=$(tput cols)




environment