Bash 如果标准输入为空,如何断开管道?

Bash 如果标准输入为空,如何断开管道?,bash,shell,pipe,xargs,tee,Bash,Shell,Pipe,Xargs,Tee,如果stdin是空的,我想把整根管子打破。我尝试将xargs-r和tee结合起来,这意味着如果stdin为空,则不打印和写入,但失败了 。|上游命令| xargs-r tee output.txt |下游命令|… 感谢您的反馈。如果命令失败,管道将破裂。您可以在两者之间添加grep来实现这一点。例如: $ echo ok | awk '{print $0,"1"}' | awk '{print $0,"2"}' | awk '{print $0,"

如果stdin是空的,我想把整根管子打破。我尝试将xargs-r和tee结合起来,这意味着如果stdin为空,则不打印和写入,但失败了

。|上游命令| xargs-r tee output.txt |下游命令|…


感谢您的反馈。

如果命令失败,管道将破裂。您可以在两者之间添加grep来实现这一点。例如:

$ echo ok | awk '{print $0,"1"}' | awk '{print $0,"2"}' | awk '{print $0,"3"}'
ok 1 2 3
现在添加grep:

$ echo ok | grep -Ei '^.+$' | awk '{print $0,"1"}' | awk '{print $0,"2"}' | awk '{print $0,"3"}'
ok 1 2 3
并测试空回波:

$ echo | awk '{print $0,"1"}' | awk '{print $0,"2"}' | awk '{print $0,"3"}'
 1 2 3

$ echo | grep -Ei '^.+$' | awk '{print $0,"1"}' | awk '{print $0,"2"}' | awk '{print $0,"3"}'
看起来这是可行的,但实际上没有,有趣的是,obvy管道不适合这里,请尝试以下方法:

#!/bin/bash
set -x

fun(){
    data=$(echo "$1"); [[ $data ]] && data=$(awk '{print $0,1}' <<< "$data") || return 1; [[ $data ]] && data=$(awk '{print $0,2}' <<< "$data") || return 1; [[ $data ]] && data=$(awk '{print $0,3}' <<< "$data") || return 1; echo "$data"
}

fun ok
fun
更具可读性的变体:

#!/bin/bash
set -x

fun(){
        data=$(echo "$1")
    [[ $data ]] && data=$(awk '{print $0,1}' <<< "$data") || return 1
    [[ $data ]] && data=$(awk '{print $0,2}' <<< "$data") || return 1
    [[ $data ]] && data=$(awk '{print $0,3}' <<< "$data") || return 1
        echo     "$data"
}

fun ok
fun
#/bin/bash
集合x
乐趣{
数据=$(回显“$1”)

[[$data]]&&data=$(awk'{print$0,1}'如果命令失败,管道将断开。您可以在两者之间添加grep来实现此目的。示例:

$ echo ok | awk '{print $0,"1"}' | awk '{print $0,"2"}' | awk '{print $0,"3"}'
ok 1 2 3
现在添加grep:

$ echo ok | grep -Ei '^.+$' | awk '{print $0,"1"}' | awk '{print $0,"2"}' | awk '{print $0,"3"}'
ok 1 2 3
并测试空回波:

$ echo | awk '{print $0,"1"}' | awk '{print $0,"2"}' | awk '{print $0,"3"}'
 1 2 3

$ echo | grep -Ei '^.+$' | awk '{print $0,"1"}' | awk '{print $0,"2"}' | awk '{print $0,"3"}'
看起来这是可行的,但实际上没有,有趣的是,obvy管道不适合这里,请尝试以下方法:

#!/bin/bash
set -x

fun(){
    data=$(echo "$1"); [[ $data ]] && data=$(awk '{print $0,1}' <<< "$data") || return 1; [[ $data ]] && data=$(awk '{print $0,2}' <<< "$data") || return 1; [[ $data ]] && data=$(awk '{print $0,3}' <<< "$data") || return 1; echo "$data"
}

fun ok
fun
更具可读性的变体:

#!/bin/bash
set -x

fun(){
        data=$(echo "$1")
    [[ $data ]] && data=$(awk '{print $0,1}' <<< "$data") || return 1
    [[ $data ]] && data=$(awk '{print $0,2}' <<< "$data") || return 1
    [[ $data ]] && data=$(awk '{print $0,3}' <<< "$data") || return 1
        echo     "$data"
}

fun ok
fun
!/bin/bash
集合x
乐趣{
数据=$(回显“$1”)

[$data]]&&data=$(awk'{print$0,1}“实际上无法有条件地终止bash管道。管道中的所有命令都是同时启动的。但是,有一个工具可以帮助您创建条件管道。在
moreutils
中,您可以找到工具
ifne
,该工具在且仅在输入
/de>时执行命令v/stdin
不是空的。因此您可以编写如下内容:

$ command1 | ifne command2 | ifne command3 | ifne command4

在这里,所有命令
ifne
command1
都是同时启动的。只有
ifne
通过
/dev/stdin
接收输入,它才会启动相应的
commandx

,实际上无法有条件地终止bash管道。管道中的所有命令都是同时启动的然而,e是一个可以帮助您创建条件管道的工具。在
moreutils
中,您可以找到工具
ifne
,该工具在且仅当输入
/dev/stdin
不为空时才执行命令。因此,您可以编写如下内容:

$ command1 | ifne command2 | ifne command3 | ifne command4

这里所有的命令
ifne
command1
都是同时启动的。只有
ifne
通过
/dev/stdin
接收到输入,它才会启动各自的
commandx

,这并没有破坏管道,它仍然执行每个命令。我们的想法是不执行commands@kvantour说,实际上我是ant在最后一个stdout为空时中断以下命令,以避免在循环中通过tee生成大量空文件。这不会中断管道,它仍会执行每个命令。其想法不是执行命令。@kvantour说,实际上,如果最后一个stdout为空,我想中断以下命令,以避免出现错误按循环中的tee对大量空文件进行分级。相关:相关: