当我创建并检查带有波形符号的目录是否存在时,我在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.
Run Code Online (Sandbox Code Playgroud)
如何可靠地处理~在Perl 中使用波形符号的目录?
Bri*_*new 11
尽管shell将波形符解释为您的主目录.
因此,Perl的-d运算符~会在shell调用中看到不同的东西(一个文件/目录调用)'mkdir ~/whatever'(扩展~为平均值/home/user).
我会尝试使用Perl函数来执行您的操作.您将避免生成新进程,并且将以一致的方式执行文件访问.
注意Perl的mkdir内置函数.另请注意File :: Glob模块,它执行〜字符的扩展(如果用户手动输入目录名,则可能很有用)
您可以使用%ENV主目录,即从shell导入的值:
my $home = $ENV{HOME};
Run Code Online (Sandbox Code Playgroud)
您还应该知道这mkdir是一个Perl内置函数:
mkdir "$home/test" or die "Cannot create test: $!";
Run Code Online (Sandbox Code Playgroud)
~由函数调用的 shell 解释system。~它是由用户的主目录替换的 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"
}
Run Code Online (Sandbox Code Playgroud)