How to use exclamation mark in git commit message

شاید برای شما هم پیش اومده باشه که بخواهید توی پیغام commit مربوط به  git از کاراکتر "!" (علامت تعجب) استفاده کنید. اما وقتی این کاراکتر رو استفاده کنید با پیغام خطایی مواجه خواهید شد که در زیر نشون دادم :
 
git commit -m "frmHelp added!"
bash: !": event not found

این به خاطر وجود شلی هست که دستورات git رو توی اون وارد میکنیم. درواقع وقتی از bash یا shell لینوکس استفاده میشه این اتفاق میفته.
اگر کاربر ویندوز باشید و Cygwin Terminal رو نصب کرده باشید و یا تو همون bash مربوط به git دستور زیر رو وارد کنید همون پیغام خطا رو خواهید گرفت:

 echo "hello!"

خوب برای استفاده از کاراکتر "!"  چند راه وجود داره:
استفاده از single quotes مثل دستور زیر
git commit -m 'frmHelp added!'
یا استفاده ادغام  single quotes و double quotes:
git commit -m "frmHelp added"'!'
یا استفاده از "\"  :
git commit -m "frmHelp added\!"

اگه بخواهیم که کلا از شر این کارا راحت بشیم باید چیکار کنیم؟
اول باید کمی درباره بعضی دستورات لینوکس توضیح بدم و با history شروع میکنم. دستور history باعث میشه که دستوراتی که در شل زدید رو بهتون نمایش بده. برای مثال دستور history در شل من به صورت زیر هستش :

Ahmad@Chehre ~
$ history
    1  pwd
    2  cd e:pwd
    3  cd e:pwd
    4  cd e:
    5  pwd
    6  ls
    7  exit
    8  pwd
    9  ls
   10  ps
   11  history

حالا اگر بخواهیم دستور شماره 5 دوباره اجرا بشه، خیلی راحت میتونیم از دستور زیر استفاده کنیم:
$ !5
یا برای اجرای دستور قبلی از دستور زیراستفاده میکنیم
$ !! 

این دو دستور نمونه هایی بودن از کاربردهای کاراکتر "!" در bash. خوب این امکانات رو  history expansion مربوط به bash برای ما به ارمغان میاره  و برای فعال کردن اون میتونید از از دستورات زیر استفاده کنید:
$ set -H
$ set -o histexpand

البته histexpand به صورت پیشفرض فعال هست و در راهنمای bash اینطور گفته شده:

-H  Enable ! style history substitution. This option is on
    by default when the shell is interactive.

برای غیر فعال کردن هم میتونید از دستورات زیر استفاده کنید:
$ set +H
$ set +o histexpand

در آخر برای اینکه تست کنیم که ببینیم حالا میتونیم از کاراکتر "!" استفاده کنیم، از دستور زیر استفاده می کنیم:

echo "hello!"

و در آخر باید بگم که خود من روش اول رو میپسندم چون نمیخوام امکانات history expansion رو از دست بدم.

جستجو