2010-09-09 212 views
1

文件文档::基名说基名怪癖 - 它们是什么

NOTE: "dirname()" and "basename()" emulate the behaviours, and quirks, 
of the shell and C functions of the same name. See each function's 
documentation for details. 

这些是什么怪癖?

+5

你看过每个函数文档的细节,还是真的是你的问题“我如何看待shell和C函数的文档?”。当你得到的答案只是从文档中复制粘贴的摘录时,你必须考虑你是否懒得做自己的工作。 – 2010-09-09 10:56:11

回答

1

实际上,怪癖在文档中记录用于Perl函数本身。 http://search.cpan.org/~rjbs/perl-5.16.0/lib/File/Basename.pm#basename

此功能被提供用于与Unix外壳 命令基名(1)的相容性。它并不总是像您期望的那样返回路径的文件名部分 。 ... basename()返回文件路径的最后一个层次 ,即使最后一层明显是目录。 ...还有 请注意,为了与shell命令兼容,basename() 如果与文件名中剩余的 字符相同,则不会剥离后缀。

换句话说,basename("dir/")"dir/",不"";和basename("dir/.txt", ".txt")".txt",而不是""

http://search.cpan.org/~rjbs/perl-5.16.0/lib/File/Basename.pm#dirnamedirname的怪癖是离奇得多,依靠的$File::Basename::Fileparse_fstype当前值。我只是在这里粘贴代码,因为它很短。

sub dirname { 
    my $path = shift; 
    my($type) = $Fileparse_fstype; 
    if($type eq 'VMS' and $path =~ m{/}) { 
     # Parse as Unix 
     local($File::Basename::Fileparse_fstype) = ''; 
     return dirname($path); 
    } 

    my($basename, $dirname) = fileparse($path); 

    if ($type eq 'VMS') { 
     $dirname ||= $ENV{DEFAULT}; 
    } elsif ($type eq 'MacOS') { 
     if(!length($basename) && $dirname !~ /^[^:]+:\z/) { 
      _strip_trailing_sep($dirname); 
      ($basename,$dirname) = fileparse $dirname; 
     } 
     $dirname .= ":" unless $dirname =~ /:\z/; 
    } elsif (grep { $type eq $_ } qw(MSDOS DOS MSWin32 OS2)) { 
     _strip_trailing_sep($dirname); 
     unless(length($basename)) { 
      ($basename,$dirname) = fileparse $dirname; 
      _strip_trailing_sep($dirname); 
     } 
    } elsif ($type eq 'AmigaOS') { 
     if ($dirname =~ /:\z/) { return $dirname } 
     chop $dirname; 
     $dirname =~ s{[^:/]+\z}{} unless length($basename); 
    } else { 
     _strip_trailing_sep($dirname); 
     unless(length($basename)) { 
      ($basename,$dirname) = fileparse $dirname; 
      _strip_trailing_sep($dirname); 
     } 
    } 

    $dirname; 
} 


# Strip the trailing path separator. 
sub _strip_trailing_sep { 
    my $type = $Fileparse_fstype; 
    if ($type eq 'MacOS') { 
     $_[0] =~ s/([^:]):\z/$1/s; 
    } elsif (grep { $type eq $_ } qw(MSDOS DOS MSWin32 OS2)) { 
     $_[0] =~ s/([^:])[\\\/]*\z/$1/; 
    } else { 
     $_[0] =~ s{(.)/*\z}{$1}s; 
    } 
} 
+0

真的很有帮助的答案。正如其他答案中提到的那样,我看错了地方。 – justintime 2012-07-26 05:25:13

1

怪癖都记录在man页每个功能:


man dirname 

说明

打印名称与其拖尾/组件移除;如果NAME包含 否,则输出'。' (意思是当前目录 )。

实施例

dirname /usr/bin/sort 
     Output "/usr/bin". 

dirname stdio.h 
     Output ".". 

man basename 

说明

打印名称与任何前导目录 部件移除。如果指定, 也会删除尾随后缀。

实施例

basename /usr/bin/sort 
     Output "sort". 

basename include/stdio.h .h 
     Output "stdio". 
+0

我相信这个问题是关于所提到的'File :: Basename' perl模块的功能,而不是shell自己编写的程序,所以他们的手册不一定会回答这个问题(尽管在这种情况下它们看起来像取决于你的供应商) 。 – rafl 2010-09-09 08:58:53

+2

@rafl:我明白'查看每个函数的文档的细节'来表示shell文档。 – Zaid 2010-09-09 09:24:31

+0

@陪我一样。我去了“男人基地”等,并没有觉得任何明智之举。声明“查看每个函数的文档”真是令人困惑,因为它刚刚讨论了C和shell函数。 – justintime 2012-07-26 05:21:33