كيف تكتشف أوامر Terminal تُغيّر تجربتك على الفور؟
في هذه المقالة أشارك أسرارًا فعالة لأوامر سطر الأوامر (Terminal) غالبًا ما تبقى خفية أو يُغفل عنها الكثيرون. ستتعلم أوامر تُسهل المهام اليومية، تحسّن سرعتك في التعامل مع النظام، وتمنحك أدوات قوية للتحكم الكامل. أبدأ بالإجابة السريعة ثم أُفصّل:
أوامر مثل grep
و tail
و tmux
يمكنها أن تحوّل طريقة إدارتك للملفات، التتبع، وتنفيذ الأوامر المتزامنة. سأعرض سياقات الاستخدام، نصائح لتلافي الأخطاء، وأمثلة عملية ستجعلك تستخدمها بثقة في اليوم الأول.
كل قسم في هذا الدليل مكتوب بعناية ليتوافق مع ما تبحث عنه: إجابة واضحة أولًا، عناوين فرعية منظمة، أمثلة قابلة للتطبيق، وروابط داخلية إلى موضوعات متعلقة ستساعدك في التعمّق.
هيا نبدأ — ولن يخذلك Terminal بعد اليوم.
سواءً كنتَ تتعلم الطرفية أو محترفًا مُحنّكًا، فهناك دائمًا العديد من الحيل الصغيرة التي يمكنك تعلمها – حيل تُوفّر عليك الوقت. لديّ ثلاث حيل مفيدة في Bash يُمكنك إضافتها إلى ترسانتك.
استبدال العملية، لتحويل البيانات إلى ملفات بيانات مؤقتة
ربما واجهتَ موقفًا احتجت فيه إلى مسار ملف كمُعامل، ولكن كل ما لديك هو البيانات.
على سبيل المثال، لنفترض أنك تُريد تعديل نص موجود مُسبقًا في الطرفية:
echo "foo" | nano
الأمر السابق لا يعمل، لأنه لا يمكنك توجيه البيانات إلى nano؛ بدلاً من ذلك، عليك توفير مسار ملف، كما يلي: nano /path/to/file.txt.
لحل هذه المشكلة، غالبًا ما ستستخدم تسلسل أوامر مشابهًا لما يلي:
echo foo > bar.txt
nano bar.txt
باستخدام أمرين منفصلين، تُنشئ ملفًا، ثم تُجري عليه عمليةً ما. هذه الطريقة غير مثالية لأنها تترك الملفات متناثرة في نظام الملفات، وتحتاج أيضًا إلى كتابة مسارها. استبدال العملية يحل هذه المشكلة:
echo <(true)
إذا قمت بتنفيذ الأمر السابق، فسترى أنه يطبع مسار الملف كما يلي:
/dev/fd/16
يُولّد استبدال العملية ملفًا مؤقتًا من مُخرَج أمر، مما يسمح لأمر آخر بالقراءة منه. في المثال السابق، يُولّد “<(true)” مسار المُخرَج، ويستقبله “echo”. البيانات في المُخرَج هي ببساطة “true”.
نصيحة
يشير الجزء “fd” من المسار إلى مُصطلح “واصف الملف”، وهو مُعرّف تستخدمه البرامج داخليًا للإشارة إلى الملفات المفتوحة. يحتوي هذا المثال على واصف ملف رقمه 16. واصفات الملفات خاصة بالعمليات التي تستخدمها – وهو “echo” في هذه الحالة.
لنستخدم استبدال العملية بطريقة مفيدة:
nano <(echo "foo")
الأمر السابق هو نفسه كتابة الأمر التالي:
echo "foo" > /tmp/foo
nano /tmp/foo
لن تتمكن من حفظ النص وتعديله عند تشغيل nano <(echo “foo”) لأن الملف المُنشأ خصيصًا للقراءة فقط، ولكن يمكنك تغيير مكان حفظه باستخدام اختصار Ctrl+o.
استبدال عملية الإدخال/الإخراج
يُنشئ التعبير “<(foo)” استبدالًا لعملية الإدخال. أو يمكنك أيضًا إنشاء استبدال لعملية الإخراج:
echo "foo" > >(cat)
الأمر السابق هو نفسه كتابة الأمر التالي:
echo "foo" > /tmp/foo
cat /tmp/foo
مع أن الأمرين قد يبدوان مختلفين، إلا أنهما يعملان بنفس الطريقة. يتضح الأمر أكثر عندما تفهم أن الأمر echo “foo” > >(cat) يكتب “foo” في ملف خاص، والذي يقرأ منه الأمر cat.
باختصار،
- echo <(true) هو استبدال لعملية إدخال، ويستقبل الأمر echo البيانات عبر مسار ملف خاص (في هذه الحالة، تكون البيانات “true” فقط).
- echo “foo” > >(cat) هو استبدال لعملية إخراج، ويستقبل الأمر cat الكلمة التي تم ترديدها عبر مسار خاص. الحرف “>” الأول هو عامل إعادة التوجيه، والثاني جزء من تعبير الاستبدال نفسه.
لإنهاء هذا القسم، أعتقد أن مثالًا واقعيًا سيربط الأمر بشكل جيد:
diff <(ls -1 ~) <(ls -1 /tmp)
سيُقارن هذا الأمر الاختلافات بين مجلدين. يُعد استبدال عملية الإدخال مفيدًا في هذه الحالة لأن دالة diff تتوقع مسارات الملفات، وهذا ما توفره عمليات الاستبدال.
ملاحظة
الرمز “ls -1” هو واحد، وليس الحرف l.
أوامر توسيع السجل للتكرار
يستخدم مطورو Bash مصطلح “توسيع” كثيرًا. قد يبدو معقدًا، لكنه يعني ببساطة تغيير شيء صغير إلى شيء أكبر – لتوسيعه. المثال الأشهر هو توسيع التلدة (~)، الذي يتوسع إلى مسار المجلد الرئيسي.
الأمثلة الثلاثة التالية تُسمى جميعها توسيعات السجل. جميع هذه التعبيرات تتوسع من مدخلات أحرف بسيطة إلى عناصر في سجل shell.
Bang, Bang!!
هذا أحد أكثر الأوامر استخدامًا بعد cd وls. إنه سهل الاستخدام والفهم. يُعيد تشغيل آخر أمر نفّذته.
ls
!!
يمكنك ملاحظة من مخرجات الأمر أن الأمر ls يُنفَّذ مرتين.
وسِّع عنصرًا محددًا في سجلك
أولًا، راجع سجلك لاختيار أمر مناسب:
history
ثم ببساطة اختر أحد الأرقام الموجودة على اليسار وأدخله كـ N:
!N