次の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
を実行する前に履歴を保存していない場合は、その親シェルセッションのメモリ内履歴を取得できず、アクセスできる最善の方法はセッションが死んでから古いことです。