Как я могу назвать команду оболочки в своем сценарии Perl?

Что было бы примером того, как я могу назвать команду оболочки, сказать'ls -a'в сценарии Perl и способе получить вывод команды также?

48
задан Peter Mortensen 19 April 2019 в 15:40
поделиться

6 ответов

Как запустить shell-скрипт из Perl-программы

1. Использование system system($command, @arguments);

Например:

system("sh", "script.sh", "--help" );

system("sh script.sh --help");

Система выполнит $команду с @аргументами и вернется к вашему сценарию по завершении. Вы можете проверить $! на наличие определенных ошибок, переданных в ОС внешним приложением. Прочитайте документацию по System, чтобы узнать о нюансах того, как различные вызовы немного отличаются друг от друга.

2. Использование exec

Этот способ очень похож на использование system, но при этом он будет завершит ваш скрипт при выполнении. Опять же, прочитайте документацию для exec для получения дополнительной информации.

3. Использование обратных знаков или qx//

my $output = `script.sh --option`;

my $output = qx/script.sh --option/;

Оператор обратного знака и его эквивалент qx// выделяют команду и опции внутри оператора и возвращают вывод команды в STDOUT по завершении работы.

Существуют также способы запуска внешних приложений через творческое использование open, но это продвинутое использование; подробнее читайте в документации.

70
ответ дан 7 November 2019 в 12:14
поделиться

Существует множество способов вызова команды shell из perl-скрипта, например:

  1. back tick (обратная галочка) ls, который перехватывает вывод и возвращает его вам.
  2. system system('ls');
  3. open

См. #17 здесь: советы по программированию на perl

6
ответ дан 7 November 2019 в 12:14
поделиться

Посмотрите на функцию open в Perl - особенно на варианты с использованием '|' (pipe) в аргументах. При правильном выполнении вы получите хэндл файла, который можно использовать для чтения вывода команды. Операторы обратного тика также делают это.

Возможно, вы также захотите проверить, имеет ли Perl доступ к функциям C, которые использует сама команда. Например, для ls -a можно использовать функцию opendir, затем прочитать имена файлов с помощью функции readdir, и, наконец, закрыть каталог с помощью (неожиданно) функции closedir. Это имеет ряд преимуществ - точность, вероятно, более важна, чем скорость. Используя эти функции, вы можете получить правильные данные, даже если имена файлов содержат странные символы, такие как новая строка.

11
ответ дан 7 November 2019 в 12:14
поделиться

Примеры

  1. `ls -l`;
  2. system("ls -l");
  3. exec("ls -l");
12
ответ дан 7 November 2019 в 12:14
поделиться

Вы можете изучить open2 и open3 , если вам нужна двунаправленная связь.

1
ответ дан 7 November 2019 в 12:14
поделиться

По мере того, как вы набираетесь опыта в использовании Perl, вы обнаружите, что все меньше и меньше случаев, когда вам нужно запускать команды оболочки. Например, один из способов получить список файлов - использовать встроенную в Perl функцию glob . Если вы хотите, чтобы список был отсортирован, вы можете объединить его со встроенной функцией sort . Если вам нужна подробная информация о каждом файле, вы можете использовать функцию stat . Вот пример:

#!/usr/bin/perl

use strict;
use warnings;

foreach my $file ( sort glob('/home/grant/*') ) {
    my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
        = stat($file);
    printf("%-40s %8u bytes\n", $file, $size);
}
8
ответ дан 7 November 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: