gpt4 book ai didi

php - 如果命令在 mac 终端内运行,如何让 shell_exec 表现得像?

转载 作者:太空狗 更新时间:2023-10-29 12:03:45 26 4
gpt4 key购买 nike

当我在 php 脚本中运行命令时

echo shell_exec("which php");

我得到以下输出:

/usr/bin/php

但是在 mac 终端中运行相同的命令时

 which php

我得到以下输出

 php: aliased to /Applications/MAMP/bin/php/php5.5.10/bin/php

我的问题是如果命令在 mac 终端内运行,如何让 shell_exec 表现得像?

注意:我已经安装了 ZSH

最佳答案

简答:

这行不通(可靠)。

长答案:

问题有三个:

  1. PHP 不使用您的登录 shell,而是使用 /bin/sh
  2. 必须根据使用的上下文设置别名
  3. which 的输出取决于$PATH

查看 1. 您可以通过回显 $0

来打印正在运行的 shell 的名称
% echo $0
zsh
% php -r 'echo shell_exec("echo \$0");'
sh

如您所见,PHP 启动了 sh 而不是 zsh。这意味着它还使用 sh 的内置命令,或者如果没有内置命令则查找命令:

% php -r 'echo shell_exec("which which");'
/usr/bin/which
% zsh -c 'which which'
which: shell built-in command

除非 sh 链接到 zsh,也就是说,如果你想使用 zsh 的内置命令,你必须使用 zsh 运行你的命令:

echo shell_exec("zsh -c 'which php'");

这会启动 /bin/sh,后者会启动 zsh,然后运行命令。

虽然您可以使用 sh 绕过 PHP,但第二个问题更为严重:别名仅在定义它们的实例中设置。大多数情况下,这发生在某些配置文件中(例如 ~/.zshrc)。但是当以非交互方式使用 zsh 时,这些配置文件不会被加载,也不会将别名传递给子进程:

% grep foo ~/.zshrc
alias foo=bar
% which foo
foo: aliased to bar
% zsh -c 'which foo'
foo not found
% php -r 'echo shell_exec("zsh -c which\ foo");'
foo not found

总而言之,这意味着从 PHP 脚本内部使用 which 是找出 php 来源/位置的完全不可靠的方法。更重要的是,它的输出取决于 $PATH,这对于交互式和非交互式 shell 也可能不同。

关于php - 如果命令在 mac 终端内运行,如何让 shell_exec 表现得像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23426931/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com