在读取循环中运行时 tmux 找不到 TTY

在读取循环中运行时 tmux 找不到 TTY

我正在尝试从源脚本(即 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" "$@")

(在我的实际中.bashrcprintf实际上是一个findfor files to source,其中之一包含tmux调用。)

我的假设是,因为正在消耗的输入read来自于stdin,从进程替换重定向,所以这会阻塞stdintmux。

我注意到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上的标志来使用空分隔符......甚至更混乱!findread -d$'\0'

(注意,我不能使用find's ,-exec因为我只想找到source它找到的文件,出于显而易见的原因,这必须在父进程中完成。)

有没有一种“更好”的方式来安全地迭代文件,对source他们来说,没有阻止stdinstdout

相关内容