文件文档::基名说基名怪癖 - 它们是什么
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.
这些是什么怪癖?
文件文档::基名说基名怪癖 - 它们是什么
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.
这些是什么怪癖?
实际上,怪癖在文档中记录用于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#dirname 的dirname
的怪癖是离奇得多,依靠的$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;
}
}
真的很有帮助的答案。正如其他答案中提到的那样,我看错了地方。 – justintime 2012-07-26 05:25:13
怪癖都记录在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".
我相信这个问题是关于所提到的'File :: Basename' perl模块的功能,而不是shell自己编写的程序,所以他们的手册不一定会回答这个问题(尽管在这种情况下它们看起来像取决于你的供应商) 。 – rafl 2010-09-09 08:58:53
@rafl:我明白'查看每个函数的文档的细节'来表示shell文档。 – Zaid 2010-09-09 09:24:31
@陪我一样。我去了“男人基地”等,并没有觉得任何明智之举。声明“查看每个函数的文档”真是令人困惑,因为它刚刚讨论了C和shell函数。 – justintime 2012-07-26 05:21:33
你看过每个函数文档的细节,还是真的是你的问题“我如何看待shell和C函数的文档?”。当你得到的答案只是从文档中复制粘贴的摘录时,你必须考虑你是否懒得做自己的工作。 – 2010-09-09 10:56:11