当使用路径中带有〜,波浪号的file_exists()返回false

时间:2018-11-26 23:58:50

标签: php

所以我有以下路径:/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?的副本,因为我更好奇为什么波浪线不起作用,而不是如何变通。

2 个答案:

答案 0 :(得分:1)

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

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

  

shell是命令语言解释器。本章描述了sh实用程序以及POSIX.1-2017的系统接口卷中定义的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;

答案 1 :(得分:0)

$home_dir = exec( 'echo ~' ) ;