有没有办法重新编写命令结构,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
.
hvd*_*hvd 15
你可以这样写
if A; then B; else C; fi | D
Run Code Online (Sandbox Code Playgroud)
你说你想运行B
或C
,但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)
接受者的答案是正确的,但它没有涵盖不将 的输出A
作为 的输入的潜在用例D
。为了实现这一点,您需要A
根据您的需要进行流重定向。
如果您想丢弃任何输出A
:
{ A >/dev/null && B || C; } | D
Run Code Online (Sandbox Code Playgroud)如果你想A
在终端上看到输出:
{ A >/dev/tty && B || C; } | D
Run Code Online (Sandbox Code Playgroud)如果需要将 的输出A
作为后续命令的输入,则E
需要额外的命令组和流重定向:
{ { A >&3 && B || C; } | D; } 3>&1 | E
Run Code Online (Sandbox Code Playgroud)如果这一切对你来说太神秘了(就像对我一样),我建议你使用特殊的 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 答案的最后一部分,我在写原始答案时没有注意到。)
归档时间: |
|
查看次数: |
4657 次 |
最近记录: |