2

与 GNU coreutils 命令等效的 Perl 命令是readlink -f什么?

如果文件名的任何组成部分(最后一个除外)丢失或不可用,则 readlink 不产生任何输出并以非零退出代码退出。尾部斜杠被忽略。

4

2 回答 2

9

您可以使用Cwd

use Cwd 'abs_path';
my $path = "/some/arbitrary/path";
print abs_path($path);

测试:

for q in exists imaginary imarginary/imaginary ; do
   echo "$q"
   echo -n "readlink -f: " ; readlink -f "$q"
   echo -n "abs_path:    " ; perl -MCwd=abs_path -E'say abs_path $ARGV[0]' "$q"
   echo
done

输出:

exists
readlink -f: /home/eric/exists
abs_path:    /home/eric/exists

imaginary
readlink -f: /home/eric/imaginary
abs_path:    /home/eric/imaginary

imaginary/imaginary
readlink -f: abs_path:
于 2013-09-25T10:15:51.150 回答
0

作为一个 Perl 新手,我很高兴地说我自己已经想出了这个 STDIN 解决方案(经过多次尝试,请记住 Perl 的学习曲线是众所周知的陡峭)。毫无疑问, devnull的解决方案很棒,但它对我的口味来说有点太“脚本化”了——而我有时只想将perl 单行线传递给echo'ed 字符串,如下所示:

echo "/home/user/somesymlinkedpath" | perl -MCwd=abs_path -nle 'print abs_path $_'

因此,可能有更多的人想知道如何编写这种管道形式的代码(perl从 STDIN 读取参数),我决定也将其发布在这里。

于 2015-06-27T14:46:11.880 回答