Как найти домашний каталог пользователя в Perl?
Мне нужно проверить, существует ли файл в домашнем каталоге пользователя, поэтому используйте file check:
if ( -e "~/foo.txt" ) {
print "yes, it exists!" ;
}
хотя есть файл с именем фу.txt в домашнем каталоге пользователя Perl всегда жалуется, что нет такого файла или каталога. Когда я заменяю " ~ " на /главная/Джимми (допустим, пользователь-Джимми), затем Perl дает правильный вердикт.
Не могли бы вы объяснить, почему " ~ " не работает в Perl и скажите мне, что такое Perl находить домашний каталог пользователя?
5 ответов
~
- это bash
-изма, а не 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!
Я не уверен, как все пропустил File:: HomeDir. Это одна из тех трудных задач, которые кажутся легкими, потому что никто не знает обо всех глупых исключениях, о которых вы должны думать. Он не поставляется с Perl, поэтому вам нужно установить его самостоятельно.
когда вы знаете домашний каталог, создайте путь, который вам нужен с File:: Spec:
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!";
}