公司的项目在组件化的路上越走越远,每次推组件代码到仓库要敲好多命令,所以就有了写个 CLI 的想法。今天遇到了个问题是,git push 返回的结果,没有在 stdout 而是,stderr.
由于我会判断 stdout 就抛错误的。导致我之前写的很多逻辑就作废了。
这只是一个 bug ?还是说有什么特定的含义呢
Console (terminal) applications - whether on Windows or on Unix-like platforms - only have two output streams at their disposal:
Therefore, you cannot and shouldn't infer success vs. failure from the presence of stderr output.
Instead, you must rely solely on an application's process exit code:
0 indicates success any nonzero value indicates failure
Swift 中 Process 实例也有一个属性为:terminationStatus
可以获取到上一条命令的返回结果。可以根据此来判断,上一条命令是否执行成功
1
zhanglintc 2022-11-17 17:59:40 +08:00
打到 stderr 可能就是想相对而言更容易被你看到?
|
2
sjsurf OP @zhanglintc 可是我就没有办法区分这到底是成功了还是失败。pod 也是,out 和 err 都有相应的数据。
|
3
zthxxx 2022-11-17 18:10:08 +08:00
exit code 才表示成功失败,stdout stderr 都只是标准输入输出通道的一种
stderr 叫做 stdwarn 大多数人更容易理解 |
4
zthxxx 2022-11-17 18:10:30 +08:00 1
这种事情找运维来写吧
|
5
sjsurf OP @zthxxx 刚才刷 stackoverflow 看到了相关的描述,实验了一下也确实是的。感谢!我司没有运维,我也就是拿来练手而已。
|
6
zhanglintc 2022-11-17 19:42:55 +08:00
确实,可以看 exit code 。
看 stdout ,stderr 的话,可能要匹配字符串具体内容。 |
7
v2defy 2022-11-17 21:13:52 +08:00
我也是前几天才知道,git clone 的进度信息会显示在 stderr ,貌似 curl 也是,感觉是为了不污染 stdout 。
这样在使用管道操作的时候,进度信息就不会被管道传递过来,也是非常机智了。 |
8
agagega 2022-12-03 22:46:32 +08:00
你试试 git push > result.txt 就知道了,一些信息还是会显示在终端上,因为它们是输出到 stderr 的
|