مقدمة
يُعد سطر الأوامر في لينكس من أقوى الأدوات في أنظمة لينكس، إذ يُتيح إدارة النظام بكفاءة وسرعة عالية. من أهم ميزاته المتقدمة ميزة History Expansion (توسيع السجل)، والتي تعتمد بشكل أساسي على الرمز !.
تسمح هذه الميزة بإعادة استدعاء الأوامر السابقة أو أجزاء منها بسرعة، مما يوفر الوقت ويقلل الأخطاء. لكن في المقابل، فهي قوية وخطيرة إذا لم تُفهم جيدًا، خصوصًا عند استخدامها مع أوامر حساسة مثل rm أو عند العمل بصلاحيات root.
ملاحظة تقنية: يتم تنفيذ History Expansion فور قراءة السطر وقبل تقسيمه إلى كلمات. يمكن تعطيلها باستخدام:
set +H
في هذا الدليل الشامل، نستعرض جميع الاستخدامات الأساسية والمتقدمة مع أمثلة عملية، اعتمادًا على التوثيق الرسمي لـ GNU Bash.
ما هو History Expansion؟
هي آلية في باش تسمح باستبدال تعبيرات تبدأ بالرمز ! بأوامر أو أجزاء من سجل الأوامر (history list) قبل تنفيذها فعليًا.
يتكوّن History Expansion من ثلاثة أجزاء رئيسية:
- Event Designator: يحدد أي أمر من السجل سيتم استخدامه.
- Word Designator: يحدد أي جزء (كلمة أو وسيط) من الأمر.
- Modifiers: لتعديل الناتج (استبدال، حذف امتداد، عرض فقط… إلخ).
يمكن دمج هذه الأجزاء معًا، مثل:
أولًا: إعادة تنفيذ أوامر سابقة (Event Designators)
تُستخدم هذه الصيغ لاختيار أمر من سجل الأوامر (history) وإعادة تنفيذه.
!!
يعيد تنفيذ آخر أمر كامل.
مثال:
!n
ينفذ الأمر رقم n من سجل الأوامر.
مثال:
!-n
ينفذ أمرًا سابقًا بعدد n من الأوامر.
مثال:
!string
ينفذ آخر أمر يبدأ بالنص string.
مثال:
!?string?
ينفذ آخر أمر يحتوي على string في أي موضع.
مثال:
!#
يشير إلى الأمر الحالي كاملًا (نادِر الاستخدام).
مثال:
ثانيًا: التعامل مع الوسائط (Word Designators)
تُستخدم بعد النقطتين : لتحديد أجزاء من الأمر السابق.
ترقيم الكلمات
- 0 - اسم الأمر نفسه
- 1 - أول وسيط
- 2 - ثاني وسيط … وهكذا
ㅤ!^
يشير إلى أول وسيط.
مثال:
mv !^ backup/
!$
يشير إلى آخر وسيط.
مثال:
cd !$
!*
يشير إلى جميع الوسائط.
مثال:
rm !*
!:n
يشير إلى الوسيط رقم n.
مثال:
echo !:2
!:n-m
من الوسيط n إلى m.
مثال:
echo !:1-3
!:n-$
من الوسيط n إلى آخر وسيط.
مثال:
!:0
اسم الأمر فقط بدون وسائط.
ثالثًا: التعديل السريع (Quick Substitution)
تُستخدم لتصحيح أخطاء مباشرة في آخر أمر.
^old^new^
استبدال أول تطابق في آخر أمر.
مثال:
^gogle^google^
!!:s/old/new/
استبدال أول تطابق في آخر أمر.
مثال:
!!:gs/old/new/
استبدال جميع التطابقات في آخر أمر.
مثال:
!!:&
إعادة تنفيذ آخر استبدال تم استخدامه.
يمكن تطبيق الاستبدال على أي أمر في السجل:
رابعًا: المُعدِّلات المتقدمة (Modifiers)
تُستخدم لتعديل الناتج النهائي ويمكن تسلسلها.
:p
يعرض الأمر فقط دون تنفيذه (مهم جدًا للأمان).
:h
يعرض المسار بدون اسم الملف.
:t
يعرض اسم الملف فقط.
:r
يعرض الاسم بدون الامتداد.
:e
يعرض الامتداد فقط.
:q
يقتبس الوسائط بشكل آمن (للأوامر الحساسة).
:x
اقتـباس مشابه لـ :q لكن مع فصل.
مثال متقدم
ls !$:h
ls !$:t:r
خامسًا: استخدامات عملية متقدمة
- إعادة استخدام ملف مع تعديل
mv !$ /backup/
- تصحيح سريع لمسار خاطئ
!cp:gs/wrong/correct/
- التحقق الآمن قبل التنفيذ
- وضع التحقق التفاعلي
اعتبارات أمنية مهمة!
- التوسيع يحدث قبل التنفيذ مباشرة.
- أي خطأ قد يؤدي لتنفيذ أوامر مدمرة.
- الأوامر التي تحتوي على كلمات مرور تُحفظ في
~/.bash_history. - لا يُنصح باستخدام
!داخل السكربتات. - يمكن تعطيل الميزة كليًا عند الحاجة.
يُنصح بشدة باستخدام:
متى يُنصح باستخدام الرمز !؟
العمل التفاعلي اليومي، التصحيح السريع للأخطاء، عند استخدام :p أو histverify
لا يُنصح باستخدامه في سكربتات الإنتاج، أوامر الحذف الحساسة دون تحقق مُسبق، بيئات متعددة المستخدمين دون حماية السجل
