首页 > 解决方案 > ShellScript 不运行“cd”,在 php 中调用 sh

问题描述

看看是否有人去过那里,我在 shellscript 中有这个简单的代码,我访问文件夹(/home/teste4toquew5824),然后确认我是否使用 pwd 进入了目录,

#!/bin/bash
cd /home/teste4toquew5824 && pwd

我有一个调用这个 sh 的 php 文件(位于 /var/www/html):

 $var= shell_exec('/usr/local/bin/api/teste.sh');
    echo "<br><br>";
    var_dump($var); 

当我收到 pwd 的返回时,它显示好像它仍然存在于 php 文件 (/var/www/html) 的目录中,换句话说,它不是“接受”或执行 cd 命令。

1 - 我已经申请了 php 和 sh 的权限。

2 - 我已经确认目录 /home/teste4toquew5824 存在

3 - 我已经测试并在 sh 中放置了一个 echo,只是为了确认 php 正在正确调用和执行 sh。

4 - 我已经在 sh 中放了一行来复制一个文件,只是为了确保另一个命令也在执行,并将文件复制到 /var/www/html

5 - 我尝试将顶部的 bash 更改为 #!/bin/sh -

有没有人有任何想法?非常感谢

标签: phplinuxshell

解决方案


您需要知道当前工作目录是每个进程的属性。为此,该cd命令是 shell 内部的命令,shell 通过调用chdir(2)系统调用来执行该命令。

这意味着 shell 可以更改它的目录,然后 fork 几个进程,这些进程将继承父(shell)的工作目录,但是 shell 无法更改调用它的进程的目录. 这就是您调用脚本(shell 进程)更改其目录的原因,调用pwd,显示该目录实际上是您请求的目录,但您自己的目录仍然与以前相同,就好像 shell 忽略了您的命令。

在 posix 系统中,没有系统调用可以更改另一个进程的当前目录,而是由进程自己完成。

混淆源于该cd命令看起来像在不同程序中实现的其他命令,但该cd命令是内部命令(您不会在/bin/cd任何地方看到命令)


推荐阅读