コマンドでprintf "#!/bin/bash\n" > t
エラー(bash: !/bin/bash\n": event not found
)が発生しますが、上キーを押してもコマンドが呼び出されないため、修正できません。なぜそんなことですか?
printf "%s\n" '#!/bin/bash' >t
(私がここで試していることは、Bashを学ぶことを試み、bashの履歴が以前のコマンドをキャプチャできない理由を本当に理解したいと思うことによって達成できますprintf
。)
答え1
あなたが見つけたように、この!
キャラクターは歴史の拡大を引き起こします。このステップは、拡張が完了したときにコマンドを履歴に保存できるように、コマンドが履歴に保存される前に発生します。履歴拡張中にエラーが発生した場合、bashはコマンドの処理を停止するため、履歴には保存されません。
履歴拡張を使用すると、前のコマンドまたは前のコマンドの一部を現在のコマンドに置き換えることができます。コマンドを履歴に保存する前にこれを実行すると、前のコマンドがインスタンスごとに異なるため、実行されるたびに異なる意味を持つことができます。バラよりhttp://www.gnu.org/software/bash/manual/bashref.html#History-Interaction
ちなみにzsh
動作が異なります。コマンドを保存しますが、履歴拡張が不足しています。
答え2
bash: !": event not found
これは、インタラクティブシェルの場合、Bashは感嘆符を使用してcshスタイルの履歴拡張を実行するためです。これはシェルスクリプトでは問題ではありません。対話型シェルでのみ可能です。
最も簡単な解決策は、histexpandオプションを設定解除することです。これはset +H
またはを使用して実行できますset +o histexpand
。
これについてもっと読むことができます。Bash Pitfallsのウェブサイトから。