Bash for Loop - ループのコマンドをシェル履歴に追加できますか?

Bash for Loop - ループのコマンドをシェル履歴に追加できますか?

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 5echo 4echo 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つ以上のスペースで始まります。これは、他のユーザーと共有サーバーで作業し、特定のコマンドが他の人に表示されるように意図的に履歴に保存したくない場合(たとえば、そのコマンドにパスワードやその他の機密情報が含まれているため)に特に便利です。ignorespaceignorebothignorespaceignoredups

ただし、コマンドの前にスペースがない場合でも、次のようになります。

$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))

通常、前述のecho $((var--)) ように〜/.bash_historyには1つのエントリしか残りません。これらのすべては、システムから呼び出すことができるセクションのBashのマンページに記載されています。HISTCONTROLignoredupsignorebothHISTCONTROLman bash

おすすめ記事