🎉

【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

https://stackoverflow.com/questions/22125658/how-can-i-escape-history-expansion-exclamation-mark-inside-a-double-quoted-str

https://qiita.com/anqooqie/items/785f46a8cc5f10ba7abb

Discussion