2012-09-27 79 views
0

「的文件或目錄未找到」的消息我用POPEN運行系統的腳本,像這樣:斯特林在POPEN

snprintf(cmd, MAX_PATH, "/myscript -q | grep -i %s", deviceName); 
FILE *res = popen(cmd, "r"); 

如果找不到腳本,程序進行了快樂的方式。但是,顯示「找不到文件或目錄」消息,這看起來像是一個錯誤,即使在我的預期用法中它不是。

有沒有辦法讓這條信息靜音,或者我應該在運行這條線之前調用ls | grep -i myscript

+0

只是'/ myscript -q'成功了嗎?什麼是'deviceName'? –

+0

/myscript -q沒有成功,這是一個觀點:腳本不存在,對我而言,它與找不到設備的函數相同,這是一個可接受的結果,不應該讓我的程序打印出錯誤信息。 – dkb

回答

1

假設你/bin/sh是POSIX Shell,或合理最近Bourne shell的變種,你可以重定向標準在執行實際命令之前在命令內輸出。您只需在要執行的命令之前加上exec 2>/dev/null ;即可。

這裏是我會親自做:

/* Shell syntax for redirecting standard error to /dev/null, to 
* silence any errors. If /bin/sh does not support this, you can 
* simply replace it with an empty string. 
*/ 
#define POPEN_STDERR_NULL "exec 2>/dev/null ;" 

... 

snprintf(cmd, MAX_PATH, POPEN_STDERR_NULL "/myscript -q | grep -i -e '%s'", deviceName); 
FILE *res = popen(cmd, "r"); 

popen()命令使用/bin/sh內部運行指定的命令。上述作品適用於所有可以測試的/bin/sh變體,包括Linux和SunOS 5.10,因此它應該非常便於攜帶。 (換句話說,dashbash,和SunOS 5.10 sh所有的工作與它的罰款。)

既然你需要重新編譯任何非標準系統中的應用,你可以隨時編輯宏省略前綴。 (您可以在測試輕鬆添加到Makefile魔術在必要時自動忽略它,如果你發現這樣的系統。)

注意,我修改了參數替代的snprintf()通話。它將適用於任何deviceName不包含包含單引號。 deviceName中的任何單引號應該在調用snprintf()之前用字符串'"'"'替換。

有問題?

+0

這不會關閉應用程序運行其餘部分的錯誤流,對嗎? – dkb

+1

不,重定向僅影響使用'popen()'運行的命令。應用程序通常可以在之前,之中和之後使用'stderr';它完全不受此影響。 –

0

我不太確定你是否可以扼殺這個信息。錯誤是打印到標準錯誤流上的標準Linux錯誤。您可以保留作爲標準錯誤文件描述符的FD'2'。所以也許你可以關閉這個FD。

但是,我必須警告您,這將防止您的程序的其餘部分打印任何錯誤。

更好的辦法是這樣做: snprintf(cmd,MAX_PATH,「/ myscript -q | grep -i%s 2> dummyfile」,deviceName);

這會將錯誤重定向到您立即刪除的虛擬文件。

所以謹慎操作,並決定你想要做什麼......

乾杯, VSN