.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つに呼び出しが含まれていました。)find
source
tmux
私の仮定は、消費される入力がプロセス内の代替リダイレクトからread
来るため、これがtmuxをブロックしているということです。stdin
stdin
ファイル記述子をパラメータとして渡すことができることを知り、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区切り記号を使用することです...これははるかに混乱しています!find
read -d$'\0'
(私は見つけたファイルだけを探したいので、それをfind
使用することはできません。これは明らかな理由で親プロセスで行う必要があります。)-exec
source
ファイルを安全に繰り返す「より良い」方法はありますかsource
?いいえブロックstdin
またはstdout
?