2011-12-08 139 views
2

我有一個bash腳本與線

klist | grep DHCPTEST.COM > /dev/null 

我知道klist的話,將返回DHCPTEST.COM線,所以我知道grep的應返回true(0)和腳本時從命令提示符$運行?確實返回0.

但是,當從C程序(DHCPD)調用腳本時,該行返回False(即$?設置爲1) - 爲什麼?

+2

你怎麼確定的結果由C調用時更換管避免可能模糊?那是'系統'嗎? 'execve'? 'execvpe'?你指定'bash'還是可以使用'/ bin/sh'?你怎麼知道這條線返回什麼? – sehe

+0

如果您可以放心,請分享您使用運行命令的代碼。我懷疑執行可能不會成功,如果沒有匹配就會產生錯誤。 – sehe

回答

1

爲了避免混淆,拼出來:

grep -q DHCPTEST.COM <(klist) 

最有可能的任何行爲上的差異是由於

  • 不同的外殼(bash中,破折號,SH?)被調用
  • 不同的子殼行爲(一個管道將通常調用一個subshel​​l。我個人必須查找什麼退出代碼返回(從klist或從grep

使用上述中,通過使用命令替換

+0

我已經嘗試了bash shell和sh shell(調用腳本的代碼是使用exec命令並且似乎使用Bourne shell)。作爲$?從最後一個執行的命令返回,我希望它來自grep命令,正如我所說的,當從命令行執行腳本時,該行將返回0值;只有在C程序中調用腳本時,返回值纔會改變。 – user1087598

+0

我確信POSIX在那裏有話要說,但它不能說是完全顯而易見的,因爲「$?從最後執行的命令返回,這意味着它將返回'grep' exitcode:管道的參與進程並行運行,即同時運行。我確信POSIX將要求$ $的某種邏輯,但正如我所說,這並不明顯,我必須自己去查看它。 – sehe

+0

我試過你的方法和$?在腳本從命令行執行時仍然設置爲0,當從DHCPD調用時設置爲1。 – user1087598

相關問題