Bash:记录管道中两个命令执行之间的消息

Bash: log a message between execution of two commands in a pipeline

编辑:感谢您的所有回答。我现在明白我要的是废话

我有以下命令来下载和解压缩存档文件:

curl -fSL "$uri" | tar -xz

我想要的是在下载后显示一条消息,然后用 tar 解压下载的压缩包。

我知道可以将下载的存档保存到文件中,执行任何其他操作然后取消tar。但是是否可以在不保存到文件的情况下执行此操作?使用标准输入和标准输出?

您可以使用组 {}curl 完成后打印一些内容。要在终端中显示消息而不将其传递给 tar,我们可以通过任何未使用的文件描述符(此处为 3)路由它。

{ { curl -fSL "$uri"; echo "download complete" >&3; } | tar -xz; } 3>&1

由于 curltar 运行 并行,后者可能会在同一瞬间完成 download complete 打印。因此,一个简单的 curl -fSL "$uri" | tar -xz; echo "Everything done" 可能同样好。

在你的问题中你写了...

display a message after downloading and then unpack the downloaded archive

如果您真的想暂停 tar 直到下载完成,那么您可以使用 GNU moreutils 包中的 sponge。但是,这样做没有任何好处。

{ { curl -fSL "$uri"; echo "download complete" >&3; } | sponge | tar -xz; } 3>&1