导航

bash和dash

本地虚拟机我用ubuntu很嗨,但线上一般都是centos。

同事写了一个程序,输入格式是programName {A,B,C}

因为之前参数只有一个时,programName {A}会挂死,还非得programName {A,}

所以我打心里认为输入处理他自己完成的。

 

我这边的程序会调用同事的程序,在线上跑没出过问题。

在本地跑的时候,调用同事的程序,同事的程序挂死。

就把同事的程序当作黑盒吧。就只知道会挂死。调用同事程序时会打印参数,该参数正常。

但是同一个程序加相同参数在命令行执行没有问题,在程序里调用时,挂死。

 

就我在程序里执行命令行用system,或者execv,厉害的还用popen。execv当时有坑,因为需要自己设置argv,所以这个坑我大概见过。

当我脱离程序,关键语句另写了个c程序,在ubuntu上跑错误,在centos上跑正确,差不多这个问题就定位出来了。

ubuntu默认脚本执行程序dash,centos默认bash。

{A,B,C}参数列表并不由同事程序解析,而是脚本解释器解析。所以同事的程序就是黑盒。因为当时gdb打印argv[1]出来{A,B,C}而不是A时,我不懂,他应该懂。他忘了。

 

之后设置ubuntu默认脚本解释器为bash,问题解决。

 

我并没有仔细的去了解dash和bash,但ubuntu这样做的原因是,dash更快。

 

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char cmd[] = "programName {A,B,C}";
    char buf[5000];

    system(cmd);

    FILE *fp = popen(cmd, "r");
    int ret;

    if (fp) {
        ret = fread(buf, 1, 4999, fp);
        pclose(fp);
    }    
    printf("%s\n", buf);
    return 0;
}

 

posted on 2021-08-03 11:27  toughcactus  阅读(140)  评论(0编辑  收藏  举报