当编译时间失败时,编程语言Crystal当前不写入STDERR。如果退出状态不是0并且仍然返回退出状态,我需要将STDOUT重定向到STDERR。退出状态在Bash中不为0时将STDOUT重定向到STDERR
回答
从字面上看,您的请求实际上是不可能的:重定向在命令启动之前执行,而退出状态仅在退出时才知道。
但是,您可以无条件地重定向到缓冲区,然后在知道退出状态后将该缓冲区写入stdout或stderr。
考虑类似于以下的包装:
#!/bin/sh
if output=$("[email protected]"); then
printf '%s\n' "$output"
else
retval=$?
printf '%s\n' "$output" >&2
exit "$retval"
fi
...援引为(如果这被保存为stderr-wrapper
):
stderr-wrapper your-program arg1 arg2 ...
这太棒了!非常感谢!它对其他快乐道路没有任何副作用。 –
这里*有一个警告,因为这段代码会吃掉任何可能包含在程序输出中的NULs(因为NULs不能存储在C字符串中,bash用于存储内存)。如果这是一个问题,你可能会写入一个文件。 –
如果预期的输出太大,则临时文件可能更安全 –
回旋管的方法,这需要tac
和无害eval
,但既不是缓冲区变量也不是临时文件。
演示脚本demo
,使用echo false ; false
模拟程序,它输出到标准输出和返回一个错误码“”。
#!/bin/bash
out=([0]=/dev/stdout [1]=/dev/stderr)
{ { echo $1 ; $1 ; echo $? ; } | tac ; } | \
{ read x ; eval tac \> ${out[$x]} ; exit $x ; }
证明,使用annotate-output
:
annotate-output +'' ./demo true ; echo --- ; annotate-output +'' ./demo false
I: Started ./demo true
O: true
I: Finished with exitcode 0
---
I: Started ./demo false
E: false
I: Finished with exitcode 1
归纳该demo
成stderr-wrapper
:
对于
bash
:#!/bin/bash # Usage: stderr-wrapper program [ args... ] out=([0]=/dev/stdout [1]=/dev/stderr) { { [email protected] ; echo $? ; } | tac ; } | \ { read x ; eval tac \> ${out[$((x>0))]} ; exit $x ; }
对于POSIX壳,(这里是
dash
):#!/bin/dash # Usage: stderr-wrapper program [ args... ] { { "[email protected]" ; echo $? ; } | tac ; } | \ { read x ; eval tac 1\>\&$(((x>0)+1)) ; exit $x ; }
的bash
版本是如何工作的:
- 运行有问题的程序,它输出到标准输出 。
- 之后立即打印错误代码,也可以标准输出。
- 反转整个流与
tac
,所以错误代码是第一个。 (昂贵,如果流很长。) read
一行,错误代码,存储在$x
。eval
$out
阵列成员对应于输出应该去的设备,然后用tac
重新反向输出到该设备。
- 1. Bash stderr和stdout重定向失败
- 2. 将stdout和stderr重定向到函数
- 3. 将子进程stderr重定向到stdout
- 4. Tomcat将'stderr'内容重定向到'stdout'
- 5. Bash脚本 - 将子脚本stderr重定向到父级的stdout
- 6. 如何在Java中将子进程stdout/stderr重定向到主进程stdout/stderr?
- 7. 如何将stderr重定向到Ant中的stderr或stdout?
- 8. 重定向stdout和stderr的输出?
- 9. 重定向stdout/stderr在C中运行
- 10. 在DOSKEY宏中重定向STDERR和STDOUT
- 11. 在bash脚本中测试stdout和stderr重定向
- 12. 实时重定向stdout和stderr
- 13. 为每个线程重定向stdout/stderr
- 14. PERL无法将stdout和stderr重定向到输出文件
- 15. 显示bash shell stdout/stderr重定向行为的备忘单
- 16. Stdout&stderr不自动启动重定向
- 17. 如何将stderr/stdout重定向到我在C++中的日志?
- 18. 在Python的子进程/ Popen中将stdout重定向到stderr
- 19. 在AIX中将STDERR&STDOUT重定向到/ dev/null失败
- 20. Linux stdout stderr重定向到文件:与终端输出不同
- 21. 为什么adb push/pull将STDOUT重定向到STDERR?
- 22. 如何将stdout和stderr重定向到文件AND仍只输出stderr?
- 23. 如果将STDERR重定向到STDOUT并将STDOUT重定向到文件,为什么STDERR消息不会在文件中显示?
- 24. 关闭stdout和stderr(1>& - 2>& - )修改退出状态?
- 25. ksh将stdout和stderr重定向到不同的进程
- 26. 如何将raw_input重定向到stderr而不是stdout
- 27. 如何将stderr重定向到Ant JUnit目标中的stdout?
- 28. 将stdout和stderr重定向到C++中的文件
- 29. 如何将stdout和stderr重定向到Python中的记录器
- 30. 将stdout和stderr重定向到C++中的单个文件
您尝试过'some_bash_command.sh 2&1'吗? – t0mm13b
重新定向在**程序启动之前运行**。退出状态仅在**该程序退出后才知道。你不能回到过去。 –