/ / Як визначити, чи не виконувалася команда оболонки або не вироблялося жодного виводу - perl, shell, unix

Як визначити, чи не виконується команда shell або не виводиться вихідний файл - perl, shell, unix

Я виконую деякі команди оболонки через скрипт perl і захоплюючи вихід, наприклад,

$commandOutput = `cat /path/to/file | grep "some text"`;

Я також перевіряю, чи команда виконана успішно чи ні,

if(!$commandOutput)
{
# command not run!
}
else
{
# further processing
}

Як правило, це працює, і я отримую вихід правильно. Проблема в тому, що в деяких випадках сама команда не виробляє жодного виводу. Наприклад, іноді текст, який я намагаюся grep не буде присутній у цільовому файлі, тому результат не буде наданий. У цьому випадку мій скрипт виявляє це як "команда не запускається", тоді як його невірно.

Який правильний спосіб диференціювати ці два випадки в perl?

Відповіді:

5 за відповідь № 1

Ви можете використовувати цю функцію, щоб дізнатися, чи не вдалося виконати команду, або команда нічого не повертає

$val = `cat text.txt | grep -o "[0-9]*"`;
print "command failed" if (!$?);
print "empty string" if(! length($val) );
print "val = $val";

припустимо, що text.txt містить "123ab", з якого потрібно отримати тільки номер.


1 для відповіді № 2

Використовуйте $? перевірити, чи успішно виконана команда: див backticks не повертають жодного значення в perl для прикладу.


1 для відповіді № 3

Якщо ви не підключаєтеся |grep Ви можете перевірити $? для більш конкретного статусу виходу,

my $commandOutput = `grep "some text" /path/to/file`;

if ($? < 0)
{
# command not run!
}
elsif ($? >> 8 > 1)
{
# file not found
}
else
{
# further processing
}