web-dev-qa-db-fra.com

Comment trouver le répertoire personnel d'un utilisateur en Perl?

J'ai besoin de vérifier si un fichier dans le répertoire personnel d'un utilisateur existe donc utilisez la vérification des fichiers:

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

Même s'il existe un fichier appelé foo.txt sous le répertoire personnel de l'utilisateur, Perl se plaint toujours qu'il n'existe pas de fichier ou répertoire de ce type. Quand je remplace "~" par / home/jimmy (disons que l'utilisateur est jimmy) alors Perl donne le bon verdict.

Pourriez-vous expliquer pourquoi "~" ne fonctionne pas en Perl et me dire comment Perl peut trouver le répertoire personnel d'un utilisateur?

50
Haiyuan Zhang

~ est un bash- isme plutôt qu'un Perl- isme, c'est pourquoi cela ne fonctionne pas. Étant donné que vous semblez être sur un système de type UNIX, la solution la plus simple consiste probablement à utiliser le $HOME variable d'environnement, telle que:

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

Et oui, je sais que l'utilisateur peut changer son $HOME variable d'environnement mais je suppose qu'ils savent ce qu'ils font. Sinon, ils méritent tout ce qu'ils obtiennent :-)

Si vous voulez le faire de la bonne façon , vous pouvez regarder File :: HomeDir , qui est beaucoup plus de plate-forme -savvy. Vous pouvez le voir en action dans le script suivant 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";
}

et transcription:

 pax $ touch ~/foo.txt; Perl chkfile.pl 
 Oui, il existe! 
 
 Pax $ rm -rf ~/foo.txt; Perl chkfile.pl 
 Non, ce n'est pas le cas! 
68
paxdiablo

Je ne sais pas comment tout le monde a manqué File :: HomeDir . C'est l'une de ces tâches difficiles qui semblent faciles, car personne ne connaît toutes les exceptions loufoques auxquelles vous devez penser. Il n'est pas fourni avec Perl, vous devez donc l'installer vous-même.

Une fois que vous connaissez le répertoire personnel, construisez le chemin dont vous avez besoin avec File :: Spec :

 use File::HomeDir qw(home);
 use File::Spec::Functions qw(catfile);

 print "The path is ", catfile( home(), 'foo.txt' ), "\n";
57
brian d foy

Vous pouvez glob le tilde, glob('~/foo.txt') devrait fonctionner. Ou vous pouvez utiliser le module File :: Save :: Home qui devrait également prendre en charge d'autres systèmes.

15
zoul

Le répertoire personnel d'un utilisateur est stocké dans /etc/passwd. La meilleure façon d'accéder aux informations est le getpw* fonctions :

#!/usr/bin/Perl 

use strict;
use warnings;

print "uid:", (getpwuid 501)[7], "\n",
    "name:", (getpwnam "cowens")[7], "\n";

Pour résoudre votre problème spécifique, essayez ce code:

if ( -e (getpwuid $>)[7] . "/foo.txt" ) {
   print "yes ,it exists!";
}
11
Chas. Owens
7
phoebus