bash脚本:如何在管道中保存第一个命令的返回值?
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
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