【发布时间】:2015-05-14 20:46:45
【问题描述】:
我有一个调用另一个 TCL 脚本的多个实例的 bash 脚本 (this_script.sh)。
set -m
for vars in $( cat vars.txt );
do
exec tclsh8.5 the_script.tcl "$vars" &
done
while [ 1 ]; do fg 2> /dev/null; [ $? == 1 ] && break; done
多线程部分取自 Aleksandr 的回答:Forking / Multi-Threaded Processes | Bash。
该脚本运行良好(仍在尝试找出最后一行)。但是,这条线总是显示:exec tclsh8.5 the_script.tcl "$vars"
如何隐藏该行?我尝试将脚本运行为:
bash this_script.sh > /dev/null
但这也隐藏了调用的 tcl 脚本的输出(我需要 TCL 脚本的输出)。
我尝试将 /dev/null 添加到 for 语句中的语句末尾,但这也不起作用。基本上,我试图隐藏命令而不是输出。
【问题讨论】:
-
你为什么不改用
wait? -
for vars in $(<vars.txt)?< vars.txt while read -r vars? -
作为
wait的替代品,您可以使用GNU parallel 甚至只使用xargs来并行运行。 (顺便说一句,这不是多线程,它只是多个进程。) -
exec在这里为您做什么?从这样的文件中读取值是不安全的 (mywiki.wooledge.org/DontReadLinesWithFor)。那条线在哪里显示?流程何时结束? -
脚本一启动,就会显示该行。如果我不使用 exec,那么这仍然显示:
tclsh8.5 the_script.tcl "$vars"