- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我在 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
最佳答案
简答:
这行不通(可靠)。
长答案:
问题有三个:
/bin/sh
which
的输出取决于$PATH
查看 1. 您可以通过回显 $0
% 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/
有没有一种方法可以在一个 shell_exec 中缩短此命令? shell_exec("$ffmpegPath -i $inputPath -i $watermark -filter_complex
我正在编写一个 PHP 脚本来自动解压缩和扫描位于外部 USB 驱动器上的 tar.gz 存档,但我遇到了几个奇怪的问题。脚本找到存档后,它会尝试在 USB 驱动器上创建一个临时目录以将存档解压缩到其
我有一个 shell 脚本,它在执行时会生成一些文件夹并将文件复制到其中。我还有一个 node.js“程序”,它的功能与 shell 脚本完全相同。 当我使用 PHP 的 shell_exec 调用
这个问题在这里已经有了答案: PHP shell_exec wait for script to finish? [duplicate] (1 个回答) 7年前关闭。 我有一个 PHP 脚本,它查询数
所以我通读了这篇文章:https://trac.ffmpeg.org/wiki/PHP 发现了这个: /dev/null 2>/dev/null &"); echo "Done.\n"; 代码几乎可以
我很难过似乎一切都正确不知道为什么会出错 /dev/null 2>/var/log/ffmpeg.log &"); echo "Done.\n"; ?> 是的,这些代码在终端中运行 for i
我正在使用 PHP v7.2 并且当前安装的 CMS 具有通过 FFMPEG 自动为视频添加水印的功能。 它使用“shell_exec”运行 FFMPEG。“shell_exec 和 exec”没有本
我已添加此行 PATH DEFAULT=${PATH}:~/bin/到~/.pam_environment这让我可以调用ffmpeg来自没有路径的命令行,显然在 ~/bin/ 中dir 所以只要我使用
我有一个 PHP 网站,我想在后台执行一个很长的 Python 脚本(300 MB 内存和 100 秒)。进程通信是通过数据库完成的:当 Python 脚本完成其工作时,它会更新数据库中的一个字段,然
用户通过 POST 提交数据后,我会显示一个临时页面并使用 shell_exec 在后台执行该过程,至少这就是我想要做的。 这是我的页面设置: C:\larragon\www\index.php C
我想通过 php 运行 php ../cat1/index.php gr_s2/3/gr-n40 1200 命令。结果 shell_exec 返回 NULL,但是当我在 cmd 上尝试该命令时,输出显
我在服务器上有一个 shell 脚本,我从 php 页面调用它,它是从数据库传输数据的 api 的一部分。 shell 脚本在我的服务器和位于数据库所在的防火墙后面的第三部分服务器之间设置端口绑定(b
我试图通过 PHP shell_exec 将一个字符串(从 PDO 查询提取到 MYSQL DB)传递给 *nix 程序,在本例中为 xtide . 一切正常,直到我传递一个包含撇号的字符串。 这适用
我正在尝试使用 shell_exec() 命令执行 java 文件,但输出格式与预期不符。这是详细信息 代码: echo shell_exec("java WekaExample"); 输出: A
我在使用 shell_exec 时遇到了一个有趣的奇怪问题... 描述 我开发了使用 C++ 后端应用程序进行计算的 PHP 网络应用程序。服务器在 linux 上运行,我使用 shell_exec
我在使用 PHP shell_exec() 时遇到问题。 背景:我使用 shell_exec() 通过 Web 浏览器访问嵌入式 Linux 目标 (即 Raspberry Pi),使用 HTML J
嗯,我知道已经有很多相关问题,但没有一个解决我的问题。在我的例子中,我想使用 shell_exec 函数,但是,我看到 shell_exec 函数没有定义,甚至没有在 php.ini 的 disabl
我正在尝试返回 Linux 环境中文件夹的内容。为此,我运行以下代码: //this line returns folders and files from current folder $reg =
我试图返回一个进程 ID 抛出一个 php.ini 文件。在 Linux 中,此命令返回进程 ID /receive.sh url=http://www.site.com cert=certs/tes
我有以下代码: $output = shell_exec("./Program $var1 $var2"); echo "$output"; 它不起作用但是 $output = shell_exec(
我是一名优秀的程序员,十分优秀!