bash和dash
阿新 • • 發佈:2021-08-03
本地虛擬機器我用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> intmain() { 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; }