Perl中的波浪号(〜)目录

时间:2013-08-08 09:52:36

标签: perl directory

当我创建并检查是否存在带有波形符号的目录时,我在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中使用波浪号~符号的目录?

4 个答案:

答案 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/