为了将脚本的标准输入传递到它生成的 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'
就可以了。