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

2024-02-09

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

echo shell_exec("which php");

我得到以下输出:

/usr/bin/php

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

 which php

我得到以下输出

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

我的问题是如何让 shell_exec 就像命令在 mac 终端内运行一样?

注意:我已经安装了 ZSH


简短回答:

这不会起作用(可靠地)。

长答案:

问题有三个:

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

To see 1.您可以通过 echo 打印正在运行的 shell 的名称$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

Unless sh链接到zsh,这意味着,如果您想使用 zsh 内置命令,您必须使用以下命令运行命令zsh:

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

这开始/bin/sh,这又开始zsh,然后运行该命令。

虽然您可以使用 PHP 来解决sh,第二个问题更严重:别名只能在定义它们的实例中设置。大多数时候,这种情况发生在某些配置文件中(例如~/.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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果命令在 mac 终端内运行,如何让 shell_exec 表现得像命令一样? 的相关文章

随机推荐

  • 来自 ngFor angular2 的拼接元素

    我正在从后端请求位置列表并将其用于ngFor但是我想删除第一个数组元素 说我要删除Id 0所以在我看来不会这样li元素 这是我正在渲染并想要删除的列表数组StoreHouse Id 0 StoreLocation StoreHouse Id
  • ckeditor 不读取媒体嵌入代码

    我使用 ckeditor 的媒体嵌入插件 它工作正常 代码正确保存在数据库和 youtube soundcloud 等中 页面上播放器显示正常 但是 当用户进入他可以编辑信息的管理页面时 内部和带有标签的文本不会显示 因此当用户单击 保存
  • 指向零长度数组的指针的属性

    Consider int main auto a new int 0 delete a So there s no memory leak 在复制初始化和删除之间 是否允许读取指针a 1 此外 该语言是否允许编译器设置a to nullpt
  • 如何在 Azure API 管理中导入 swagger

    我看到一些文章和视频 其中导入了 Swagger 但随着新的 UI 更改 我无法找到导入 Swagger 的位置 在视频参考中 它显示在 WADL 或 Swagger 选项中 现在我看不到 Swagger 选项 这个选项被删除了吗 您可以使
  • 通过 MSBuild 构建 Visual Studio 2015 C++ 项目 (v140) 失败 - 找不到 v140

    我并排安装了 Visual Studio 2013 和 2015 我刚刚将组合解决方案 C C C CLI 升级到 2015 并将 Platform Toolset 设置为 v140 Visual Studio 中的构建工作正常 但无法从
  • 查询 XML 而忽略名称空间?

    我试图在忽略命名空间的同时查询 XML 因为结果集有多个命名空间 我已经到达 DataSets 节点 但我不知道如何获取多个 DataSourceName CommandType CommandText 理想情况下我想要 DataSetNa
  • 通过OData读取数据:如何通过curl/RCurl指定身份验证方案?

    我想通过 HTTPS 读取一些数据OData http www odata org 连接和数据源需要Basic认证方案 我很熟悉平常的curl http curl haxx se RCurl http cran r project org
  • 无法使用项目列表(数组)读取自定义事实

    我创建了自定义事实 gt etc ansible facts d hdfs fact 当我使用以下命令运行剧本时 debug var ansible local hdfs run once true 我如预期得到以下答案 PLAY all
  • 管理 Google 地图 API 密钥

    我的应用程序使用大量 MapView 屏幕 我正在尝试找出如何管理调试环境和生产环境之间的 API 密钥 显然 无法更改 Eclipse 中的调试应用程序密钥 因此我必须在该环境中使用调试映射 API 密钥 相反 如果没有生产应用程序密钥
  • AS3 处理任意大文件

    我正在尝试读取 AS3 中的一个非常大的文件 但我遇到了运行时崩溃的问题 我目前正在使用文件流 http help adobe com en US Flex 4 0 langref flash filesystem FileStream h
  • NHibernate.LazyInitializationException

    我们一直偶尔会出现这个问题 但现在我每次都可以重现它 我正在增加自定义论坛上的查看计数器 这会导致错误 NHibernate LazyInitializationException 未能延迟初始化集合 没有会话或会话被关闭 此错误发生在对象
  • 从 virtualenv 中启动 wsgi 应用程序作为 Linux 系统服务

    我目前正在 virtualenv 中开发一个 Bottle 应用程序 我打算使用 bjoern WSGI 服务器来提供它 但这可能并不重要 我还打算使用 lighty 或 nginx 反向代理来为应用程序提供服务 无论如何 应用程序可以作为
  • ECS任务如何知道在哪个区域运行?

    我有一个在 ECS 启动的任务中使用 boto3 的 python 应用程序 在 docker 容器中 我使用的 boto3 命令需要一个区域才能正常工作 但我只知道运行时的区域 多区域应用程序 当时的想法是定义AWS DEFAULT RE
  • 在 if 条件下改变字符串变量

    我使用这个程序将输入 mm 作为一年中的月份并打印出月份的名称 include
  • 如何根据 UIAlertController 中的 UITextField 禁用 UIAlertAction?

    我正在使用一个UIAlertController向用户呈现一个对话框以输入5 位 CRN 我想要Add按钮将被禁用 直到字段中有五位且仅有五位数字 UITextField 用户界面如下所示 以下是为以下内容设置的属性UIAlertContr
  • 如何从 docker 镜像中删除 ENV 设置

    我有一个设置 HOME 和 PATH 的 docker 映像 config HOME 我知道我可以替换它 但是是否可以删除它 并使用正常的 bash 配置文件设置 我不想通过破解 shell 配置文件来覆盖它 我无法让 creack 的答案
  • Java 6正则表达式一组的多个匹配

    这是简单的模式 key value1 value2 value3 valueN 我想得到 key 值数组 这是我的正则表达式 这是我的文字 foo a b c d Matcher给了我 2 组 foo 作为键 和d 作为值 如果我使用 代替
  • Java 硬件中断处理

    我想知道当硬件中断发生时是否可以自动调用Java方法 可能还有其他选择 我正在做类似的事情 在一个应用程序中 我监视 4 只鼠标的点击情况 这些点击会产生中断 但我很高兴不直接从 Java 处理它们 在Linux下 原来有设备文件 dev
  • 检查角度 2 中是否存在路线

    我想检查角度项目中是否存在路线 例如用户类型http localhost 4200 timestamp在网址栏中和timestamp项目中不存在 如何在不重定向的情况下进行检查 Sajeetharan 的回答涉及router config是
  • 如果命令在 mac 终端内运行,如何让 shell_exec 表现得像命令一样?

    当我在 php 脚本中运行命令时 echo shell exec which php 我得到以下输出 usr bin php 但是 当在 mac 终端中运行相同的命令时 which php 我得到以下输出 php aliased to Ap