如果我运行这个shell脚本,我会得到exec导致wget行为愚蠢。
echo "wget http://www.google.com/ -O - >> output.html" > /tmp/mytext
while read line
do
exec $line
done < /tmp/mytext
就像wget在三个不同的网址上运行一样
wget http://www.google.com/ -O -
wget >>
wget output.html
第一个命令将输出吐出到STDOUT,接下来的两个wget命令失败,因为它们是无意义的。
如何让exec正常工作?
我正在使用exec而不是简单地在文件上调用bash,因为如果我在一个大的wget调用列表上使用exec,我会得到多个wget进程。简单地在带有大量网址列表的文件上调用bash是很慢的,因为它等待一个wget操作完成后再移动到下一个网页。
版本: GNU Wget 1.15构建于linux-gnu之上。 GNU bash,版本4.3.0(1)-release(i686-pc-linux-gnu)
答案 0 :(得分:1)
我正在使用exec而不是简单地在文件上调用bash,因为如果我 在大量的wget调用中使用exec我得到多个wget 产生过程。
没有。调用exec
时,它不会生成新进程。它取代现有流程。有关详细信息,请参阅man bash
。
简单地在带有大量网址列表的文件上调用bash的速度很慢 等待一个wget操作完成后再移动到下一个 之一。
真。幸运的是,有一个解决方案。要并行运行大量进程,请在后台运行它们。例如,要并行运行多个wget
进程,请使用:
while read url
do
wget "$url" -O - >> output.html &
done <list_of_urls
该行末尾的&符导致该命令在后台与其他所有内容并行运行。上面的代码将尽可能快地启动新的wget
进程。这些过程将持续到完成为止。
您可以在命令提示符下非常简单地尝试这个想法。运行
sleep 10s
并且您的命令提示符将消失10秒钟。但是,运行:
sleep 10s &
,当sleep
在后台运行时,您的命令提示符将立即返回。
man bash
解释说:
If a command is terminated by the control operator &, the shell executes the command in the background in a subshell. The shell does not wait for the command to finish, and the return status is 0.
答案 1 :(得分:0)
我想,您可以使用
exec $(cat /tmp/mytext)