2010-04-27 227 views
6

我正在開發一個服務器應用程序,最近我在測試服務器(Debian Squeeze)上遇到了這個奇怪的錯誤。popen失敗,「sh:<command>:not found」

每個可執行文件我傳給POPEN失敗,一個消息:

sh: sort: not found // happens to any command 

發生這種情況,無論我是否指向由「類型」或保持短返回的完整路徑。 正如前面提到的,這隻發生在一個測試環境中,以增加混淆,運行相同的操作系統並且沒有任何問題。

POPEN顯然使用SH執行命令,但如果我運行相同的命令直通命令行(bash或SH),一切都很好

在此先感謝

(PS:偶!試過的Python os.popen剛剛敲定這個摸不到頭腦,和它的作品)

編輯 這是一個簡單的調用失敗:

$command="tail -10 myfile"; 
$handle = popen($command.' 2>&1','r'); 
if($handle){ 
    while (!feof($handle)){ 
    ....//process buffer 
    } 
} 

回報:

sh: tail: not found 
+0

請發佈實際調用,並且如果使用任何變量顯示它們如何生成。 – 2010-04-27 00:18:55

+0

使用二進制文件的完整路徑的結果是相同的? (我的意思是:whereis尾巴) – Cesar 2010-04-27 00:53:38

+0

是的,只要其運行通過popen,sh就會返回錯誤信息。 – smallmeans 2010-04-27 00:59:30

回答

1

可能是你的路徑不是正常調用POPEN時配置。我想這是一個PHP配置問題,但你可以繞過它:

  1. 運行which tail來確定尾部程序的完整路徑。
  2. 呼叫popen與路徑1
+0

這是我嘗試的第一件事。 「類型」命令與Debian中的「which」類似,並提供了完整的路徑......但無濟於事。popen仍然堅持「未找到」,這在這一點上是相當複雜的。 – smallmeans 2010-04-27 02:39:50

0

發現,我發現了這個問題,同時尋找我自己就完全相同的輸出答案。雖然我在C編碼,我仍然使用popen()。我是C的初學者,發現我犯了以下錯誤。

我在回答這個問題,希望對其他人搜索相同的錯誤消息有幫助。這就是我遇到,發現並糾正問題的方式。

我聲明瞭一個字符串並用它連接了其他字符串來表達我的命令行。

我打印行到標準輸出來驗證它是我想要的命令。從stdout中複製並執行時,該行可以工作。那麼爲什麼shell從popen()中窒息?

我將輸出傳送到一個文件,並在編輯器中打開文件,並看到當我的空字符串被初始化時,特殊字符'^ A'被創建,並且字符串沒有顯示在終端上。

我改變我聲明從這個char數組方式:

炭VARNAME [];

對此:

char varname [512] = {「」};

這解決了這個問題。我鼓勵任何有類似問題的人在與popen()一起使用的字符串中查找隱藏的字符。