V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
sjsurf
V2EX  ›  git

用 Swift 写 CLI 遇到的问题

  •  
  •   sjsurf · 2022-11-17 17:47:15 +08:00 · 1354 次点击
    这是一个创建于 723 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司的项目在组件化的路上越走越远,每次推组件代码到仓库要敲好多命令,所以就有了写个 CLI 的想法。今天遇到了个问题是,git push 返回的结果,没有在 stdout 而是,stderr.

    由于我会判断 stdout 就抛错误的。导致我之前写的很多逻辑就作废了。

    这只是一个 bug ?还是说有什么特定的含义呢

    第 1 条附言  ·  2022-11-17 18:21:05 +08:00

    附录一个 Google 到的结果,进行尝试之后也确实如下所言。

    Console (terminal) applications - whether on Windows or on Unix-like platforms - only have two output streams at their disposal:

    • stdout (standard output) - this is where data ("return values") goes.
    • stderr (standard error) - this is where error messages and - for lack of additional streams - anythings else that isn't data goes, such as progress and status information.

    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 应用

    Swift 中 Process 实例也有一个属性为:terminationStatus 可以获取到上一条命令的返回结果。可以根据此来判断,上一条命令是否执行成功

    9 条回复    2022-12-07 16:03:36 +08:00
    zhanglintc
        1
    zhanglintc  
       2022-11-17 17:59:40 +08:00
    打到 stderr 可能就是想相对而言更容易被你看到?
    sjsurf
        2
    sjsurf  
    OP
       2022-11-17 18:02:37 +08:00
    @zhanglintc 可是我就没有办法区分这到底是成功了还是失败。pod 也是,out 和 err 都有相应的数据。
    zthxxx
        3
    zthxxx  
       2022-11-17 18:10:08 +08:00
    exit code 才表示成功失败,stdout stderr 都只是标准输入输出通道的一种

    stderr 叫做 stdwarn 大多数人更容易理解
    zthxxx
        4
    zthxxx  
       2022-11-17 18:10:30 +08:00   ❤️ 1
    这种事情找运维来写吧
    sjsurf
        5
    sjsurf  
    OP
       2022-11-17 18:16:09 +08:00
    @zthxxx 刚才刷 stackoverflow 看到了相关的描述,实验了一下也确实是的。感谢!我司没有运维,我也就是拿来练手而已。
    zhanglintc
        6
    zhanglintc  
       2022-11-17 19:42:55 +08:00
    确实,可以看 exit code 。
    看 stdout ,stderr 的话,可能要匹配字符串具体内容。
    v2defy
        7
    v2defy  
       2022-11-17 21:13:52 +08:00
    我也是前几天才知道,git clone 的进度信息会显示在 stderr ,貌似 curl 也是,感觉是为了不污染 stdout 。

    这样在使用管道操作的时候,进度信息就不会被管道传递过来,也是非常机智了。
    agagega
        8
    agagega  
       2022-12-03 22:46:32 +08:00
    你试试 git push > result.txt 就知道了,一些信息还是会显示在终端上,因为它们是输出到 stderr 的
    sjsurf
        9
    sjsurf  
    OP
       2022-12-07 16:03:36 +08:00
    @agagega 是的,所以判断是否执行成功,需要判断返回的 Int 值是什么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2695 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:07 · PVG 15:07 · LAX 23:07 · JFK 02:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.