如何将多个命令通过管道传输到 bash?

how to pipe multi commands to bash?

我想检查远程网站上的一些文件。

这里是bash命令生成计算文件md5

的命令
[root]# head -n 3 zrcpathAll | awk '{print }' | xargs -I {} echo wget -q -O - -i {}e \| md5sum\;
wget -q -O - -i https://example.com/zrc/3d2f0e76e04444f4ec456ef9f11289ec.zrce | md5sum;
wget -q -O - -i https://example.com/zrc/e1bd7171263adb95fb6f732864ceb556.zrce | md5sum;
wget -q -O - -i https://example.com/zrc/5300b80d194f677226c4dc6e17ba3b85.zrce | md5sum;

然后我将输出的命令传送到 bash,但只执行了第一个命令。

[root]# head -n 3 zrcpathAll | awk '{print }' | xargs -I {} echo wget -q -O - -i {}e \| md5sum\; | bash -v
wget -q -O - -i https://example.com/zrc/3d2f0e76e04444f4ec456ef9f11289ec.zrce | md5sum;
3d2f0e76e04444f4ec456ef9f11289ec  -
[root]#

请您尝试以下方法:

while read -r _ _ url _; do
    wget -q -O - "$url"e | md5sum
done < <(head -n 3 zrcpathAll)

我们不应该把 -i 放在 "$url" 前面。

[关于-i选项的解释]

wget 的联机帮助页说:

-i file
--input-file=file
Read URLs from a local or external file. [snip]
If this function is used, no URLs need be present on the command line. [snip]
If the file is an external one, the document will be automatically treated as html if the Content-Type matches text/html. Furthermore, the file's location will be implicitly used as base href if none was specified.

其中 file 将包含 url 行,例如:

https://example.com/zrc/3d2f0e76e04444f4ec456ef9f11289ec.zrce
https://example.com/zrc/e1bd7171263adb95fb6f732864ceb556.zrce
https://example.com/zrc/5300b80d194f677226c4dc6e17ba3b85.zrce

而如果我们首先使用选项 -i urlwgeturl 下载为包含 url 行的文件 如上。在我们的例子中,url 是下载自身的目标, 不是 url 的列表,wget 导致错误:No URLs found in url.

即使wget失败,为什么命令只输出一行,而不是 md5sum 的结果是三行? 这似乎是因为 head 命令立即刷新了剩余的 管道子进程失败时的行。