كيف تعرف باش؟


هل تستخدم الصدفة كل يوم؟ هل أنت مستعد لحل بعض المشاكل المنطقية وتعلم شيء جديد؟ مرحبا بكم في القطط.

بعض المهام المعروضة هنا لن تحقق فوائد حقيقية ، لأنها تؤثر على بعض الحالات الحدودية المعقدة. سيكون الجزء الآخر مفيدًا لأولئك الذين يستخدمون الصدفة باستمرار ويقرأون نصوص الآخرين.

ملاحظة: في وقت كتابة هذا التقرير ، استخدم المؤلف إصدار bash 4.4.12 (1) في نظام Linux الفرعي على نظام التشغيل Windows 10. يختلف تعقيد المهام.

تيارات الإدخال / الإخراج


المهمة 1

$ cat 1 The cake is a lie! Wanted! Cake or alive $ cat 1 | head | tail | sed -e 's/alive/dead/g' | tee | wc -l > 1 

كم عدد الأسطر في الملف 1 بعد الأمر؟

الجواب
1

شرح
بعد تفسير الأمر ، ولكن قبل تشغيل جميع البرامج ، يعمل bash مع تدفقات الإدخال / الإخراج المحددة. وبالتالي ، يتم مسح الملف 1 قبل بدء البرنامج الأول ويفتح cat الملف الذي تم مسحه بالفعل.

المهمة 2

 $ cat file1 I love UNIX! $ cat file2 I don't like UNIX $ cat file1 <file2 

ما الذي سيتم عرضه على الشاشة؟

الجواب
I love UNIX!

شرح
بعض البرامج تدق على stdin عند تحديد الملفات.

المهمة 3

 $ cat file Just for fun $ cat file 1>&2 2>/dev/null 

ما الذي سيتم عرضه على الشاشة؟

الجواب
Just for fun

شرح
هناك اعتقاد خاطئ بأن التسلسل 1>&2 يعيد توجيه الخيط الأول إلى الثاني ، ولكن هذا ليس كذلك. اعتبر الفريق من المهمة. في بداية تفسير الأمر المُدخل ، يبدو جدول التدفق كما يلي:
012
ستدينstdoutstderr

يكتشف باش التسلسل 1>&2 وينسخ محتويات الخلية 2 إلى الخلية 1:
012
ستدينstderrstderr

بعد الكشف عن التسلسل 2>/dev/null يكتب المترجم القيمة إلى الخلية 2 ، تاركًا الخلايا الأخرى سليمة:
012
ستدينstderr/ dev / null

يعرض bash أيضًا دفقًا من الأخطاء ، حتى نجد نص الملف على الشاشة.

المهمة 4
كيفية إرسال إخراج stdout إلى stderr ، وإخراج stderr ، على العكس من ذلك ، إلى stdout؟

الجواب
4>&1 1>&2 2>&4

شرح
المبدأ هو نفسه تمامًا كما في المهمة السابقة. هذا هو السبب في أننا بحاجة إلى دفق إضافي للتخزين المؤقت.

الملفات التنفيذية


المهمة 5

ملف test.sh المعطى

 #!/bin/bash ls $* ls $@ ls "$*" ls "$@" 

يتم تنفيذ الأوامر التالية:

 $ ls 1 2 3 test.sh $ ./test.sh 1 2 3 

ماذا سيخرج البرنامج النصي؟

الجواب
1 2 3
1 2 3
ls: cannot access '1 2 3': No such file or directory
1 2 3


شرح
بدون علامات اقتباس ، لا يختلف المتغيران $ * و $ @ ويتم توسيعهما إلى جميع الوسائط الموضعية المعطاة للبرنامج النصي ، مفصولة بمسافة. في علامات الاقتباس ، تتغير طريقة الإفشاء: $ * يتحول إلى "$ 1 $ 2 $ 3" ​​و $ @ بدوره إلى "$ 1" "$ 2" "$ 3". نظرًا لأن الملف "1 2 3" غير موجود في الدليل ، يعرض ls خطأ

المهمة 6

في الدليل الحالي ، قم بإنشاء ملف -c بأذونات 755 والمحتويات التالية:

 #!/bin/bash echo $1 

