tmux は、読み込みループで実行しているときに TTY を見つけることができません。

tmux は、読み込みループで実行しているときに TTY を見つけることができません。

.bashrcソーススクリプト(たとえば、my)のwhile readループ内でtmuxを実行しようとしています。ただし、これを行うと、tmuxはTTYを見つけることができず、次のエラーが発生します。

open terminal failed: not a terminal

どんなに偽物でも再現可能な最小限の例は次のとおりです。

while read -r _session; do
  tmux new-session -s "${_session}"
done < <(printf "%s\n" "$@")

(私の場合は.bashrc実際にはファイルのprintfファイルであり、そのうちの1つに呼び出しが含まれていました。)findsourcetmux

私の仮定は、消費される入力がプロセス内の代替リダイレクトからread来るため、これがtmuxをブロックしているということです。stdinstdin

ファイル記述子をパラメータとして渡すことができることを知り、readそれを使用して問題を解決しようとしました。

_tmp="$(mktemp)"
printf "%s\n" "$@" > "${_tmp}"

exec 3< "${_tmp}"
while read -ru 3 _session; do
  tmux new-session -s "${_session}"
done
exec 3<&-

これはうまくいきますが、本当に汚れています。しかし、おそらくもっと重要なことは、前述のように繰り返すことが出力です。findこの時点で、ファイル名ファイルを1行ずつ繰り返して、関連するすべての問題を解決します。現在私が考えることができる最善の解決策は、-print0フラグを使用してNull区切り記号を使用することです...これははるかに混乱しています!findread -d$'\0'

(私は見つけたファイルだけを探したいので、それをfind使用することはできません。これは明らかな理由で親プロセスで行う必要があります。)-execsource

ファイルを安全に繰り返す「より良い」方法はありますかsourceいいえブロックstdinまたはstdout

関連情報