tmuxサーバーが実行されていないと、tmux ls出力をgrepできません。

tmuxサーバーが実行されていないと、tmux ls出力をgrepできません。

その情報でzshプロンプトを更新できるように、tmuxサーバーが実行されていることを確認する方法を見つけたいと思います。

tmux サーバーが有効な場合

> tmux ls
0: 1 windows (created Sat Jul 10 13:47:36 2021) (attached)

では、出力をgrepできますか?

グレブ出力:

> tmux ls | grep -i "windows"
0: 1 windows (created Sat Jul 10 13:47:36 2021)

windows(私の場合)色redまたは端末の色の場合、コマンドは機能します。

この単語はwindows常に出力に表示されるため、この単語を選択しました。tmux ls

さて、サーバーがオフラインであることを確認してください。

tmuxサーバーをシャットダウンした後:

tmux kill-server

次に、次のコマンドを使用してサーバーがアクティブであることを確認します。tmux ls

> tmux ls
no server running on /tmp/tmux-1000/default

予想通り正常な出力です。

greptmuxサーバーが死ぬと失敗するようです。次の奇妙な点を確認してください。

> tmux ls | grep -i "windows"
no server running on /tmp/tmux-1000/default

exit codeコマンド:

> echo $?
1

failed出力を取得するgrepを意味します。

別のテストケースでは、奇妙な動作を示しています。

> tmux ls > file.txt
no server running on /tmp/tmux-1000/default

何を実行しても、常にno server ... bla bla画面に印刷されます。

ファイルをキャプチャするとき:

> cat file.txt

その情報でzshプロンプトを更新できるようにtmuxサーバーが実行されていることを確認するにはどうすればよいですか?

注:$TMUXセッションにいるかどうかは知りたくありませんが、すでにセッションにいるかどうかは知りたくないので、変数は私には役に立ちません。これは言葉ではありません。セッションに接続しているかどうかにかかわらず、サーバーがあるかどうかをalive知りたいです。dead

追加(zsh ユーザーのみ)

tmux サーバーの状態を zsh プロンプトに入れるには、次のような結果を得ます。 ここに画像の説明を入力してください。

これを得るには、.zshrc

function update_prompt_and_venv () {
  if tmux ls &> /dev/null; then
      tmux_server="%{$terminfo[bold]$fg[black]%}(%{$terminfo[bold]$fg[green]%}tmux%{$terminfo[bold]$fg[black]%}) "
  fi
  PROMPT="
$tmux_server ... $your_cwd
> "
}
precmd_functions+=(update_prompt_and_venv)

コンテンツ:

  • 端末でEnterキーを押すたびに呼び出される関数
  • tmux サーバーの状態に応じた変数
  • 機能アップデートのヒント
  • precmd_functions各入力コマンドの前に呼び出される関数を追加します。

サーバーのシャットダウン後にEnterキーを押すと、更新内容がすぐに表示されます。

答え1

あなたの混乱はtmux他のすべてのユーティリティと同様に、エラーメッセージやその他の診断メッセージ標準エラーストリーム以下ではなく標準出力ストリーム。リダイレクトを使用すると、>エラーメッセージではなく標準出力ストリームのみがリダイレクトされます。同様に、コマンド出力をパイプすると、エラーメッセージではなく標準出力ストリームのみがパイプされます。これは意図的に設計されています。

しかし、ここではgrep何もする必要はなく、代わりにtmux終了状態自体を調査することに頼ることができます。

セッションが存在するか(またはセッションが存在するかどうかを知らせるために存在するhas-sessionサブコマンドがあります)。tmux特定セッションが存在する):

has-session[ -t target-session]
(エイリアス: has)

指定されたセッションが存在しない場合、エラーが報告され、1で終了します。存在する場合は0で終了します。

これは、以下が利用可能であることを意味します。

if tmux has-session 2>/dev/null; then
    echo session exists
else
    echo no sessions
fi

これは特定の文字列の存在を調べることに依存し、tmux has-sessionコマンド出力を解析する必要はありません。

/dev/null我々はそれを破棄するために使用するためにエラーストリームをリダイレクトします2>/dev/nulltmux使用可能なセッションがない場合、コマンドはエラーメッセージを出力しますが、そのメッセージには興味がありません。

答え2

tmux ls | grep -i "windows"管路標準出力tmux lsアイテムのメッセージが印刷されますgrepno server running on /tmp/tmux-1000/default標準エラー、標準出力ではありません。

stdoutとstderrをgrepするには、stderrをstdoutと同じ場所にリダイレクトする必要があります。たとえば、

tmux ls 2>&1 | grep -i "windows"

またはstderrを次にリダイレクトします/dev/null

tmux ls 2>/dev/null | grep -i "windows"

しかし、実際にgrepの出力を表示する必要がない場合は、greps -q(または--quiet--silent)オプションを使用してgrepの終了コードを確認する必要があります。例えば

tmux ls 2>/dev/null | grep -i -q "windows"

if [ $? -eq 0 ] ; then
  echo "tmux is running for $USER"
else
  echo "tmux is not running for $USER"
fi

答え3

Unixでプログラムが起動すると、ハンドルなしで3つのファイルが開きます。STDIN STDOUT SDERR

リダイレクトは|通常、最初のプログラムのSTDOUTを2番目のプログラムのSTDINに送信します。 「実行中のサーバーなし」などのエラーはSTDERRに移動し、通常パイプまたは他のリダイレクトではなく端末で終了します。

STDOUTとSTDERRの両方をキャプチャするには、もう少し実行する必要があります。 bash、zsh、および最新のシェルでは、次のように動作します。

tmux ls |& grep...

以前のシェル(および現在のシェル)では、次のことを行う必要があります。

tmux ls 2>&1 | grep...

これは、シェルがSTDOUTにパイプを作成し、最初のコマンドを実行する前にSTDERRファイルハンドル(2)をSTDOUT(1)ファイルハンドルのコピーに置き換えるように指示します。ここでは、2>&1との順序|が重要です。

grepを含まないより簡単な代替方法は、実行してから出力tmux ls$?エラーを確認することです。これは他のtmuxエラーと区別できません。例えば

if ! tmux ls
then
    # do this when tmux errors
fi

関連情報