web-dev-qa-db-ja.com

!xが見つかりません-bashスクリプト

履歴内の一連のコマンドを実行する単純なbashスクリプトを作成しましたが、機能していません。

read -p "control + c to cancel"                                            
for i in $(seq $1 $2)                                                     
do                                                                         
  !${i}                                                                    
done

runrange 5 10のように実行すると、!5: command not foundが得られます。 !5を実行すると、正常に動作します!どうすれば修正できますか?

3
lol

Bashは、入力の 行を読み取った後の最初のもの として履歴展開を実行するため、変数を展開する前に発生します。 !$エキスパンド!${i}最後の引数を参照するために使用されます 前のコマンドの特別な場合の構文として。

履歴に保存されているコマンドを読み取る(または実行する)場合は、 history -p、またはfc

それとは別に、外部スクリプトから対話型シェルの履歴にアクセスすることはできず、スクリプト内でコマンドを繰り返すより簡単な方法があることに注意してください。

1
ilkkachu

スクリプトはbashの非対話型(そしてもちろん非ログイン)セッションで実行されています。非対話型のシェルセッションでは、履歴の展開はデフォルトで無効になっています。

スクリプトの先頭に追加する必要があります(Shebangの後):

  • set -o history履歴を有効にする
  • set -o histexpand(またはset -H) 有効にする !スタイル履歴置換

デフォルトでは非対話型セッションの履歴はメモリに保持され、セッションが終了するとフラッシュされるため、2つのオプションを選択しても実際の問題は解決されません。実際の問題は、これまでに入力したコマンドと非対話型セッションに参加する予定ですか?

アイデアを得るには、historyループの直前にforを追加します。

0
heemayl