Bash端末で次のforループを実行すると:
for i in {1..5}; do echo $i; done
このecho
コマンドは現在シェルの履歴に追加されません。 for(do
一部)のコマンドがサブシェルで実行されるためですか?それでは、現在シェルで実行する方法はありますか?それともfor
当時は「実行中」だったので不可能ですか?
編集:forループ全体を1つの複合コマンドとして扱うことを考えると、forループを削除して個々のコマンドを5行に書き込むと、5つすべての履歴に追加する必要はありませんか?
私は次のことをしました。
#!/bin/bash
set -o history
var=5
echo $((var--))
echo $((var--))
echo $((var--))
echo $((var--))
echo $((var--))
実行スクリプトを使用してくださいsource
。それでも、歴史上、echo $((var--))
5つすべてではなく、1つのechoステートメントのみが表示されます。一方、5つの代わりに、、...コマンドを5つecho $((var--))
入れると、5つのコマンドがすべて履歴に追加されます。echo 5
echo 4
echo 1
なぜ?
ベストアンサー1
$HISTFILE
スクリプトを実行する前にエクスポートしないと、スクリプトは最初に ~/.bash_history に履歴を保存しません。言ったように、man bash
その理由は次のとおりです。
HISTFILEが設定されていない場合、または履歴ファイルに書き込めない場合、履歴は保存されません。
HISTFILE
環境変数ではなくシェル変数なので、子プロセスのスクリプトでは使用できません。このコマンドを実行しても
$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
(プロンプトの後のスペースに注意してください。)スクリプト以外の対話型セッションでは、実際には〜/ .bash_historyに保存されません。人気のあるLinuxディストリビューション(Ubuntuなど)では、これをor(およびのエイリアス)HISTCONTROL
に設定してコマンドを保存するためです。 notのために1つ以上のスペースで始まります。これは、他のユーザーと共有サーバーで作業し、特定のコマンドが他の人に表示されるように意図的に履歴に保存したくない場合(たとえば、そのコマンドにパスワードやその他の機密情報が含まれているため)に特に便利です。ignorespace
ignoreboth
ignorespace
ignoredups
ただし、コマンドの前にスペースがない場合でも、次のようになります。
$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
通常、前述のecho $((var--))
ように〜/.bash_historyには1つのエントリしか残りません。これらのすべては、システムから呼び出すことができるセクションのBashのマンページに記載されています。HISTCONTROL
ignoredups
ignoreboth
HISTCONTROL
man bash