从 bash 脚本对文件中的 wget 命令运行 exec 会忽略 wget 选项
Posted
技术标签:
【中文标题】从 bash 脚本对文件中的 wget 命令运行 exec 会忽略 wget 选项【英文标题】:Running exec on wget commands in a file from bash script ignores wget options 【发布时间】:2014-03-22 20:55:25 【问题描述】:如果我运行这个 shell 脚本,我会得到 exec 导致 wget 表现得愚蠢。
echo "wget http://www.google.com/ -O - >> output.html" > /tmp/mytext
while read line
do
exec $line
done < /tmp/mytext
它就像 wget 在三个不同的 url 上运行
wget http://www.google.com/ -O -
wget >>
wget output.html
第一个命令将输出输出到 STDOUT,接下来的两个 wget 命令失败,因为它们是无意义的。
如何让 exec 正常工作?
我使用 exec 而不是简单地在文件上调用 bash,因为如果我在大量 wget 调用上使用 exec,我会产生多个 wget 进程。简单地对具有大量 url 列表的文件调用 bash 会很慢,因为它会等待一个 wget 操作完成,然后再进行下一个操作。
版本: 基于 linux-gnu 构建的 GNU Wget 1.15。 GNU bash,版本 4.3.0(1)-release (i686-pc-linux-gnu)
【问题讨论】:
【参考方案1】:我使用 exec 而不是简单地在文件上调用 bash,因为如果我 在大量 wget 调用上使用 exec 我得到了多个 wget 进程产生。
没有。当exec
被调用时,它不会产生一个新进程。它替换现有流程。详情请见man bash
。
对具有大量 url 列表的文件简单地调用 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.
【讨论】:
我觉得自己很傻。我不知道为什么我要寻找一个比仅仅支持 wget 操作更奢侈的解决方案。谢谢!【参考方案2】:我认为,你可以使用
exec $(cat /tmp/mytext)
【讨论】:
我刚刚对其进行了测试,它的行为方式与 wget 的行为方式相同,就好像有三个输入一样。以上是关于从 bash 脚本对文件中的 wget 命令运行 exec 会忽略 wget 选项的主要内容,如果未能解决你的问题,请参考以下文章