使用Perl检查~/中是否存在目录

5

我注意到使用-d标志来检查文件是否是目录以及目录是否存在的行为很奇怪。如果我使用~/my_dir作为路径,它的行为会有所不同。

以下代码将返回false,即使目录my_dir存在,但如果我将其更改为完整路径,如/home/ricky/my_dir,则if语句将返回true。

#!/usr/bin/perl -w
#
use strict;

if ( -d "~/my_dir") {
    print "Found \n";
}
else {
    print "Not found \n";
}

有什么区别?


请参考以下链接:http://stackoverflow.com/questions/976968/why-does-my-perl-script-fail-on-but-works-with-envhome 和 https://dev59.com/N1HTa4cB1Zd3GeqPRnnt - devnull
还可以尝试使用 ls "~/mydir" 命令 - 你会发现其中的 区别 - devnull
谢谢,那些解决方案使用了我总是试图避免的其他模块,但我明白了 :) - Ricky Levi
3个回答

12

~ 是表示主目录的 shell 快捷方式,它对 perl 来说是未知的。你必须在这里使用环境变量 HOME -- 比如使用 "$ENV{HOME}/my_dir"


顺便提一下,在使用“system”函数时,与使用反引号符号的区别在于,“~/”可以在“system”函数中正常工作。我刚刚发现这也是一个区别……(符号链接也有同样的问题)-感谢你的答案 :) - Ricky Levi
即使是对于系统来说也是未知的。Perl对路径不做任何处理,而只是将其传递给系统。 - ikegami
@Ricky 这是因为 system 函数运行 /bin/sh,它会在你的命令行上执行其 shell 替换。 - aschepler
@aschepler 我刚刚运行了 system('echo $SHELL'),它显示的是 /bin/bash,所以我不确定这是否正确。 - Ricky Levi
那只是环境变量。尝试使用 system(q(ps $$)) - aschepler
@aschepler 我不确定我应该看到什么...这是输出 17507 pts/0 R+ 0:00 ps 17507 - Ricky Levi

5

~ 不是一个真正的路径。像 /bin/bash 这样的 shell 会将其扩展为环境变量 $HOME 的值,但是 Perl 不会。因此,你应该使用类似以下方式:

if ( -d "$ENV{HOME}/my_dir" ) {
    ...
}

-2
你可以通过执行chdir命令来检查。 如果目录不存在,chdir "dir_name"将返回0。如果目录存在,则返回1。

1
“-d” 是判断目录是否存在的正确方式。chdir 会改变到该目录,如果 dir_name 是一个目录但你没有权限进入它,它也会失败。这并没有解决 OP 的问题,即使用了“~”。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接