gpt4 book ai didi

bash - 重定向 stderr 更改管道命令的退出代码

转载 作者:行者123 更新时间:2023-12-04 08:21:18 24 4
gpt4 key购买 nike

我目前正在创建一个 GitHub-action 来格式化 python 代码,同时还创建注释。为了实现这一点,我通过管道传输 black python formatter 的 stderr进入 reviewdog 的 std_in错误解析器。但是,在这样做时,我想访问黑色格式化程序的退出代码。经过研究,我发现PIPESTATUS正是为此目的而创建的。因此,我目前使用以下代码尝试检索管道黑色命令的退出代码:

black --check .
echo "Black non-piped exit code: $?"
black --check . 2>&1 | echo "jan"
PC=(${PIPESTATUS[@]})
echo "Black piped exit code: ${PC[0]}"

>
Black non-piped exit code: 0
Black piped exit code: 1
令人惊讶的是,管道访问代码总是 1即使黑色返回 0退出代码。当我删除 2>&1 时,这种行为就会消失。重定向:
black --check .
echo "Black non-piped exit code: $?"
black --check . | echo "jan"
PC=(${PIPESTATUS[@]})
echo "Black piped exit code: ${PC[0]}"

>
Black non-piped exit code: 0
Black piped exit code: 0
因此,它会查看 std_err 重定向是否更改了 PIPESTATUS 中的退出代码多变的。不幸的是,我还无法找到为什么会发生这种情况以及如何防止这种情况发生。我还有另外两个解决方案可以让我实现所需的行为,但我对正在发生的事情很好奇。因此,如果有人能向我解释发生了什么,我将不胜感激。非常感谢!
可能的其他解决方案
  • Write black output into a variable :这似乎有效,目前是我首选的解决方案。
  • 将黑色输出写入文件,然后将文件输入输入错误解析器 :这个解决方案对于我想要实现的目标来说似乎有点矫枉过正。

  • 系统信息
  • 黑色: 19.10b0
  • bash : GNU bash,版本 5.0.17(1)-release (x86_64-pc-linux-gnu)
  • 操作系统: Ubuntu 20.04
  • 内核: 5.4.0-58-通用

  • 相关
  • Redirect stdout and stderr to different program without changing exit code

  • 解决方案总结
    正如 @charles-duffy 所指出的退出码的问题是由于接收命令无法处理 stderr引起的.就我而言,这是因为我允许操作用户向错误解析器提供不受支持的标志,这导致错误解析器返回帮助对话框。因此,发送命令的退出代码更改为 1 .

    最佳答案

    这一点也不奇怪。
    请记住,管道将左侧事物的 stdout(并且,通过您的重定向,stderr)连接到右侧事物的 stdin。
    如果右边的东西没有读取它的标准输入,那意味着左边的东西不能写入标准输出或标准错误。因此,如果它尝试执行这样的写入,预计会出现错误。因此,预计会有一个反射(reflect)该错误的退出状态。echo根本不从标准输入读取;它只是写入标准输出,然后退出。因此,管道左侧的任何东西都可以进入 echo将无法成功写入内容。

    关于bash - 重定向 stderr 更改管道命令的退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65485359/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com