その情報で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
予想通り正常な出力です。
grep
tmuxサーバーが死ぬと失敗するようです。次の奇妙な点を確認してください。
> 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/null
。tmux
使用可能なセッションがない場合、コマンドはエラーメッセージを出力しますが、そのメッセージには興味がありません。
答え2
tmux ls | grep -i "windows"
管路標準出力tmux ls
アイテムのメッセージが印刷されますgrep
。no 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の出力を表示する必要がない場合は、grep
s -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