1. 程式人生 > 其它 >bash和dash

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; }