22

でスクリーンセッションを開始した場合screen -dmS name、スクリプトを使用してそのスクリーンセッションのコマンド履歴にアクセスするにはどうすればよいですか?

を使用して↑</kbd>, the last executed command appears, even in screen.

4

7 に答える 7

26

システムでデフォルトの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}"
于 2014-02-12T02:48:32.410 に答える
7

screen入力したコマンドの履歴は保持されません。シェルは履歴を保持する場合と保持しない場合があります。を使用しているように見えるのでbash、コマンドを使用できますhistory

screen履歴検索の大まかな概算があるように見えます(スクロールバックバッファでコマンドラインを検索するだけです。screen「history」コマンド(C-a {デフォルトでバインドされています)のマニュアルページを参照してください。

于 2013-02-16T20:23:51.103 に答える
3

@テクノサウルスは正しいです。$ HISTFILEはbashの終了時に書き込まれるため、1つのbashセッションを終了して新しいセッションを開始でき、履歴はファイルを通じて保存されているはずです。

しかし、私はあなたの問題を解決するためのより良い方法があると思います。bashマニュアルには、history組み込みコマンドの説明が含まれています。これにより、この履歴をで保存し、で履歴history -w [filename]を読み取ることができますhistory -r [filename]。ファイル名を指定しない場合は、$HISTFILEが使用されます。

したがって、画面セッション内の履歴を特定のファイル(または必要に応じてデフォルトの$ HISTFILE)に保存することをお勧めします。次に、履歴にアクセスする他のbashセッションで履歴ファイルを読み取ります。このようにして、元のbashセッションを終了する必要はありません。

于 2013-08-08T16:48:10.197 に答える
2

exitターミナル(またはシェル)の場合、シェルはその履歴を$ HISTFILEに書き込むため、別のターミナルでその履歴を取得するには、履歴が必要なターミナルを入力するexitと、その履歴が書き込まれます。

cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it
于 2013-02-16T21:14:20.063 に答える
1

これを使用します。screen-Lと大文字のLは、端末の入力と出力のコピーをscreenlog.0という名前のファイルに保存します。または、-Sを使用して名前を付けると、ログファイルに画面名が付けられます。

于 2014-04-08T16:22:21.940 に答える
1

次の行を.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では機能しません!

于 2017-03-03T09:47:33.443 に答える
0

historyすべての履歴コマンドが表示されます。

于 2014-02-12T02:53:45.023 に答える