
هل تستخدم الصدفة كل يوم؟ هل أنت مستعد لحل بعض المشاكل المنطقية وتعلم شيء جديد؟ مرحبا بكم في القطط.
بعض المهام المعروضة هنا لن تحقق فوائد حقيقية ، لأنها تؤثر على بعض الحالات الحدودية المعقدة. سيكون الجزء الآخر مفيدًا لأولئك الذين يستخدمون الصدفة باستمرار ويقرأون نصوص الآخرين.
ملاحظة: في وقت كتابة هذا التقرير ، استخدم المؤلف إصدار 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 بعد الأمر؟
شرحبعد تفسير الأمر ، ولكن قبل تشغيل جميع البرامج ، يعمل bash مع تدفقات الإدخال / الإخراج المحددة. وبالتالي ، يتم مسح الملف 1
قبل بدء البرنامج الأول ويفتح cat
الملف الذي تم مسحه بالفعل.
المهمة 2 $ cat file1 I love UNIX! $ cat file2 I don't like UNIX $ cat file1 <file2
ما الذي سيتم عرضه على الشاشة؟
شرحبعض البرامج تدق على stdin عند تحديد الملفات.
المهمة 3 $ cat file Just for fun $ cat file 1>&2 2>/dev/null
ما الذي سيتم عرضه على الشاشة؟
شرحهناك اعتقاد خاطئ بأن التسلسل
1>&2
يعيد توجيه الخيط الأول إلى الثاني ، ولكن هذا ليس كذلك. اعتبر الفريق من المهمة. في بداية تفسير الأمر المُدخل ، يبدو جدول التدفق كما يلي:
يكتشف باش التسلسل
1>&2
وينسخ محتويات الخلية 2 إلى الخلية 1:
بعد الكشف عن التسلسل
2>/dev/null
يكتب المترجم القيمة إلى الخلية 2 ، تاركًا الخلايا الأخرى سليمة:
0 | 1 | 2 |
ستدين | stderr | / dev / null |
يعرض bash أيضًا دفقًا من الأخطاء ، حتى نجد نص الملف على الشاشة.
المهمة 4كيفية إرسال إخراج stdout إلى stderr ، وإخراج stderr ، على العكس من ذلك ، إلى stdout؟
شرحالمبدأ هو نفسه تمامًا كما في المهمة السابقة. هذا هو السبب في أننا بحاجة إلى دفق إضافي للتخزين المؤقت.
الملفات التنفيذية
المهمة 5ملف test.sh المعطى
يتم تنفيذ الأوامر التالية:
$ 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 والمحتويات التالية:
صفر المتغير $ 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}
ما الذي سيتم عرضه على الشاشة؟
شرحبمثل هذا السجل ، يطابق النمط (# - من بداية المتغير ؛ ## - بجشع من بداية المتغير ؛ ٪ - من نهاية المتغير ؛ ٪٪ - بجشع من نهاية المتغير) ويتم حذفه عند الاستبدال. محتويات المتغير تبقى سليمة. وبالتالي ، على سبيل المثال ، من السهل الحصول على اسم الملف بدون الامتداد.
$ 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
ما الذي سيتم عرضه على الشاشة؟
شرحأضف أقواسًا لترتيب صريح وقم بتبسيط الأمر ، مع الأخذ في الاعتبار أنه يتم فقط أخذ رمز الإرجاع للأمر الأخير في الاعتبار:
((((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.