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

问题描述

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

我有以下命令来下载和解压档案:

curl -fSL "$uri" | tar -xz

我想要的是在下载后显示一条消息,然后用 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" 可能同样好。

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

下载后显示一条消息然后解压下载的存档

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

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