相关疑难解决方法(0)

如何在管道中获取第一个命令的退出状态?

我做了一个简单的脚本:

$ 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.

为了从脚本中获取正确的退出状态,而不是从管道后面的命令中获取正确的退出状态,我需要在语法中添加/更改什么?

linux bash shell exit-code

8
推荐指数
1
解决办法
1885
查看次数

在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'退出.

  1. 我对吗?如果没有,有人会提供正确的解释吗?
  2. 是否可以在'while'语句中添加任何内容以立即退出整个管道语句?我知道我可以把尾巴的pid保存到一个临时文件中,然后在'while'中读取这个文件,然后杀掉尾巴.有更简单的方法吗?
  3. 让我扩大我的问题.如果在脚本文件中使用此尾部|是否可以同时执行以下项目?一个.如果输入了Ctrl-C或发出主shell进程的信号,主shell生成的主shell和各种子shell和后台进程将退出b.我可以从尾部退出|仅在触发器情况下,并保留其他子进程继续运行c.最好不要使用临时文件或管道文件.

bash shell pipe quit

6
推荐指数
2
解决办法
3674
查看次数

管道进入 grep -v 时获取退出代码

我有一个这样的脚本:

#!/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 grep exit-code

4
推荐指数
1
解决办法
4227
查看次数

如何轻松找出 bash/zsh 管道的哪一部分由于“set -o pipelinefail”而失败?

我有一个带有多个管道的 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 zsh pipe

4
推荐指数
1
解决办法
167
查看次数

使用另一个命令进行管道传输时如何读取命令的返回码

我有一个 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在这种情况下)?

bash shell

3
推荐指数
1
解决办法
36
查看次数

获取嵌套命令的退出状态在连接到tee的重定向中

我有这个命令:

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代码).

问题出在哪儿?我究竟做错了什么?

linux bash awk tee pipestatus

1
推荐指数
1
解决办法
81
查看次数

标签 统计

bash ×6

shell ×3

exit-code ×2

linux ×2

pipe ×2

awk ×1

grep ×1

pipestatus ×1

quit ×1

tee ×1

zsh ×1