
これは私の履歴ファイルです。
$ 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
サブシェルに設定されていないことを証明します。 (ちょうどx
echoコマンドで目に見える出力を追加しました。)
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
)は、既存の履歴ファイルをサブシェルの履歴で上書きします。これは、非対話型サブシェルで履歴がオフになっているため空です。