【问题标题】:Keep bash shell functions between shell_exec() requests在 shell_exec() 请求之间保留 bash shell 函数
【发布时间】:2016-01-25 18:41:38
【问题描述】:

我有一个通过 CLI 运行的 PHP 脚本。反过来,我希望该脚本调用 bash 脚本,但最好我想分解 BASH 请求,以便我可以看到正在发生的操作。

我似乎可以设置环境变量,它们似乎存在于 shell_exec() 函数之间。但即使我有这样的源文件:

来源./bashes/functions.sh

并且在源文件中我使用“export -f function-name”在执行下一行之前将脚本中的函数导出,下一行看不到函数。

  $file = file('./bashes/bash_testing.sh',FILE_SKIP_EMPTY_LINES);

  //we want to watch this in realtime so write each line seperately to shell.
  foreach($file as $command) {
    $output->writeln(shell_exec($command));
  }

$output->writeln 函数是一个辅助函数,用于回显返回的结果。但基本上我得到的错误是

sh: now: command not found

现在被定义为包含的 bash_testing.sh shell 脚本中的一个函数。

有人知道我该如何解决这个问题吗?

这是 ./bashes/functions.sh 文件的来源:

function now {
  date -u +%T
}

export -fx now

【问题讨论】:

  • 这行不通,因为进程无法修改其父环境。您只能将变量导出给您的孩子。你真正想做的是什么?我不明白这将如何帮助您“看到行动”
  • 这真是太糟糕了。似乎很奇怪,每个 shell_exec() 的环境都必须改变,太糟糕了,没有办法在另一个 shell 脚本中将它们全部保持在同一范围内。您认为这是所有非 bash 环境的问题吗?就像 Python 会出现同样的问题一样。
  • 绝对。甚至 php :)
  • 您可以创建一个 bash 进程并写入其标准输入。但这不太可能真正解决您的真正问题,尽管我不知道您实际上想要完成什么。
  • 这实际上是我所需要的,但我希望看到一个示例,您还可以在 shell 执行某些操作时将多个命令发送到标准输入,这样一切都保持在范围内。执行 popen() 示例,这是这里第一个接受的答案,现在对我有用:stackoverflow.com/questions/20107147/…

标签: php bash shell


【解决方案1】:

有一种方法可以维护单个 bash shell、执行命令并处理返回。我最近发布了一个项目,它允许 PHP 获取真实的 Bash shell 并与之交互。在这里获取:https://github.com/merlinthemagic/MTS

我建议不要触发 bash 脚本,而是触发个别命令。这样您就可以处理返回,而不必在 bash 中构建异常处理。

下载后您只需使用以下代码:

//get a real bash shell.
$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', false);

$return1  = $shell->exeCmd($command1);
//logic to handle the return

$return2  = $shell->exeCmd($command2);
//logic to handle the return

.....等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2019-01-07
    • 2014-01-27
    相关资源
    最近更新 更多