Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Как запустить оболочку script из программы Perl

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

Например:

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

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

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

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

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

3. Использование backticks или qx//

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

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

Оператор backtick и его эквивалент qx//вызывают команду и параметры внутри оператора и return, что команды выводятся в STDOUT, когда он заканчивается.

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

Ответ 2

Из Perl HowTo наиболее распространенными способами выполнения внешних команд из Perl являются:

  • my $files = `ls -la` - отображает вывод команды в $files
  • system "touch ~/foo" - если вы не хотите записывать вывод команды
  • exec "vim ~/foo" - если вы не хотите возвращаться к script после выполнения команды
  • open(my $file, '|-', "grep foo"); print $file "foo\nbar" - если вы хотите подключить вход в команду

Ответ 3

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

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

Ответ 4

Примеры

  • `ls -l`;
  • system("ls -l");
  • exec("ls -l");

Ответ 5

По мере того как вы становитесь более опытными с использованием 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);
}

Ответ 6

Существует много способов вызвать команду оболочки из perl script, например:

  • назад тик       ls, который фиксирует вывод и возвращает вам.
  • Система      Система ( 'LS');
  • откройте

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

Ответ 7

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