でスクリーンセッションを開始した場合screen -dmS name
、スクリプトを使用してそのスクリーンセッションのコマンド履歴にアクセスするにはどうすればよいですか?
を使用して↑</kbd>, the last executed command appears, even in screen.
でスクリーンセッションを開始した場合screen -dmS name
、スクリプトを使用してそのスクリーンセッションのコマンド履歴にアクセスするにはどうすればよいですか?
を使用して↑</kbd>, the last executed command appears, even in screen.
システムでデフォルトの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}"
screen
入力したコマンドの履歴は保持されません。シェルは履歴を保持する場合と保持しない場合があります。を使用しているように見えるのでbash
、コマンドを使用できますhistory
。
screen
履歴検索の大まかな概算があるように見えます(スクロールバックバッファでコマンドラインを検索するだけです。screen
「history」コマンド(C-a {
デフォルトでバインドされています)のマニュアルページを参照してください。
@テクノサウルスは正しいです。$ HISTFILEはbashの終了時に書き込まれるため、1つのbashセッションを終了して新しいセッションを開始でき、履歴はファイルを通じて保存されているはずです。
しかし、私はあなたの問題を解決するためのより良い方法があると思います。bashマニュアルには、history組み込みコマンドの説明が含まれています。これにより、この履歴をで保存し、で履歴history -w [filename]
を読み取ることができますhistory -r [filename]
。ファイル名を指定しない場合は、$HISTFILEが使用されます。
したがって、画面セッション内の履歴を特定のファイル(または必要に応じてデフォルトの$ HISTFILE)に保存することをお勧めします。次に、履歴にアクセスする他のbashセッションで履歴ファイルを読み取ります。このようにして、元のbashセッションを終了する必要はありません。
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 *)」の値を持つこの「case」があるので、「screen」の部分だけを追加しました。この「ケース」がない場合は、代わりに次を使用できます。
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では機能しません!
history
すべての履歴コマンドが表示されます。