サブシェルからHISTFILEを生成する

サブシェルからHISTFILEを生成する

これは私の履歴ファイルです。

$ echo $HISTFILE
/home/Steven/.bash_history

出口を使用して作成できます。

$ [ -e $HISTFILE ]; echo $?
1

$ exit

$ [ -e $HISTFILE ]; echo $?
0

ただし、サブシェルを終了すると生成されません。

$ [ -e $HISTFILE ]; echo $?
1

$ (exit)

$ [ -e $HISTFILE ]; echo $?
1

サブシェルに履歴ファイルが生成されないのはなぜですか?

ベストアンサー1

Bash シェルを開くと、履歴ファイルの内容が渡されます。終了すると、履歴ファイルに履歴が追加されます。

同じターミナルウィンドウで別の(対話型)bashシェルを開き、いくつかのコマンドを実行するか、コマンドのみを実行すると、そのコマンドexit(またはコマンドのみexit)が履歴ファイルに追加されます。

ただし、非対話型サブシェルを実行すると、履歴がオフになり、環境変数がHISTFILE設定解除されます。

またはを実行して(bash -c 'echo x$HISTFILE')これを確認できますbash -c 'echo x$HISTFILE'。これはechoだけを実行し、x変数がHISTFILEサブシェルに設定されていないことを証明します。 (ちょうどxechoコマンドで目に見える出力を追加しました。)

bash -c(一重引用符を使用する理由は、親シェルでシェル変数の拡張を防ぐためです。runの場合、(echo x$HISTFILE)シェル変数の拡張は値をHISTFILEサブシェルに渡し、再エコーされてサブシェルにあったように見えます。)

したがって、サブシェルが実行されると、履歴はオフになり、変数は設定HISTFILE解除されます。サブシェルが終了すると、履歴には何も追加されません。これがまさにあなたが見るものです。

サブシェルが履歴ファイルに履歴を書き込むように強制できます。

$ history -w  # write current history
$ wc -l $HISTFILE  # count lines in history file
32 /home/anyuser/.bash_history

$ bash -c 'export HISTFILE=~/.bash_history'
$ wc -l $HISTFILE
32 /home/anyuser/.bash_history

$ bash -c 'export HISTFILE=~/.bash_history;history -w'
$ wc -l $HISTFILE
0 /home/anyuser/.bash_history 

最後のサブシェルコマンド(使用history -w)は、既存の履歴ファイルをサブシェルの履歴で上書きします。これは、非対話型サブシェルで履歴がオフになっているため空です。

おすすめ記事