【Git】コミットメッセージに ' ! ' を加えるときの対応
はじめに
以下のようなエラーを見たことがあるでしょうか?
bash: !: event not found
この記事では、イベントが見つからないというエラーメッセージについて、調べたことをまとめていきます。
コミットメッセージ
git commit -m "refactor: Invert doesNotHaveSpace logic to use '!'"
bash: !: event not found
エラーメッセージ
bash: !: event not found
原因
Bashは、コマンドラインで入力された文字列内の !(感嘆符)を特別な意味を持つ文字として扱います。これは、以前に実行したコマンドの履歴を参照して、その一部を再利用するための機能で、Bashの履歴(ヒストリ)展開(History Expansion)と呼ばれます。
Bashではデフォルトで履歴展開が有効になっており、過去に入力したコマンドを簡単に再利用できます。
したがって、このエラーが発生したのは、「!」を文字列ではなく、特殊文字として認識してしまったために発生したと考えられます。
なお、過去に実行したコマンドのことを「イベント」と言うようです。
解決策1
シングルクォート(')を使用すること
シングルクォートで囲まれた文字列は、Bashによって一切解釈されず、リテラルの文字列として扱われます。
git commit -m 'refactor: Invert doesNotHaveSpace logic to use "!"'
解決策2
!の前にバックスラッシュ(\)を置いてエスケープする方法
git commit -m "refactor: Invert doesNotHaveSpace logic to use '\!'"
ダブルクォートでエラーになる理由
"(ダブルクォート)は、文字列内で変数展開($VAR)などを有効にする「弱いクォーティング」であるため、! のような他の特殊文字も、Bashのルールに従って(スペースがない場合などに)履歴展開として解釈されてしまうからです。
まとめ
「bash: !: event not found」は、Bashが持つ履歴(ヒストリ)展開という特殊機能によって引き起こされます。Bashは、入力された!を過去のコマンド(イベント)を呼び出すための特殊な合図だと誤って認識した結果、「有効な命令が見つからない」と判断してエラーを出力したことがわかります。
このエラーを回避するために、シングルクォートまたはエスケープすることが有効であることをまとめました。
最後までお読みいただき、ありがとうございました。
参考URL
Discussion