Как получить bash встроенные команды с помощью Perl - PullRequest
2 голосов
/ 24 мая 2011

Мне было интересно, есть ли способ получить команды Linux с помощью сценария PerlЯ говорю о таких командах, как cd ls ll clear cp

Ответы [ 4 ]

6 голосов
/ 24 мая 2011

Вы можете выполнять системные команды различными способами, некоторые лучше, чем другие.

  • Использование system();, которое печатает выходные данные команды, но не возвращает выходные данные в сценарий Perl.
  • Использование обратных галочек (``), которые ничего не печатают, но возвращают вывод скрипту Perl. Альтернативой использованию настоящих обратных галочек является использование функции qx();, которая легче читается и выполняет то же самое.
  • Использование exec();, которое делает то же самое, что и system();, но вообще не возвращается к сценарию Perl, если только команда не существует или не выполняется.
  • Использование open();, которое позволяет вам либо направить ввод из вашего скрипта в команду, либо прочитать вывод команды в ваш скрипт.

Важно отметить, что перечисленные вами системные команды, такие как cp и ls, намного лучше выполняются с использованием встроенных функций в самом Perl. Любой системный вызов - это медленный процесс, поэтому используйте встроенные функции, когда желаемый результат является чем-то простым, например, копирование файла.

Некоторые примеры:

# Prints the output. Don't do this.
system("ls");

# Saves the output to a variable. Don't do this.
$lsResults = `ls`;

# Something like this is more useful.
system("imgcvt", "-f", "sgi", "-t", "tiff", "Image.sgi", "NewImage.tiff");

На этой странице более подробно объясняются различные способы выполнения системных вызовов.

2 голосов
/ 24 мая 2011

Вы можете, как говорит Войтос, использовать либо system(), либо обратные галочки.Однако учтите, что это не рекомендуется, и , что, например, cd не будет работать (фактически не изменит каталог).Обратите внимание, что эти команды выполняются в новой оболочке и не влияют на работающий скрипт perl.

Я бы не стал полагаться на эти команды и попытаться реализовать ваш скрипт на Perl (еслив любом случае вы решили использовать Perl).Фактически, Perl был спроектирован, чтобы быть мощной заменой sh и других оболочек UNIX для системных администраторов.

0 голосов
/ 13 апреля 2013

Проблема в том, что perl пытается выполнить встроенную функцию bash (т. Е. source, ...), как если бы они были настоящими файлами, но perl не может найти их, так как их нет. Ответ заключается в том, чтобы указать Perl, что выполнять явно. В случае встроенных команд bash, таких как source, выполните следующие действия, и все будет работать нормально.

my $XYZZY=`bash -c "source SOME-FILE; DO_SOMETHING_ELSE; ..."`;

of для случая cd сделать что-то вроде следующего.

my $LOCATION=`bash -c "cd /etc/init.d; pwd"`;
0 голосов
/ 24 мая 2011

Вы можете заключить команду в обратные галочки
`command`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...