问题标签 [pipestatus]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
53 浏览

bash - PIPESTATUS 忽略否定?

我刚刚在 bash(版本 4.2.25(1)-release)中发现了以下结果:

因此,$PIPESTATUS似乎在所有情况下都忽略了否定。这是一个已知的问题?我找不到任何关于它的信息。或者这是一种通缉行为?如果是这样,其背后的原因是什么?

使用 subshel​​l 时,一切正常:

0 投票
2 回答
86 浏览

loops - 重复管道命令,直到第一个命令成功并且第二个命令失败

我试图弄清楚如何让我的 bash 脚本工作。我有以下命令:

我需要它重复,直到管道中的第一个命令成功(意味着服务器响应)并且第二个命令失败(意味着找不到模式或队列为空)。我尝试了许多组合,但似乎无法得到它。我看着使用$PIPESTATUS,但无法让它按我想要的方式循环运行。我已经尝试了各种变化,但无法让它发挥作用。这是我目前正在尝试的:

0 投票
1 回答
254 浏览

linux - 在附加到 tee 的重定向中获取嵌套命令的退出状态

我有这个命令:

它报告代码覆盖率,然后将输出打印到stdout并将相同的输出重定向到 grep + awk,它基本上检查代码覆盖率是少于还是多于75. 最后,exit在子shell 中有一个,我假装在我的 CI/CD 管道中使用它。

问题是我的 CI/CD 总是成功完成,这不应该发生,因为在我的测试中代码覆盖率低于 75%。这意味着它PIEPSTATUS没有返回我期望它返回的内容(awk 的exit代码)。

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

0 投票
1 回答
101 浏览

bash - 在后台运行的进程的 PIPESTATUS 是否可跟踪?

按照赛勒斯的建议扩展问题,我想知道如果我PIPESTATUS将它发送到后台运行,我是否可以跟踪相同的脚本或类似的脚本?

bash 脚本如下:

并且script.py是:

当我在没有它的情况下运行bash脚本时,&它会正确打印,PIPESTATUS但如果我在后台运行它,则不会返回任何输出。

0 投票
1 回答
43 浏览

bash - 退出bash时如何设置退出代码?

我想从 sub-bash 运行命令,我需要它的返回码;实际上它正在运行一个管道,我需要 PIPESTATUS 数组,或者至少一个组件。

这是我最好的猜测,但它不起作用。我只得到一个 0。由于 bash 没有出错,它是有道理的,这不是我需要的。帮助?

0 投票
3 回答
676 浏览

bash - BASH 脚本中的 PIPESTATUS[0]

我正在 Unix Bash 脚本中实现一个场景。我有两个脚本 ABC.bash 和 XYZ.bash。当请求者未输入 Y 或 y 脚本退出并显示消息且不再工作时,ABC.bash 中有一种情况。ABC.bash 单独运行时工作正常。当我从另一个 bash 脚本(即 XYZ.bash)运行它时出现问题。它不检查退出条件。XYZ.bash 中的逻辑语法。

但是当ABC.bash $a $b以状态 2 退出时,流仍然进入 IF 块而不是 ELSE。在日志中我可以看到消息DEBUGMODE 设置为 0。我需要这个 DEBUGMODE 设置,因为它是必需的,但如果 ABC.bash 退出,我想退出。理想情况下,它应该进入 ELSE 部分,因为 ABC.bash 因用户输入错误而退出。

此外,我在 XYZ.bash 脚本中设置了 DEBUGMODE 选项。喜欢-

0 投票
1 回答
57 浏览

bash - 尽管输出通过 sed 管道传输,但仍保持 bash 命令的退出代码

我刚刚注意到,即使编译失败,我的一些 CI 作业也返回了 OK。这本质上是因为调用 bash 命令来编译代码,虽然失败并返回 1,但它的输出通过管道传输sed以向输出添加一些颜色等。

本质上,这归结为以下几点

我知道在 bash 上有PIPESTATUS,所以我可以${PIPESTATUS[0]}用来获取在管道之前运行的命令的退出代码。但是如何围绕任何命令进行包装,以便将其输出通过管道传输到 sed,然后返回命令本身的退出代码(丢弃 的退出代码sed)?

为了使它真正通用,假设我想将任何命令的输出通过管道传输到 sed 以在每行输出之前添加一个彩色前缀:

如上所述,由于管道 to sed,无论返回什么都将返回 0 ls,并且将显示目录内容,每行前面都有一个红色OUTPUT:

我可以定义一个函数、别名等(我们称之为“wrap”)来让我调用,例如wrap ls *.txt,以这样一种方式ls *.txt执行,输出通过 sed 模式传输,并ls *.txt返回其自身的退出代码,这样

0 投票
1 回答
43 浏览

perl - 在 CentOS 6 和 Ubuntu 20.04(在 Perl 中)上捕获不同子进程的退出状态?

我正在将一个 perl 备份脚本从 CentOS 6 改编为 Ubuntu 20.04。

子例程 ExecCmd() 为 rsync 的系统调用启动一个子进程。

在 CentOS 6 上,它使用 rsync 输出填充变量 $ExecCmdOut 并返回退出状态 $pipestatus。

在 Ubuntu 上,$pipestatus 包含 rsync 输出的最后一行。在我看到的日志中

这是功能。你能看出为什么吗?