目前,我正在使用一个需要通过终端连续输入的软件脚本。该脚本通过接收路径输入并评估路径中的文件。
目标:是否可以通过传递输入来运行需要输入的脚本另一个终端或脚本。
评估软件在准备处理之前会加载大量数据,这就是为什么我宁愿让软件保持运行,并时不时地传递输入。而不是启动软件并加载所需的所有数据(这需要时间)。
我可以说我曾尝试过终端找到:
$ /dev/pts/19
然后通过其他终端运行:
$ <command> <myinput> > /dev/pts/19
其中命令被替换为“echo / print”
但是,它只是在另一个终端上打印,并不作为软件的输入。
答案1
创建命名管道:
mkfifo pipe
确保它不会关闭(见这个答案):
exec 3<>pipe
从管道提供你的脚本:
<pipe your_script.sh
# or if you want to see incoming data
<pipe tee >(your_script.sh)
然后从另一个终端使用echo
,printf
或者其他任何方式:
echo "/some/path/or/another/input" > pipe
或者
cat large_input.txt > pipe
或者
script_that_generates_input.sh > pipe
但要小心竞争条件!不要同时从两个或多个源向管道提供数据;在运行下一个命令之前,请始终等待当前提供命令退出。请注意,如果一个源传递大量数据,则它可能会在中途被保留,直到接收方处理完数据。在任何提供命令被搁置之前,使用 put mbuffer
(带有适合您使用情况的参数)your_script.sh
创建一个可以存储更多传入数据的缓冲区。