popen失败并显示“sh: <command>: not found”错误信息。

7

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

我使用popen传递的每个可执行文件都会失败并显示以下消息:

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

无论我是指向"type"返回的完整路径还是保持简短,都会发生这种情况。正如之前提到的,这只发生在一个测试环境中,更让人困惑的是,我正在运行相同的操作系统,却没有任何问题。
Popen显然使用"sh"来执行命令,但如果我通过命令行(bash或sh)运行相同的命令,一切都很顺利。
提前感谢。
(附注:甚至尝试过Python os.popen来解决这个难题,而且成功了!)
编辑: 这是一个简单的调用,但失败了:
$command="tail -10 myfile";
$handle = popen($command.' 2>&1','r');
if($handle){
  while (!feof($handle)){
  ....//process buffer
  }
}

返回:

sh: tail: not found

请发布实际调用,并且如果使用任何变量,请显示它们是如何生成的。 - Matthew Flaschen
使用二进制文件的完整路径是否会得到相同的结果?(我的意思是:whereis tail) - Cesar
是的,只要通过popen运行,sh就会返回那个错误消息。 - smallmeans
你尝试过以超级用户身份从命令行运行它吗? - Cesar
在命令行中运行它没有问题,甚至不需要成为超级用户,但相同的命令在 POPEN 下失败了,这就是问题所在。-. - smallmeans
2个回答

1

可能你的PATH路径没有正确配置,在调用popen时出现了问题。我猜这是PHP配置的问题,但你可以通过以下方式绕过它:

  1. 运行which tail命令来确定tail程序的完整路径。
  2. 使用步骤1中找到的路径来调用popen

这是我尝试的第一件事。 "type" 命令类似于 Debian 上的 "which" 命令,并提供完整的路径..但是无济于事.. popen 仍然显示为“未找到”,这在这一点上相当令人困惑.. - smallmeans

0

在寻找自己的答案时,我发现了这个问题,与输出完全相同。尽管我在使用C编码,但仍在使用popen()。作为C语言的初学者,我发现犯了以下错误。

我希望通过回答这个问题来帮助其他搜索相同错误消息的人们。这就是我遇到、发现和解决问题的方式。

我声明了一个字符串,并将其他字符串与它连接起来以构建我的命令行。

我将该行打印到stdout中,以验证它是我想要的命令。从stdout中复制并执行该行时,该行有效。那么为什么shell会因popen()而出错呢?

我将输出导入文件并在编辑器中打开文件,发现当我的空字符串被初始化时,特殊字符“^A”会随着字符串一起创建,但不会在终端上显示。

我改变了声明字符数组的方法,从这个:

char varname[];

变成了这个:

char varname[512] = {""};

这解决了问题。我鼓励任何遇到类似问题的人在使用popen()的字符串中寻找隐藏字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接