有人可以解释为什么我从下面得到退出代码141?
#!/usr/bin/bash
set -o pipefail
zfs list | grep tank
echo a ${PIPESTATUS[@]}
zfs list | grep -q tank
echo b ${PIPESTATUS[@]}
cat /etc/passwd | grep -q root
echo c ${PIPESTATUS[@]}
Run Code Online (Sandbox Code Playgroud)
我明白了
...
a 0 0
b 141 0
c 0 0
Run Code Online (Sandbox Code Playgroud)
从我的理解退出代码141失败,但上面的行给出零,所以它应该是成功,我会说.
如何wget从子shell进程获取退出代码?
所以,主要问题是$?等于0.哪里可以$?=8建立?
$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "$?"
0
Run Code Online (Sandbox Code Playgroud)
tee实际上它没有用.
$> OUT=$( wget -q "http://budueba.com/net" ); echo "$?"
8
Run Code Online (Sandbox Code Playgroud)
但是${PIPESTATUS}数组(我不确定它与那种情况有关)也不包含该值.
$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[1]}"
$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[0]}"
0
$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[-1]}"
0
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是 - 如何wget通过tee子shell …
在bash中,如果我在反引号内执行一些管道命令,我怎样才能找到第一个命令的退出状态?
即在这种情况下,我试图获得"1".如果我不使用反引号,我可以通过PIPESTATUS [0]获得,但是当我想保存输出时它似乎不起作用:
## PIPESTATUS[0] works to give me the exit status of 'false':
$ false | true;
$ echo $? ${PIPESTATUS[0]} ${PIPESTATUS[1]};
0 1 0
## doesn't work:
$ a=`false | true`;
$ echo $? ${PIPESTATUS[0]} ${PIPESTATUS[1]};
0 0
Run Code Online (Sandbox Code Playgroud)
更一般地说,我试图完成:将某个程序输出的最后一行保存到变量,但能够判断程序是否失败:
$ myvar=` ./someprogram | tail -1 `;
$ if [ "what do i put here" ]; then echo "program failed!"; fi
Run Code Online (Sandbox Code Playgroud)
理想情况下,我也想了解发生了什么,而不仅仅是答案是什么.
谢谢.