Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash脚本:如何在管道中保存第一个命令的返回值?_Bash_Return Value_Pipeline - Fatal编程技术网

bash脚本:如何在管道中保存第一个命令的返回值?

bash脚本:如何在管道中保存第一个命令的返回值?,bash,return-value,pipeline,Bash,Return Value,Pipeline,Bash:我想运行一个命令并通过一些过滤器传递结果,但是如果命令失败,我想返回命令的错误值,而不是过滤器的无聊返回值: 例如: 或: 无论哪种情况,我关心的都是cool_command的返回值——第一种情况是“if”条件,第二种情况是退出脚本 是否有一些干净的习惯用法来执行此操作?如果不需要显示命令的错误输出,可以执行以下操作 if ! echo | mysql $dbcreds mysql; then error "Could not connect to MySQL. Did you

Bash:我想运行一个命令并通过一些过滤器传递结果,但是如果命令失败,我想返回命令的错误值,而不是过滤器的无聊返回值:

例如:

或:

无论哪种情况,我关心的都是
cool_command
的返回值——第一种情况是“if”条件,第二种情况是退出脚本


是否有一些干净的习惯用法来执行此操作?

如果不需要显示命令的错误输出,可以执行以下操作

if ! echo | mysql $dbcreds mysql; then
    error "Could not connect to MySQL. Did you forget to add '--db-user=' or '--db-password='?"
    die "Check your credentials or ensure server is running with /etc/init.d/mysqld status"
fi
在本例中,error和die是定义的函数。在脚本的其他地方$dbcreds也被定义,尽管它是从命令行选项构建的。如果命令没有生成错误,则不会返回任何内容。如果发生错误,此特定命令将返回文本

如果我错了,请纠正我,但我觉得你真的想做一些比这更复杂的事情

[ `id -u` -eq '0' ] || die "Must be run as root!"
在这里,您实际上在if语句之前获取用户ID,然后执行测试。这样做,如果您选择,您可以显示结果。这将是

UID=`id -u`
if [ $UID -eq '0' ]; then
    echo "User is root"
else
    echo "User is not root"
    exit 1 ##set an exit code higher than 0 if you're exiting because of an error
fi

使用
PIPESTATUS
内置变量

manbash

管道状态

数组变量(请参见数组) 下面)包含退出列表 中进程的状态值 最近执行的前台 管道(可能只包含一个 单一命令)


以下脚本使用fifo在单独的进程中过滤输出。与其他答案相比,这有以下优点。首先,它不是特定于bash的。特别是,它不依赖于管道状态。其次,在命令完成之前,输出不会停止

$ cat >test_filter.sh <<EOF
#!/bin/sh

cmd()
{  
    echo $1
    echo $2 >&2
    return $3
}

filter()
{  
    while read line
    do     
            echo "... $line"
    done
}

tmpdir=$(mktemp -d)
fifo="$tmpdir"/out
mkfifo "$fifo"

filter <"$fifo" &
pid=$!
cmd a b 10 >"$fifo" 2>&1
ret=$?
wait $pid
echo exit code: $ret
rm -f "$fifo"
rmdir "$tmpdir"
EOF
$ sh ./test_filter.sh
... a
... b
exit code: 10
$cat>测试过滤器.sh&1
ret=$?
等等,$pid
回显退出代码:$ret
rm-f“$fifo”
rmdir“$tmpdir”
EOF
$sh./test_filter.sh
... A.
... B
出境代码:10

只需完成回答,
[${PIPESTATUS[0]}-ne 0]]&处理错误
UID=`id -u`
if [ $UID -eq '0' ]; then
    echo "User is root"
else
    echo "User is not root"
    exit 1 ##set an exit code higher than 0 if you're exiting because of an error
fi
$ cat >test_filter.sh <<EOF
#!/bin/sh

cmd()
{  
    echo $1
    echo $2 >&2
    return $3
}

filter()
{  
    while read line
    do     
            echo "... $line"
    done
}

tmpdir=$(mktemp -d)
fifo="$tmpdir"/out
mkfifo "$fifo"

filter <"$fifo" &
pid=$!
cmd a b 10 >"$fifo" 2>&1
ret=$?
wait $pid
echo exit code: $ret
rm -f "$fifo"
rmdir "$tmpdir"
EOF
$ sh ./test_filter.sh
... a
... b
exit code: 10