スクリプトの標準出力をtmuxセッションで実行される他のスクリプト/コマンドの標準入力にリダイレクトする

スクリプトの標準出力をtmuxセッションで実行される他のスクリプト/コマンドの標準入力にリダイレクトする

適応中です。マーカス・ミュラーの答え 先週質問しました。標準出力をtmuxセッションにリダイレクトしてANSIエスケープシーケンスをレンダリングし、ウィンドウレンダリングをスクリプトの実際の出力にキャプチャするスクリプト。 stdoutで直接印刷して同じ結果を得ることができるので、まったく役に立たないことを知っています。ただし、これはより複雑な解釈を通じてコードをより大きなプロジェクトにインポートするためのデモであり、次の機能が必要です。

#!/bin/zsh

tmpdir="$(mktemp -d)"
fifo="${tmpdir}/fifo"
mkfifo "$fifo"
tmux new-session -d -s aux "while true; do cat ${fifo}; done"

exec 3>&1 1>"$fifo"


echo foo
echo bar
tput home
echo -n b

exec 1>&3 3>&-

tmux capture-pane -t "aux" -p -S0 -E1
tmux kill-session -t aux
rm -rf $tmpdir

出力は次のようになります(そしてそれが必要です)。

boo
bar

コードの簡素化に興味があります。メンテナンスが必要なFIFOの代わりに使用できるstdinリダイレクトに関連するトリックはありますか? 1行の方法ですべてのコンテンツを印刷し続け、完了したらセッションを自動的に閉じることができますか?

tmuxパイプウィンドウ、バッファ、トランスポートキー、実行シェルを試しましたが、うまくいきませんでした。特に、コマンド/スクリプトを実行するスクリプトのstdinではなく、コンソールにコマンドを作成するのと同じように、セッションがstdinを使用する場合

なんとか単純化しなければならないような感じがします。

ベストアンサー1

メンテナンスが必要なFIFOの代わりに使用できるstdinリダイレクトに関連するトリックはありますか?

新しいセッションに割り当てられたユニークウィンドウのユニークウィンドウの内容を尋ねますtmuxttyその後、印刷します。

#!/bin/zsh

tmux new-session -d -s aux 'tail -f /dev/null' || exit 1
tty="$(tmux display-message -p -t aux -F '#{pane_tty}')"

{
  echo foo
  echo bar
  TERM=tmux tput home
  echo -n b
} > "$tty"

tmux capture-pane -t aux -p -S0 -E1
tmux kill-session -t aux

tmux display-message -p一般的に言えば、それから情報を得ることは非常に便利です。あなたの場合はttyに関する情報を直接得ることができ、tmux new-sessionその変数は必要ありませんtty。リダイレクトを設定するために、次の準備手順を実行する必要はありません。

{...} >"$(tmux new-session -d -s aux -P -F '#{pane_tty}' 'tail -f /dev/null')" || exit

注はtail -f /dev/nulltmuxウィンドウを「アクティブ」に保つためのコマンドです。スクリプトはコマンドに何も送信しようとしませんが、正しいttyに印刷します。この回答は、タイトル(「tmuxセッション内で実行される他のスクリプト/コマンドの標準入力へのスクリプトの標準出力リダイレクト」)には対応していませんが、必要な機能を提供します。

おすすめ記事