logo
Published on

Bash エクスクラメーション(!)を無効にする

Authors

Linuxパソコン・サーバーのBash言語において、コマンド、特殊文字として認識されてしまうエクスクラメーション(!)、つまり"ビックリマーク""びっくり記号"を無効化する方法について紹介します。

以前エクスクラメーションのエスケープについて書きました。

Bashで!(エクスクラメーション)をエスケープするには

単純なケースでは上記の方法はうまくいくのですが、クウォートで囲まれていたりするとエラーになります。

以下はエスケープできるケース

xsv select '!path' -d "\t" - <<< "$( awk '{print NR "\t" $s}' <<< "$( data-music-csv | removeEmptyLines )" )" | xsv sort --select rate -N -R | xsv search --select genre "${2:-".*"}" | xsv table | shuf | tail -1 | awk 1

以下はエラーになるケース

id="$( xsv select '!path' -d "\t" - <<< "$( awk '{print NR "\t" $s}' <<< "$( data-music-csv | removeEmptyLines )" )" | xsv sort --select rate -N -R | xsv search --select genre "${2:-".*"}" | xsv table | shuf | tail -1 | awk 1 )"

僕もどうやってこれをエスケープするのか全くわからないので、いっそ無効にしてしまいましょう。

set +H
https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_2baf49f9-7742-4931-889e-3489db8f675b.png
$ : !music
: music-random
$ set +H
$ : !music
$

これで!コマンドが使えなくなりました。普段常用してるから使えなくなるのは困るという場合はset -Hで戻せばいいですね。

以下でも書かれていますが、やっぱり!ってこわいですよね。rm -rf .とかが!rで実行されてしまうわけですから、危険すぎる。

quoting - Can't use exclamation mark (!) in bash? - Unix & Linux Stack Exchange