كيف تعشش باش الخلفية بشكل صحيح
سؤال
إما أن فاتني بعض رد الفعل العنيف أو رد الفعل لا يبدو أنه يعمل مع الكثير من حلقة المبرمجة.
$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"
hello1-hello2-hello3-echo hello4
مطلوب
hello1-hello2-hello3-hello4-hello5-hello6-...
المحلول
يستخدم $(commands)
في حين أن:
$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
$(commands)
يفعل نفس الشيء مثل backticks ، ولكن يمكنك أن تعشهم.
قد تكون مهتمًا أيضًا بتوسعات نطاق Bash:
echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10
نصائح أخرى
إذا أصرت على استخدام backticks ، يمكن القيام باتباع
$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"
عليك أن تضع الانتشار الخلفي ، \\ \\\\ \\\\\\\\
بواسطة 2x وما إلى ذلك ، إنه مجرد قبيح للغاية ، والاستخدام $(commands)
كما اقترح آخر.
في أي وقت تريد تقييم استخدام الأمر command substitution
:
$(command)
في أي وقت تريد تقييم استخدام التعبير الحسابي expression substitution
:
$((expr))
يمكنك أن تعش هذا مثل هذا:
دعنا نقول ملفات 1.txt طولها 30 سطرًا و file2.txt طولها 10 أسطر ، مما يمكنك تقييم تعبير مثل هذا:
$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))
التي ستخرج 20 (الفرق في عدد الخطوط بين ملفين).
إنه أسهل كثيرًا إذا كنت تستخدم Bash's $(cmd)
بناء جملة الاستبدال, ، وهو أكثر ودية إلى أن تكون متداخلًا:
$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
في بعض الأحيان يمكن استبدال التعشيش بالظهر xargs
والأنابيب
$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4
عيب هذا الحل هو:
- يجب توفير جميع الحجج بترتيب عكسي (4 → 1) ؛
تصبح جميع الحجج منفصلة عن مساحة (قابلة للحل مع
tr
):$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-' hello1-hello2-hello3-hello4
دعنا نعرض حالة استخدام حقيقية.
تتبع الأوامر العمل في باش ، ولكن ليس في TCSH (لا يتم التعامل مع تعشيش Backtick جيدًا في TCSH)
$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``
يمكن استبدالها مع
$ which bash | xargs dirname | xargs ls