screen -dmS name
でスクリーンセッションを開始した場合、スクリプトでそのスクリーンセッションのコマンド履歴にアクセスするにはどうすればよいですか?
を使用して ↑、画面でも、最後に実行されたコマンドが表示されます。
screen
は、入力したコマンドの履歴を保持しません。シェルは履歴を保持する場合としない場合があります。 bash
を使用しているように見えるので、history
コマンドを使用できます。
screen
は、履歴検索の大まかな近似を持っているように見えます(コマンドラインのスクロールバックバッファーを検索するだけです。「history」コマンドのscreen
のマニュアルページを参照してください(_C-a {
_(デフォルト)。
私のシステムではデフォルトのbashシェルを使用しているため、他のシェルでは動作しない可能性があります。
これが~/.screenrc
ファイルにあるので、新しい各画面ウィンドウは独自のコマンド履歴を取得します。
独自のコマンド履歴ファイルを持つ一連のデフォルトの画面ウィンドウを開くには、~/.screenrc
ファイルに以下を追加します。
screen -t "window 0" 0 bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
screen -t "window 1" 1 bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
screen -t "window 2" bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
デフォルトの画面設定では、Ctrl+a c
またはCtrl+a Ctrl+c
を使用して新しいウィンドウを作成します。ただし、上記の~/.screenrc
ファイルのみの場合、これらはデフォルトの~/.bash_history
ファイルを使用します。これを修正するために、新しいウィンドウを作成するためのキーバインディングを上書きします。これを~/.screenrc
ファイルに追加します。
bind c screen bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
bind ^C screen bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
これで、新しい画面ウィンドウを作成するたびに、実際にbashシェルが起動され、HISTFILE
環境変数が現在の画面ウィンドウの番号($WINDOW
)を含む何かに設定されます。
コマンド履歴ファイルは、同じウィンドウ番号のスクリーンセッション間で共有されます。
$HISTFILE
にコマンドを書き込む通常のbash動作と同様に、履歴は、シェル/画面ウィンドウを終了したときにのみ$HISTFILE
ファイルに書き込まれます。ただし、コマンドの実行後にコマンドを履歴ファイルに書き込み、同じウィンドウ番号の他の画面セッションですぐに使用できるようにする場合は、~/.bashrc
ファイルに次のようなものを追加できます。
export Prompt_COMMAND="history -a; history -c; history -r; ${Prompt_COMMAND}"
ターミナル(またはシェル)をexit
すると、シェルはその履歴を$ HISTFILEに書き込みます。そのため、別のターミナルでその履歴を取得するには、履歴を取得したいターミナルでexit
と入力します。書かれます。
cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it
これを使用します:screen -Lと大文字のLは、端末の入出力のコピーをscreenlog.0という名前のファイルに保存します。または、-Sを使用して名前を付けた場合、ログファイルはスクリーン名を取得します。
次の行を.bashrcに入れます。
case "$TERM" in
screen)
declare SCREEN_NAME=$(echo $STY | sed -nr 's/[^.]*\.(.*)/\1/p')
if [[ $SCREEN_NAME ]]; then
HISTFILE="${HISTFILE}.${SCREEN_NAME}.${WINDOW}"
declare -p HISTFILE
fi
unset SCREEN_NAME
;;
*)
;;
esac
デフォルトの.bashrcには、基本的に「xterm * | rxvt *)」の値を持つこの「ケース」があるため、「画面」の部分のみを追加しました。この「ケース」がない場合は、代わりに次を使用できます。
if [[ $TERM == screen ]]; then
declare SCREEN_NAME=$(echo $STY | sed -nr 's/[^.]*\.(.*)/\1/p')
if [[ $SCREEN_NAME ]]; then
HISTFILE="${HISTFILE}.${SCREEN_NAME}.${WINDOW}"
declare -p HISTFILE
fi
unset SCREEN_NAME
fi
そして、私は私のすべての画面のすべてのウィンドウの独自のbash_historyを取得した後。
注:これはchrootでは機能しません!
@technosaurusは正しいです。 $ HISTFILEはbashの終了時に書き込まれるため、1つのbashセッションを終了して新しいセッションを開始でき、履歴はファイルを通じて保持されているはずです。
しかし、私はあなたの問題を解決するより良い方法があると思います。 bashマニュアルには history組み込みコマンド の説明が含まれています。この履歴をhistory -w [filename]
で保存し、history -r [filename]
で履歴を読み取ることができます。ファイル名を指定しない場合、$ HISTFILEが使用されます。
そのため、スクリーンセッション内の履歴を特定のファイル(または必要に応じてデフォルトの$ HISTFILE)に保存することをお勧めします。次に、履歴にアクセスする他のbashセッションで履歴ファイルを読み取ります。これにより、元のbashセッションを終了する必要がなくなります。
history
は、すべての履歴コマンドを表示します。