2013-09-25 9 views
1

Что такое эквивалентная команда Perl команде GNU coreutils readlink -f?Perl команда для такого же поведения, как readlink?

Если какой-либо компонент имени файла, за исключением последнего, отсутствует или недоступен, readlink не производит выход и выходит с ненулевым кодом завершения. Конечная косая черта игнорируется.

+0

примечание: readlink не является частью bash. –

+0

@ KarolyHorvath спасибо за разъяснение. – 719016

ответ

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: 
+0

Спасибо, я хотел убедиться, что 'Cwd abs_path' в Perl и GNU coreutils' readlink -f' имеют одинаковое поведение. – 719016

+0

@ 200508519211022689616937 Да. – devnull

+0

Появилась ошибка. Я исправил его и добавил тест. Обратите внимание, что поведение 'abs_path' может отличаться по типу системы. (Вы должны получить такое же поведение во всех системах unixy.) – ikegami

0

В общем новобранец Perl, я счастлив сказать, что у меня есть разобрался в этом решении STDIN один раз (после нескольких попыток, помните что кривая обучения Perl известна как крутая). Решение devnull было здорово, без сомнения, но это было немного слишком «Scriptish» на мой вкус - в то время как я иногда просто хочу трубы Perl-один вкладыш в строку echo «под ред, например:

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

Так как может быть больше людей, которые хотят знать о том, как закодировать такую ​​форму трубопровода (делая perl, прочитайте аргумент от STDIN), я решил опубликовать его здесь тоже.