web-dev-qa-db-ja.com

Bashを使用してスクリーンセッションでコマンド履歴を取得するにはどうすればよいですか?

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

を使用して 、画面でも、最後に実行されたコマンドが表示されます。

20
hexacyanide

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

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

7
chepner

私のシステムではデフォルトの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
2
technosaurus

これを使用します:screen -Lと大文字のLは、端末の入出力のコピーをscreenlog.0という名前のファイルに保存します。または、-Sを使用して名前を付けた場合、ログファイルはスクリーン名を取得します。

1
mehrdad

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

1
Regisz

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

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

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

1
RaveTheTadpole

historyは、すべての履歴コマンドを表示します。

0