使用参数执行sh脚本

3

我自己编写了一个sh脚本,其中包含类似于“cd 目录”的结构。

它可以在终端上运行成功。

. /path/to/script.sh param1 param2

我希望你能帮我将这个脚本通过PHP运行。
shell_exec('. /path/to/script.sh param1 param2');

shell_exec('. /path/to/script.sh "param1" "param2"');

不能正常运行

shell_exec('/bin/bash /path/to/script.sh param1 param2');

程序在运行,但目录更改未生效。

请帮忙解决。谢谢您的帮助。


1
最好使用完整路径而不是使用~,因为HOME在用户之间是不同的。 - fedorqui
你知道你运行的命令之间有不止一个差异,对吧? - Ignacio Vazquez-Abrams
当然,@IgnacioVazquez-Abrams。 - indapublic
cd directory 中,directory 是相对路径还是绝对路径? - geomagas
@geomagas 我尝试了两种变体 - indapublic
5个回答

4
你正在使用以.开头的命令 - 这将被解释为shell-source命令,显然这不是你想要的。相反,请指定完整路径并执行以下操作:
$result = shell_exec('/bin/bash /full/path/to/script.sh param1 param2');
//var_dump($result);

-另外,请确保您的php用户有执行sh脚本的权限,并且PHP可以使用像exec()这样的函数(它们可能被配置禁用)。

是的,脚本已经成功运行了,但是像“cd my_directory”这样的命令没有起作用。 - indapublic
你想用那个 cd 做什么?你的脚本发生了什么事?为什么你不能在脚本中使用完整路径而不是使用 cd - Alma Do
cd_one(cd_one是我bash_profile中的一个函数) 执行一些例行操作 cd_two(cd_two是我bash_profile中的一个函数) 执行一些例行操作 - indapublic
1
将您的别名替换为直接命令调用。同时尝试使用完整路径(即完全摆脱cd - 通常最好避免使用它们,因为它们会导致代码不易读)。 - Alma Do
你尝试过不使用 cd 命令吗?也就是说,不要使用 cd command_dir 命令,而是使用 /path/to/command_dir/some_command 命令。另外,为了让 cd 命令正常工作,你需要确保 PHP 用户对该目录具有 x 权限(执行权限)。 - Alma Do
显示剩余2条评论

2

你需要使用引号来发送参数,尝试这样做:

$command_result = shell_exec('script.sh "'.$param1.'" "'.$param2."');

0

使用

shell_exec('./path/to/script.sh param1 param2');

代替

shell_exec('. /path/to/script.sh param1 param2');

...并确保您的 shell 脚本对运行脚本的用户具有可执行权限。


0

当PHP运行在安全模式下时,此函数将被禁用。请检查您的php.ini文件,确保关闭了安全模式并且它不在“disable_functions”中。


0

避免:

  1. 使用 . 符号,这在 bash shell 之外是无法工作的。而应该使用 /bin/bash <yourscript>

  2. 尝试 cd 到相对路径,因为这会将脚本的执行限制在特定位置。

  3. 引用(或暗示).bash_profile 资源,因为 .bash_profile 仅针对登录 shell 执行。如果适用,请改用 .bashrc


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