用 Swift 写 CLI 遇到的问题 - V2EX
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
sjsurf
V2EX    git

用 Swift 写 CLI 遇到的问题

  •  
  •   sjsurf Nov 17, 2022 2125 views
    This topic created in 1276 days ago, the information mentioned may be changed or developed.

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

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

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

    Supplement 1    Nov 17, 2022

    附录一个 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 replies    2022-12-07 16:03:36 +08:00
    zhanglintc
        1
    zhanglintc &nbp;
       Nov 17, 2022
    打到 stderr 可能就是想相对而言更容易被你看到?
    sjsurf
        2
    sjsurf  
    OP
       Nov 17, 2022
    @zhanglintc 可是我就没有办法区分这到底是成功了还是失败。pod 也是,out 和 err 都有相应的数据。
    zthxxx
        3
    zthxxx  
       Nov 17, 2022
    exit code 才表示成功失败,stdout stderr 都只是标准输入输出通道的一种

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

    这样在使用管道操作的时候,进度信息就不会被管道传递过来,也是非常机智了。
    agagega
        8
    agagega  
       Dec 3, 2022
    你试试 git push > result.txt 就知道了,一些信息还是会显示在终端上,因为它们是输出到 stderr 的
    sjsurf
        9
    sjsurf  
    OP
       Dec 7, 2022
    @agagega 是的,所以判断是否执行成功,需要判断返回的 Int 值是什么
    About     Help     Advertise     Blog     API     FAQ     Solana     2821 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 01:58 PVG 09:58 LAX 18:58 JFK 21:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86