在后台将脚本标准输入重定向到文件

在后台将脚本标准输入重定向到文件

为了将脚本的标准输入传递到它生成的 alacritty 实例中命令的标准输入,我尝试将其重定向到后台的文件(以便命令可以开始读取它):

t="$(mktemp --directory)"
in="$t/in"
#mkfifo "$in"
out="$t/out"
#mkfifo "$out"

cat - 3>"$in" >&3 &
alacritty -e /bin/sh -c "cat '$in' | {...} > '$out'" >&2

cat "$out"

正如您所看到的,我尝试将其设为命名管道,并使用 fd3 认为问题可能是后台进程无法获取“stdin”文件描述符的某种特殊外壳。

如果不清楚,尝试的原因是输入可能足够大,我想在...不等待 EOF 的情况下启动进程。

我可能把这一切都搞错了 - 有没有办法将“我的”文件描述符“重新分配”给 alacritty 启动的 shell?这是我的第一个想法,但我找不到任何关于从 shell 传递文件描述符的内容,只有 C(等)指针。

答案1

cat - 3>"$in" >&3 &

如果您从脚本运行它,cat则 的 stdin 将从 重定向/dev/null

如果你从交互式 shell 运行它,cat它将被信号停止SIGTTIN

无论如何,它不会向"$in"管道写入任何内容。

如果这是脚本的一部分,“解决方案”(加引号,因为我不太清楚你要做什么)是通过重定向“保存”标准输入exec [fd]<&0,然后从该标准输入重定向后台进程的输入[fd]。比较:

echo yes | sh -c 'cat & sleep 1'

它不会向标准输出写入任何内容,

echo yes | sh -c 'exec 5<&0; cat <&5 & sleep 1'

就可以了。

相关内容