صفر المتغير $ PATH وحاول تنفيذ:

 $ PATH= $ -c "echo SURPRISE" 

ما الذي سيتم عرضه على الشاشة؟ ماذا يحدث إذا أعدت إدخال الأمر الأخير؟

الجواب
سيتم عرض المرة الأولى SURPRISE ، والمرة الثانية echo SURPRISE

شرح
إذا كان PATH فارغًا ، يبدأ shell في البحث عن الملفات في الدليل الحالي. -c يقع فقط. بما أن الملف القابل للتنفيذ هو ملف نصي ، تتم قراءة السطر الأول حول موضوع shebang. يتم تجميع الفريق وفقًا للنموذج:

 <shebang> <filename> <args> 

وهكذا ، قبل التنفيذ ، يبدو أمرنا كما يلي:

 /bin/bash -c "echo SURPRISE" 

ونتيجة لذلك ، ليس هذا ما أردنا القيام به تمامًا.

إذا قمت بتنفيذه مرة ثانية ، فسوف تلتقط الصدفة معلومات حول -c من ذاكرة التخزين المؤقت وتقوم بتنفيذها بشكل صحيح بالفعل. الطريقة الوحيدة لحماية نفسك من مثل هذا التأثير غير المتوقع هو إضافة سلبيين إلى shebang.

المتغيرات


المهمة 7

 $ ls file $ cat <$(ls) $ cat <(ls) 

ما سيتم عرضه في الحالة الأولى والثانية؟

الجواب
سيعرض الأول محتويات ملف الملف ، والثاني - اسم الملف.

شرح
في الحالة الأولى ، يتم إجراء الاستبدال

 cat <file 

في الحالة الثانية ، سيتم استبدال <(ls) بأنبوب مسمى متصل بواسطة الإدخال إلى stdout ls والإخراج من stdin cat.

بعد الاستبدال ، سيأخذ الأمر الشكل التالي:

 cat /dev/fd/xx 


المهمة 8

 $ TEST=123456 $ echo ${TEST%56} 

ما الذي سيتم عرضه على الشاشة؟

الجواب
1234

شرح
بمثل هذا السجل ، يطابق النمط (# - من بداية المتغير ؛ ## - بجشع من بداية المتغير ؛ ٪ - من نهاية المتغير ؛ ٪٪ - بجشع من نهاية المتغير) ويتم حذفه عند الاستبدال. محتويات المتغير تبقى سليمة. وبالتالي ، على سبيل المثال ، من السهل الحصول على اسم الملف بدون الامتداد.

 $ TEST=file.ext $ echo ${TEST%.ext} file 


المهمة 9

 $ echo ${friendship:-magic} 

ما الذي سيتم عرضه على الشاشة؟

الجواب
إذا تم تحديد متغير الصداقة ، ثم محتويات المتغير. خلاف ذلك ، السحر.

شرح
في الوثائق ، يسمى هذا السحر "unset or null" ويسمح لك باستخدام القيمة الافتراضية المحددة لمتغير في سطر واحد.

أمر تنفيذ


المهمة 10

 while true; false; do echo Success done 

ما الذي سيتم عرضه على الشاشة؟

الجواب
لا شيء

شرح
تسمح لك عبارات while و if بحشر سلسلة كاملة من الإجراءات في الحالة ، ولكن النتيجة (رمز الإرجاع) ستؤخذ في الاعتبار فقط في الأمر الأخير. نظرًا لأنها خاطئة ، فلن تبدأ الحلقة حتى.

المهمة 11

 $ false && true || true && false && echo 1 || echo 2 

ما الذي سيتم عرضه على الشاشة؟

الجواب
2

شرح
أضف أقواسًا لترتيب صريح وقم بتبسيط الأمر ، مع الأخذ في الاعتبار أنه يتم فقط أخذ رمز الإرجاع للأمر الأخير في الاعتبار:

 ((((false && true) || true) && false) && echo 1) || echo 2 (((false || true) && false) && echo 1) || echo 2 ((true && false) && echo 1) || echo 2 (false && echo 1) || echo 2 false || echo 2 echo 2 


التعليقات والاقتراحات والمهام الإضافية هي موضع ترحيب في التعليقات أو PM.

Source: https://habr.com/ru/post/ar413935/


All Articles