如何在Perl中find用户的主目录?
我需要检查一个用户的主目录中的文件是否存在,所以使用文件检查:
if ( -e "~/foo.txt" ) { print "yes, it exists!" ; }
即使在用户的主目录下有一个名为foo.txt的文件,Perl总是抱怨没有这样的文件或目录。 当我用/ home / jimmyreplace“〜”(假设用户是jimmy),Perl给出正确的判决。
你能解释为什么“〜”不能在Perl中工作,并告诉我什么是Perl的方式来find用户的主目录?
~
是一种bash
主义而不是一种外来主义,这就是为什么它不起作用。 鉴于您似乎在UNIXtypes的系统上,可能最简单的解决scheme是使用$HOME
环境variables,如:
if ( -e $ENV{"HOME"} . "/foo.txt" ) { print "yes ,it exists!" ; }
是的,我知道用户可以更改他们的$HOME
环境variables,但是我会假设他们知道他们在做什么。 如果没有,他们应得的一切,他们得到:-)
如果你想以正确的方式做,你可以看看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 是的,它存在! pax $ rm -rf〜/ foo.txt; perl chkfile.pl 不,不是!
我不确定每个人都错过了File :: HomeDir 。 这听起来很容易,因为没有人知道你必须思考的所有愚蠢的例外。 它不会与Perl,所以你需要自己安装它。
一旦你知道了主目录,用File :: Spec构build你需要的path:
use File::HomeDir qw(home); use File::Spec::Functions qw(catfile); print "The path is ", catfile( home(), 'foo.txt' ), "\n";
你可以使用代字号, glob('~/foo.txt')
应该可以工作。 或者你可以使用File :: Save :: Home模块来处理其他系统。
用户的主目录存储在/etc/passwd
。 获取信息的最佳方法是getpw*
函数 :
#!/usr/bin/perl use strict; use warnings; print "uid:", (getpwuid 501)[7], "\n", "name:", (getpwnam "cowens")[7], "\n";
要解决您的具体问题,请尝试下面的代码:
if ( -e (getpwuid $>)[7] . "/foo.txt" ) { print "yes ,it exists!"; }
尝试File::Path::Expand
。