我正在尝试从源脚本(即 my .bashrc
)在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
实际上是一个find
for files to source
,其中之一包含tmux
调用。)
我的假设是,因为正在消耗的输入read
来自于stdin
,从进程替换重定向,所以这会阻塞stdin
tmux。
我注意到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
,在这一点上,我将逐行迭代一个文件名文件,并解决所有涉及的问题。我目前能想到的最佳解决方案是使用, then-print0
上的标志来使用空分隔符......甚至更混乱!find
read -d$'\0'
(注意,我不能使用find
's ,-exec
因为我只想找到source
它找到的文件,出于显而易见的原因,这必须在父进程中完成。)
有没有一种“更好”的方式来安全地迭代文件,对source
他们来说,没有阻止stdin
或stdout
?