スクリプトで対話型シェル履歴拡張を使用する

スクリプトで対話型シェル履歴拡張を使用する

次のBashスクリプトがあります

set -o histexpand
set -o history
pwd
lc="!!"

対話型シェルで実行すると印刷されます。

/home/user
lc="pwd"

lc=pwd.をインポートする代わりに、履歴拡張を使用して対話型シェルで使用される最後のコマンドをインポートしたいと思います。したがって、私が実行すると、次のようになるecho foo; ./scriptと予想されます。

/home/user
lc="echo foo"

スクリプトで試しましたが、set -H成功しませんでした。

答え1

スクリプトを実行する前に、シェルセッションで実行されたコマンドを取得するためにシェルの履歴拡張を使用することは不可能です。ただし、呼び出すシェルが$HISTFILE各実行されたコマンドの後に履歴を保存し(bashデフォルトでは実行しない)、HISTFILE変数をエクスポートしない限り不可能です。それをする必要があります。

デフォルトでは、bashシェルは現在のインタラクティブシェルセッションのインメモリ記録を保持します。この履歴は、$HISTFILEシェルセッションの終了時に保存されます。コマンドライン履歴が有効になっている新しいセッションが開始されると、このファイルから保存された履歴が読み込まれます(新しいシェルが同じ値$HISTFILEを使用すると仮定)。

呼び出し環境から継承された変数がない限り、スクリプトはHISTFILE独自のセッションのコマンドライン履歴、つまりスクリプト内のコマンドにのみアクセスできます。エクスポートしたがHISTFILE呼び出しシェルがスクリプト$HISTFILEを実行する前に履歴を保存していない場合は、その親シェルセッションのメモリ内履歴を取得できず、アクセスできる最善の方法はセッションが死んでから古いことです。

関連情報