履歴内の一連のコマンドを実行する単純なbashスクリプトを作成しましたが、機能していません。
read -p "control + c to cancel"
for i in $(seq $1 $2)
do
!${i}
done
runrange 5 10
のように実行すると、!5: command not found
が得られます。 !5
を実行すると、正常に動作します!どうすれば修正できますか?
Bashは、入力の 行を読み取った後の最初のもの として履歴展開を実行するため、変数を展開する前に発生します。 !$
エキスパンド!${i}
最後の引数を参照するために使用されます 前のコマンドの特別な場合の構文として。
履歴に保存されているコマンドを読み取る(または実行する)場合は、 history -p
、またはfc
。
それとは別に、外部スクリプトから対話型シェルの履歴にアクセスすることはできず、スクリプト内でコマンドを繰り返すより簡単な方法があることに注意してください。
スクリプトはbash
の非対話型(そしてもちろん非ログイン)セッションで実行されています。非対話型のシェルセッションでは、履歴の展開はデフォルトで無効になっています。
スクリプトの先頭に追加する必要があります(Shebangの後):
set -o history
履歴を有効にするset -o histexpand
(またはset -H
) 有効にする !
スタイル履歴置換デフォルトでは非対話型セッションの履歴はメモリに保持され、セッションが終了するとフラッシュされるため、2つのオプションを選択しても実際の問題は解決されません。実際の問題は、これまでに入力したコマンドと非対話型セッションに参加する予定ですか?
アイデアを得るには、history
ループの直前にfor
を追加します。