我做了一个简单的脚本:
$ more test.bash
#!/bin/bash
echo test
exit 1
Run Code Online (Sandbox Code Playgroud)
当我运行脚本时,退出状态应为1
$ /tmp/test.bash
echo $?
1
Run Code Online (Sandbox Code Playgroud)
但是当我按照以下方式运行时
/tmp/test.bash | tr -d '\r' 1>>$LOG 2>>$LOG
echo $?
0
Run Code Online (Sandbox Code Playgroud)
退出状态为0,(不符合预期1)
似乎退出状态来自tr命令.但我想要的是从脚本中获取退出状态 - test.bash.
为了从脚本中获取正确的退出状态,而不是从管道后面的命令中获取正确的退出状态,我需要在语法中添加/更改什么?
对于以下bash语句:
tail -Fn0 /tmp/report | while [ 1 ]; do echo "pre"; exit; echo "past"; done
Run Code Online (Sandbox Code Playgroud)
我得到了"pre",但没有退出bash提示符,然后如果我在/ tmp/report中输入内容,我可以退出这个脚本并进入bash提示符.
我认为这是合理的.'exit'使'while'语句退出,但'tail'仍然活着.如果输入的内容/tmp/report,'tail'将输出到管道,那么'tail'将检测管道是否关闭,然后'tail'退出.
我有一个这样的脚本:
#!/bin/sh
echo "hello"
echo "goodbye"
exit 1
Run Code Online (Sandbox Code Playgroud)
当我自己运行它时,我得到了我预期的失败退出代码。
$ ./fail.sh
hello
goodbye
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时grep -v,退出状态更改为成功:
$ ./fail.sh | grep -v hello
goodbye
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
有没有办法将命令的输出通过管道输入grep -v并仍然正确传播状态代码?当然,在现实世界中,这样做的目的是过滤嘈杂命令的输出,同时仍然检测命令是否失败。
我有一个带有多个管道的 bash/zsh 命令|,在使用set -o pipefail. 为简单起见,假设命令是
set -o pipefail; echo "123456" | head -c2 | grep 5 | cat
Run Code Online (Sandbox Code Playgroud)
如何快速找出哪个命令首先失败以及原因?我知道我可以检查退出代码,但这并不能显示管道的哪一部分首先失败。
有没有比逐个构建管道并检查第一个失败退出代码的相当冗长的检查更简单的方法?
编辑:我删除了我编写的人为代码示例,因为它使人们对我询问的目的感到困惑。提示这个问题的实际命令是:
set -o pipefail; echo "123456" | head -c2 | grep 5 | cat
Run Code Online (Sandbox Code Playgroud) 我有一个 bash 脚本,用于执行命令和tee文件。在检查返回码时,它总是0用于tee <>命令。
make all | tee output.log
if [[ $? -ne 0 ]]; then
echo "Make failed"
exit 1
else
blah blah
fi
Run Code Online (Sandbox Code Playgroud)
有没有办法检查第一个命令的返回码(即 make all在这种情况下)?
我有这个命令:
coverage report | tee >(grep TOTAL | awk '{exit (int($4) >= 75)?0:1}') && (exit ${PIPESTATUS[0]})
Run Code Online (Sandbox Code Playgroud)
报告代码覆盖率然后打印输出stdout并将相同的输出重定向到grep + awk,它基本上检查代码覆盖是否覆盖更少或更多75.最后,有exit一个子shell,我假装在我的CI/CD管道中使用.
问题是我的CI/CD总是成功完成,这不应该发生,因为我的测试中代码覆盖率低于75%.这意味着PIEPSTATUS我没有返回我期望它返回的内容(awk的exit代码).
问题出在哪儿?我究竟做错了什么?