الرمز ! في لينكس دليل لاستخدام History Expansion

Mr. Pro
0

مقدمة

يُعد سطر الأوامر في لينكس من أقوى الأدوات في أنظمة لينكس، إذ يُتيح إدارة النظام بكفاءة وسرعة عالية. من أهم ميزاته المتقدمة ميزة History Expansion (توسيع السجل)، والتي تعتمد بشكل أساسي على الرمز !.

تسمح هذه الميزة بإعادة استدعاء الأوامر السابقة أو أجزاء منها بسرعة، مما يوفر الوقت ويقلل الأخطاء. لكن في المقابل، فهي قوية وخطيرة إذا لم تُفهم جيدًا، خصوصًا عند استخدامها مع أوامر حساسة مثل rm أو عند العمل بصلاحيات root.


ملاحظة تقنية: يتم تنفيذ History Expansion فور قراءة السطر وقبل تقسيمه إلى كلمات. يمكن تعطيلها باستخدام:
set +o histexpand
set +H

في هذا الدليل الشامل، نستعرض جميع الاستخدامات الأساسية والمتقدمة مع أمثلة عملية، اعتمادًا على التوثيق الرسمي لـ GNU Bash.


ما هو History Expansion؟

هي آلية في باش تسمح باستبدال تعبيرات تبدأ بالرمز ! بأوامر أو أجزاء من سجل الأوامر (history list) قبل تنفيذها فعليًا.

يتكوّن History Expansion من ثلاثة أجزاء رئيسية:

  1. ‏Event Designator: يحدد أي أمر من السجل سيتم استخدامه.
  2. ‏Word Designator: يحدد أي جزء (كلمة أو وسيط) من الأمر.
  3. ‏Modifiers: لتعديل الناتج (استبدال، حذف امتداد، عرض فقط… إلخ).

يمكن دمج هذه الأجزاء معًا، مثل:

!!:gs/old/new/

أولًا: إعادة تنفيذ أوامر سابقة (Event Designators)

تُستخدم هذه الصيغ لاختيار أمر من سجل الأوامر (history) وإعادة تنفيذه.

!!

يعيد تنفيذ آخر أمر كامل.

مثال:

sudo !!

!n

ينفذ الأمر رقم n من سجل الأوامر.

مثال:

!123

!-n

ينفذ أمرًا سابقًا بعدد n من الأوامر.

مثال:

!-3

!string

ينفذ آخر أمر يبدأ بالنص string.

مثال:

!ls

!?string?

ينفذ آخر أمر يحتوي على string في أي موضع.

مثال:

!?error?

!#

يشير إلى الأمر الحالي كاملًا (نادِر الاستخدام).

مثال:

echo !#

ثانيًا: التعامل مع الوسائط (Word Designators)

تُستخدم بعد النقطتين : لتحديد أجزاء من الأمر السابق.

ترقيم الكلمات

  • 0 - اسم الأمر نفسه
  • 1 - أول وسيط
  • 2 - ثاني وسيط … وهكذا

ㅤ!^

يشير إلى أول وسيط.

مثال:

cp file.txt /tmp
mv !^ backup/

!$

يشير إلى آخر وسيط.

مثال:

mkdir project
cd !$

!*

يشير إلى جميع الوسائط.

مثال:

touch a b c
rm !*

!:n

يشير إلى الوسيط رقم n.

مثال:

echo a b c
echo !:2

!:n-m

من الوسيط n إلى m.

مثال:

echo a b c d
echo !:1-3

!:n-$

من الوسيط n إلى آخر وسيط.

مثال:

echo !:2-$

!:0

اسم الأمر فقط بدون وسائط.


ثالثًا: التعديل السريع (Quick Substitution)

تُستخدم لتصحيح أخطاء مباشرة في آخر أمر.

^old^new^

استبدال أول تطابق في آخر أمر.

مثال:

ping gogle.com
^gogle^google^

!!:s/old/new/

استبدال أول تطابق في آخر أمر.

مثال:

!!:s/txt/pdf/

!!:gs/old/new/

استبدال جميع التطابقات في آخر أمر.

مثال:

!!:gs/foo/bar/

!!:&

إعادة تنفيذ آخر استبدال تم استخدامه.

يمكن تطبيق الاستبدال على أي أمر في السجل:

!123:gs/old/new/

رابعًا: المُعدِّلات المتقدمة (Modifiers)

تُستخدم لتعديل الناتج النهائي ويمكن تسلسلها.

:p

يعرض الأمر فقط دون تنفيذه (مهم جدًا للأمان).

!!:p

:h

يعرض المسار بدون اسم الملف.

/path/file.txt → /path

:t

يعرض اسم الملف فقط.

file.txt

:r

يعرض الاسم بدون الامتداد.

file

:e

يعرض الامتداد فقط.

.txt

:q

يقتبس الوسائط بشكل آمن (للأوامر الحساسة).

:x

اقتـباس مشابه لـ :q لكن مع فصل.


مثال متقدم

touch /long/path/file.txt
ls !$:h
ls !$:t:r

خامسًا: استخدامات عملية متقدمة

  • إعادة استخدام ملف مع تعديل
tar -czf backup.tar.gz /folder
mv !$ /backup/
  • تصحيح سريع لمسار خاطئ
cp file.txt /wrong/path
!cp:gs/wrong/correct/
  • التحقق الآمن قبل التنفيذ
rm !*:p
  • وضع التحقق التفاعلي
shopt -s histverify

اعتبارات أمنية مهمة!

  • التوسيع يحدث قبل التنفيذ مباشرة.
  • أي خطأ قد يؤدي لتنفيذ أوامر مدمرة.
  • الأوامر التي تحتوي على كلمات مرور تُحفظ في ~/.bash_history.
  • لا يُنصح باستخدام ! داخل السكربتات.
  • يمكن تعطيل الميزة كليًا عند الحاجة.

يُنصح بشدة باستخدام:

shopt -s histverify

متى يُنصح باستخدام الرمز !؟

العمل التفاعلي اليومي، التصحيح السريع للأخطاء، عند استخدام :p أو histverify

لا يُنصح باستخدامه في سكربتات الإنتاج، أوامر الحذف الحساسة دون تحقق مُسبق، بيئات متعددة المستخدمين دون حماية السجل

Tags

إرسال تعليق

0 تعليقات

إرسال تعليق (0)

#buttons=(اوافق) #days=(20)

موقعنا يستخدم ملفات تعريف الارتباط (Cookies) لتحسين تجربتك. تحقق الآن
Ok, Go it!