perl - 如何在 Perl 中查找用户的主目录?

标签 perl home-directory tilde-expansion

我需要检查用户主目录中的文件是否存在,因此使用文件检查:

if ( -e "~/foo.txt" ) {
   print "yes, it exists!" ;
}

即使在用户的主目录下有一个名为 foo.txt 的文件,Perl 总是 提示没有这样的文件或目录。当我用 /home/jimmy 替换“~”时(假设用户是 jimmy),Perl 会给出正确的判断。

你能解释一下为什么“~”在 Perl 中不起作用并告诉我 Perl 的方法是什么吗 找到用户的主目录?

最佳答案

~ 是一个 bash-ism 而不是 perl-ism,这就是它不起作用的原因。鉴于您似乎使用的是 UNIX 类型的系统,最简单的解决方案可能是使用 $HOME 环境变量,例如:

if ( -e $ENV{"HOME"} . "/foo.txt" ) {
    print "yes ,it exists!" ;
}

是的,我知道用户可以更改他们的 $HOME 环境变量,但我会假设他们知道自己在做什么。如果没有,他们应得的一切:-)

如果您想以正确的方式进行操作,您可以查看 File::HomeDir ,这对平台更加了解。您可以在以下脚本 chkfile.pl 中看到它的运行情况:

use File::HomeDir;
$fileSpec = File::HomeDir->my_home . "/foo.txt";
if ( -e $fileSpec ) {
    print "Yes, it exists!\n";
} else {
    print "No, it doesn't!\n";
}

和文字记录:

pax$ touch ~/foo.txt ; perl chkfile.pl
Yes, it exists!

pax$ rm -rf ~/foo.txt ; perl chkfile.pl
No, it doesn't!

关于perl - 如何在 Perl 中查找用户的主目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1475357/

相关文章:

perl - 为什么带有 uwsgi_psgi 的 Perlbrew PSGI 应用程序会导致 "wrong"Perl 包含路径?

Linux VSFTPD : Jail a "Specific User" to its home?

java - 从 JWS 签名的 jar 中获取用户主文件夹

bash - 路径中的波浪号不会扩展到主目录

linux - 环境变量中的波浪号扩展

python - Perl 到 Python 正则表达式需要帮助

perl - 当我只期待一个匹配时,我可以将 grep(或 map)限制为第一个匹配吗?

perl - 如何在 Perl Linux 中为文本添加下划线?

java - 安装Maven 3.3.9,如何设置M2_HOME、MAVEN_HOME和bin文件夹?

bash - 如何手动扩展特殊变量(例如 : ~ tilde) in bash