【问题标题】:popen fails with "sh: <command>: not found"popen 失败并显示“sh: <command>: not found”
【发布时间】:2011-02-12 15:48:03
【问题描述】:

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

我传递给 popen 的每个可执行文件都失败并显示一条消息:

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

【问题讨论】:

  • 请发布实际调用,如果使用任何变量,请显示它们是如何生成的。
  • 使用二进制全路径的结果是一样的吗? (我的意思是:哪里是尾巴)
  • 是的,只要它通过 popen 运行,sh 就会返回那个错误消息 ..
  • 您是否尝试以超级用户身份从 cli 运行它?
  • 通过 CLI 运行它是没有问题的,你甚至不需要成为超级用户,但是相同的命令失败并出现 POPEN,这就是问题 -.-

标签: php shell popen sh


【解决方案1】:

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

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

【讨论】:

  • 这是我尝试的第一件事。 “type”命令类似于 Debian 上的“which”,并给出了完整路径.. 但无济于事.. popen 仍然坚持“未找到”,这在这一点上相当令人困惑..
【解决方案2】:

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

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

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

我将该行打印到标准输出以验证它是我想要的命令。从标准输出复制并执行时,该行有效。那么为什么 shell 会被 popen() 阻塞呢?

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

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

字符变量名[];

到这里:

char varname[512] = {""};

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2019-07-01
    • 2020-09-26
    • 2015-12-02
    • 2016-02-24
    • 2022-12-10
    • 2022-12-25
    相关资源
    最近更新 更多