Perl命令与readlink的行为相同?

时间:2013-09-25 10:05:53

标签: perl gnu-coreutils

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

  

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

2 个答案:

答案 0 :(得分:8)

您可以使用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:

答案 1 :(得分:0)

作为Perl的新秀,我很高兴地说我自己已经找到了这个STDIN解决方案(经过多次尝试,请记住Perl的学习曲线已知很陡)。 毫无疑问,devnull的解决方案很棒,但根据我的口味,它有点过于“潦草” - 而我有时只想管道 perl one-liner到echo' ed字符串,像这样:

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

因为周围可能有更多人想知道如何编码这种管道形式(让perl从STDIN读取参数),我决定也在这里发布。