【问题标题】:file_exists() returns false when using path with ~, tilde in itfile_exists() 使用带有 ~ 的路径时返回 false,其中包含波浪号
【发布时间】:2018-11-26 23:58:50
【问题描述】:

所以我有以下路径:/my_user/path/to/dir,当我将它传递给file_exists()时,它工作正常。

但是,当我将其更改为 ~username/path/to/dir 时,它返回 false。

realpath("~username/path/to/dir") 也返回 false。

可能有什么问题?

注意:这不是How to get the home directory from a PHP CLI script? 的重复,因为我更好奇为什么波浪号不起作用,而不是如何解决它。

【问题讨论】:

  • 是否需要在~后面加一个/?例如~/username/path/to/dir
  • 没有。 ls ~/username/path/to/dir 工作正常,cd
  • 我的意思是在你的 PHP 中,而不是在终端中。
  • OS X 命令行术语中的波浪符号 (~) 指的是您的主目录,例如 /Users/Joe。你不能用这个代替吗?它可能不知道~是什么意思。
  • @Davіd 不,还是不行……

标签: php


【解决方案1】:
$home_dir = exec( 'echo ~' ) ;

【讨论】:

    【解决方案2】:

    波浪号扩展是一个 shell 功能,因此它不能在 shell(或开发人员选择在其中实现此 shell 功能的另一个程序)的上下文之外使用,因为它不是文件系统或任何其他程序所固有的操作系统的一部分。

    行为在section 2.6.1 of the POSIX specification 中定义。该章的引言指出:

    shell 是一个命令语言解释器。本章描述了该命令语言的语法,因为它被 POSIX.1-2017 的系统接口卷中定义的sh 实用程序和system()popen() 函数使用。


    如果你想使用这样的文件名,你可以使用 PHP 的一些内置函数来扩展它:

    <?php
    $dir = "~username/bar/baz/";
    $dirparts = explode("/", $dir);
    array_walk(
        $dirparts,
        function(&$v, $k) {
            if ($v[0] ?? "" === "~") $v = posix_getpwnam(substr($v, 1))["dir"] ?? $v;
        }
    );
    $expanded = implode("/", $dirparts);
    echo $expanded;
    

    【讨论】:

    • 很好的解决方案/解决方法。但是,为了保持代码的简洁和可读性,我只是决定简单地使用 posix_getpwnam(username)['dir'] 并在这里完全放弃使用波浪号。
    猜你喜欢
    • 2011-03-05
    • 2016-05-28
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2012-01-31
    • 2019-06-01
    • 2014-03-30
    • 2012-07-15
    相关资源
    最近更新 更多