Php 在shell_exec()请求之间保留bash shell函数

Php 在shell_exec()请求之间保留bash shell函数,php,bash,shell,Php,Bash,Shell,我有一个通过CLI运行的PHP脚本。反过来,我希望该脚本调用bash脚本,但我更希望分解bash请求,以便能够看到正在发生的操作 我似乎可以设置环境变量,它们似乎存在于shell_exec()函数之间。但即使我有一个源文件,比如: source./bashs/functions.sh 在源文件中,我使用“export-f function name”在执行下一行之前导出脚本中的函数,下一行没有看到函数 $file = file('./bashes/bash_testing.sh',FILE_

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

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

source./bashs/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脚本中的函数

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

以下是./bashs/functions.sh文件的源代码:

function now {
  date -u +%T
}

export -fx now

有一种方法可以维护单个bashshell、执行命令和处理返回。我最近发布了一个项目,它允许PHP获得一个真正的Bash shell并与之交互。在这里获取:

我建议不要触发bash脚本,而是触发individual命令。这样,您就可以处理返回,而不必在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

。。。。。etc

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