当我创建并检查是否存在带有波形符号的目录时,我在Perl脚本中发现了轻微的错误行为,如果我使用完整的/home/user
路径,则不会发生这种情况。当我第一次运行此脚本时,它会创建新目录。当我第二次运行它时,它无法识别目录的存在,并尝试再次创建它:
#!/usr/bin/perl
use strict;
my $outdir = '~/test';
my $cmd = "mkdir $outdir";
unless (-d $outdir) {
0 == system($cmd) or die "Error creating outdir $outdir\n $?";
}
1;
[~] $ rm test/ -rf
[~] $ perl dir.pl
[~] $ perl dir.pl
mkdir: cannot create directory `/home/avilella/test': File exists
Error creating outdir ~/test
256 at dir.pl line 7.
如何可靠地处理在Perl中使用波浪号~
符号的目录?
答案 0 :(得分:11)
波浪号由 shell 解释为您的主目录。
因此,Perl的-d
运算符会在shell调用~
中看到不同的东西(名为'mkdir ~/whatever'
的文件/目录)(将~
扩展为/home/user
)。
我会尝试使用Perl函数来执行您的操作。您将避免产生新进程,并且将以一致的方式执行文件访问。
注意Perl的mkdir内置函数。另请注意 执行扩展〜字符的File::Glob模块(如果用户手动输入目录名,则可能很有用)
答案 1 :(得分:5)
您可以使用%ENV
主目录,即从shell导入的值:
my $home = $ENV{HOME};
您还应该知道mkdir
是Perl内置函数:
mkdir "$home/test" or die "Cannot create test: $!";
答案 2 :(得分:4)
~
由system
函数调用的shell解释。它是shell,用户的主目录替换~
。就Perl或内核而言,~
表示具有单字符名称的文件或目录,与任何其他字符一样。因此-d
完成的测试失败了,因为没有名为~
的目录。
如果您使用Perl的内置mkdir
函数而不是通过shell脚本调用外部命令,那么您将在此时遇到错误,因为目录~
不存在
用户的主目录几乎总是在环境变量HOME
中可用。如果您愿意,如果HOME
不存在,您可以回退查询用户数据库,但这是一种异常情况。如果它存在,请使用HOME
环境变量,因为有时将其更改为运行具有不同配置文件的程序是有用的,并且环境变量在实践中始终可用,而用户数据库可能由于某些配置中的网络故障(例如NIS或LDAP)。
my $home_directory = $ENV{HOME};
if (!defined $home_directory) {$home_directory = getpwuid($<);}
my $outdir = "$home_directory/test";
unless (-d $outdir) {
mkdir $outdir or die "Error creating $outdir: $!\n"
}
答案 3 :(得分:2)
您的脚本无法创建存在的目录。那是你向我们提出的错误:
[~] $ rm test/ -rf
[~] $ perl dir.pl
[~] $ perl dir.pl
mkdir: cannot create directory `/home/avilella/test': File exists
Error creating outdir ~/test
256 at dir.pl line 7.
问题在于删除行:
[~] $ rm test/ -rf
错了。像大多数命令一样,正确的语法是:
[~] $ <command> <options> <parameters>
所以它会是:
[~] $ rm -rf test/