【问题标题】:PHP - does this syntax actually execute the command?PHP - 这种语法实际上执行命令吗?
【发布时间】:2020-01-10 13:56:40
【问题描述】:

在尝试清理项目中的一些旧代码时,我遇到了以下几行:

$cmd = "mkdir -p ".dirname($target);
`$cmd`; // Auto creating folder if needed

我尝试在单独的脚本上运行它,但它没有创建文件夹(如我所料),但我想知道我是否遗漏了一些可以实际工作的东西?

注意:$cmd 不在其他任何地方使用

【问题讨论】:

  • 这仅适用于 Linux 和 Mac。允许您使用单个控制台命令而不是两个或多个控制台命令在当前位置和目标目录之间创建目录和中间目录。具有路径 /documents/priority/tests/ 的目录 - 如果您还没有完整的结构,通常您必须分三个阶段进行:mkdir 文档和 cd 文档,mkdir 优先级和 cd 优先级,最后是 mkdir测试。使用 -p 您可以在一行中完成: mkdir -p documents/priority/tests 如果缺少任何部分,它将创建整个目录树。
  • 反引号是 PHP 中的 execution operator。如文档中所示:“启用安全模式或禁用 shell_exec() 时,反引号运算符被禁用。”因此,您可能在其中一种(或两种)条件下运行它。

标签: php command


【解决方案1】:

就像其他成员已经说过的反引号是execution operator。您可以在“执行”之前使用echo 检查是否从命令中获得任何输出,如下所示:

$cmd = "mkdir -p ".dirname($target);
echo `$cmd`;

无论如何,恕我直言,使用反引号可能有点令人困惑,因此您可以使用shell_exec(),这更清楚那里发生了什么。例如:

$output = shell_exec("mkdir -p ".dirname($target));
echo "<pre>$output</pre>";

另一方面,你真的需要那样创建目录吗?您可以使用 mkdir() 函数替换它,例如文档中的以下调整示例:

if (!mkdir(dirname($target), 0777, true)) { // true argument stands for recursive - equivalent of -p in mkdir in linux command
    die('Failed to create folders...');
}
// mkdir() function returns boolean value so you can easily know if directory was created or not

关于创建目录的位置,我会查看当前工作目录的 dirname()$targetgetcwd() 函数返回的内容,看看是否一切都符合预期。

echo dirname($target);
echo getcwd();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多