Почему эта команда не принимает разность двух каталогов? - PullRequest
0 голосов
/ 05 ноября 2010

Меня просят показать две директории с помощью Perl, но я думаю, что с моей командой что-то не так,

$diff = system("sudo diff -r '/Volumes/$vol1' '/Volumes/$vol2\\ 1/' >> $diff.txt");

Она не отображается и не выводится.Может кто-то помочь мне с этим?Спасибо!

Ответы [ 4 ]

3 голосов
/ 05 ноября 2010

Кажется, что вы хотите сохранить все различия в строке.

Если это так, команда в вопросе не будет работать по нескольким причинам:

  • Трудно сказать, предназначено это или нет, но переменная $diff используется, чтобы установить имя файла, хранящее различия.Возможно, это должно быть diff.txt, а не $diff.txt

  • Результат команды diff сохраняется в $diff.txt.Он ничего не отображает в STDOUT.Это можно исправить, пропустив часть >> $diff.txt.Если он также должен быть сохранен в файле, рассмотрим команду tee:

    sudo diff -r dir1/ dir2/ | tee diff.txt
    
  • Когда переменной system назначается переменная,он вернет 0 в случае успеха.Чтобы процитировать документацию:

    Возвращаемое значение - это состояние выхода из программы, возвращаемое вызовом wait.

    Это означает, чточто $diff не будет хранить различия, но статус команды завершения.Более разумным подходом было бы использование обратных галочек.Это позволит $diff сохранить все, что выводится в STDOUT, командой:

    my $diff = `sudo diff -r dir1/ dir2/ | tee diff.txt`;  # Not $diff.txt
    
  • Обязательно ли использовать команду sudo?Избегайте его использования, даже если это возможно удаленно:

    my $diff = `diff -r dir1/ dir2/ | tee diff.txt`;  # Not $diff.txt
    

Окончательная рекомендация

Пусть хороший модуль CPAN позаботится об этой задаче, так какОбратные звонки могут идти только так далеко.Некоторые из них уже были предложены здесь;это может стоить посмотреть.

0 голосов
/ 05 ноября 2010

"Не отображается и не выводится."- это потому, что вы сохраняете различия в файл, а затем (предположительно) ничего не делаете с этим результирующим файлом.

Однако я ожидаю, что «diff двух каталогов с использованием Perl» не означает «использование *»1003 *, чтобы сделать это в оболочке, а затем захватить результаты ".Рассматривали ли вы сделать это на самом языке?Например, см. Text :: Diff .Для более детального контроля над тем, что составляет «разницу», вы можете просто прочитать в каждом файле и создать свой собственный алгоритм для выполнения сравнений и компиляции сходств и различий.

0 голосов
/ 05 ноября 2010

Возможно, вы захотите проверить Test::Differences для более гибкой реализации diff.

0 голосов
/ 05 ноября 2010

sudo diff запрашивает пароль? Если возможно, уберите sudo из вызова diff и запустите ваш скрипт с помощью sudo.

...