管道 B 到 D?- A && B || C | D

Phi*_*ide 14 bash pipe

有没有办法重新编写命令结构,A && B || C | D以便将 B 或 C 通过管道传输到 D?

对于当前命令,只有 B 或 C 和 D 都运行。

例如:

在此处输入图片说明

uto*_*und 31

是的,在 bash 中你可以使用括号:

(A && B || C) | D
Run Code Online (Sandbox Code Playgroud)

这样, 的输出A && B || C将通过管道传输到D.

  • 或`A && (B || C) | D`,如果您不希望 B、C 或 D 在 A 失败时运行 (6认同)
  • 你也可以在 `sh` 中使用括号:) (2认同)

hvd*_*hvd 15

你可以这样写

if A; then B; else C; fi | D
Run Code Online (Sandbox Code Playgroud)

你说你想运行BC,但A && B || C没有实现。如果A成功,但B运行并失败,它将执行C

注 1:如果你能以某种方式保证B总是成功并想坚持使用简短的版本,那么我仍然会选择

{ A && B || C; } | D
Run Code Online (Sandbox Code Playgroud)

over ( ... ),因为后者不必要地强制创建一个新的子shell,它可能会也可能不会被优化掉。

注 2:两种形式都假定不A产生输出,这在您的示例中是正确的,但一般情况下不一定如此。这可以避免

A; if [ "$?" -eq 0 ]; then B; else C; fi | D
Run Code Online (Sandbox Code Playgroud)


Dav*_*ter 6

接受者的答案是正确的,但它没有涵盖将 的输出A作为 的输入的潜在用例D。为了实现这一点,您需要A根据您的需要进行流重定向。


如果这一切对你来说太神秘了(就像对我一样),我建议你使用特殊的 shell 变量来确定退出状态A并使用它:

A
if [ $? -eq 0 ]; then
  B
else
  C
fi |
D
Run Code Online (Sandbox Code Playgroud)

如果你想更简洁但又不太神秘,我建议这样做:

A; { [ $? -eq 0 ] && B || C; } | D
Run Code Online (Sandbox Code Playgroud)

(另请参阅hvd 答案的最后一部分,我在写原始答案时没有注意到。)