popen失败了“sh:<command />:not found”

时间:2010-04-27 00:15:59

标签: php shell popen sh

我正在开发一个服务器应用程序,我最近在测试服务器(Debian Squeeze)上遇到了这个奇怪的错误。

我传递给 popen 的每个可执行文件都失败并带有一个msg:

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

无论我是指向“type”返回的完整路径还是保持简短,都会发生这种情况。 如前所述,这只发生在一个测试环境中,增加了混乱,运行相同的操作系统并且没有任何问题。

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

2 个答案:

答案 0 :(得分:1)

调用popen时,可能没有正确配置PATH。我想这是一个PHP配置问题,但您可以通过以下方式绕过它:

  1. 运行which tail以确定尾程序的完整路径。
  2. 使用1中的路径调用popen

答案 1 :(得分:0)

我在搜索关于完全相同输出的答案时发现了这个问题。虽然我在C编码,但我仍在使用popen()。我是C的初学者,发现我犯了以下错误。

我正在回答这个问题,希望对搜索相同错误消息的其他人有用。这就是我遇到,发现和纠正问题的方式。

我声明了一个字符串,并用它连接其他字符串来制定我的命令行。

我将这行打印到stdout以验证它是我想要的命令。从stdout复制并执行时,该行有效。那么为什么来自popen()的shell窒息?

我将输出传送到文件并在编辑器中打开文件,并看到当我的空字符串被初始化时,使用字符串创建了特殊字符“^ A”,该字符串未显示在终端上。

我改变了我从中声明char数组的方式:

char varname [];

到此:

char varname [512] = {“”};

这解决了这个问题。我鼓励有类似问题的人在popen()使用的字符串中查找隐藏的字符。