在bash脚本的文件中对wget命令运行exec会忽略wget选项

时间:2014-03-22 20:55:26

标签: bash exec wget

如果我运行这个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)

2 个答案:

答案 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)