Como faço para encontrar o diretório home do usuário em Perl?
-
16-09-2019 - |
Pergunta
Eu preciso verificar se um arquivo no diretório home de um usuário existe para verificação de arquivo de uso:
if ( -e "~/foo.txt" ) {
print "yes, it exists!" ;
}
Mesmo que haja um arquivo chamado foo.txt no diretório home do usuário, Perl sempre reclama que não existe tal arquivo ou diretório. Quando eu substituir "~" com / home / jimmy (digamos que o usuário é jimmy), em seguida, Perl dar o veredicto direita.
Você poderia explicar por que "~" trabalho dosen't em Perl e me diga o que é a maneira do Perl para encontrar o diretório home do usuário?
Solução
~
é um bash
-ism em vez de um perl
-ismo, é por isso que ele não está funcionando. Dado que você parece estar em um sistema do tipo UNIX, provavelmente o mais fácil solução é usar a variável de ambiente $HOME
, tais como:
if ( -e $ENV{"HOME"} . "/foo.txt" ) {
print "yes ,it exists!" ;
}
E sim, eu sei que o usuário pode alterar sua variável de ambiente $HOME
mas então eu diria que eles sabem o que estão fazendo. Se não, eles merecem tudo o que tem: -)
Se você quiser fazê-lo da direito maneira, você pode olhar em File :: HomeDir , que é muito mais plataforma-savvy. Você pode vê-lo em ação na seguinte chkfile.pl
script:
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";
}
e transcrição:
pax$ touch ~/foo.txt ; perl chkfile.pl Yes, it exists! pax$ rm -rf ~/foo.txt ; perl chkfile.pl No, it doesn't!
Outras dicas
Eu não tenho certeza que todo mundo perdeu :: HomeDir . É uma daquelas tarefas difíceis que o som fácil, porque ninguém sabe sobre todas as exceções patetas que você tem que pensar. Ele não vem com o Perl, então você precisa instalá-lo sozinho.
Depois de saber o diretório home, construir o caminho que você precisa com File :: Spec :
use File::HomeDir qw(home);
use File::Spec::Functions qw(catfile);
print "The path is ", catfile( home(), 'foo.txt' ), "\n";
Você pode glob o til, glob('~/foo.txt')
deve funcionar. Ou você pode usar o File :: Guardar :: Home módulo que deve também cuidar de outros sistemas.
O diretório home para o usuário é armazenado em /etc/passwd
. A melhor maneira de chegar à informação é a getpw*
funções :
#!/usr/bin/perl
use strict;
use warnings;
print "uid:", (getpwuid 501)[7], "\n",
"name:", (getpwnam "cowens")[7], "\n";
Para resolver o seu problema específico, tente este código:
if ( -e (getpwuid $>)[7] . "/foo.txt" ) {
print "yes ,it exists!";
}
Tente File::Path::Expand
.