从 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 选项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bash 脚本中的密码运行 sftp 命令?

无法从 WSL bash 中的批处理文件运行 Homebrew 应用程序(找不到命令)

无法从 BASH 脚本中运行 psql 命令

从 bash 脚本运行多个命令而不会失去控制

在bash中对所有最近修改过的文件运行脚本

简化bash脚本,以sudo身份运行时从命令中提取第一个单词