このコマンドはecho !"
エラーメッセージを返します。しかし、コマンドはecho "Hello!"
成功しました。コマンドが正しく使用されましたかecho "Hello!"
?
答え1
Bashを実行していると仮定すると、!
トリガーは歴史的拡張。オンになっていて、たとえばを書くと、で始まる!echo
最後のコマンドに置き換えられますecho
。この機能はもともとcshで提供されており、他のシェルでそれをサポートしているかどうかはわかりません。
履歴拡張は最もスマートな機能ではありません。たとえば、!"
常に失敗しているように見えても、これをトリガーします(実行して"echo" foo
から試しても!"
失敗します)。迷惑なことに、inなどの内部二重引用符もトリガーされますecho "!hello"
。 Bash 3.2でもecho "hello!"
トリガーされましたが、新しいバージョンではこれが変更されたようです。
私の提案はそれをオフにしてBashのスタートアップファイルにset +o histexpand
入れることです。set +H