/ / Jak ustalić, czy polecenie powłoki nie działało ani nie wygenerowało wyjścia - perl, shell, unix

Jak ustalić, czy polecenie powłoki nie działało, czy nie generowało wyjścia - perl, shell, unix

Wykonuję niektóre polecenia powłoki za pomocą skryptu Perla i przechwytywam dane wyjściowe, w ten sposób,

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

Sprawdzam również, czy polecenie działa poprawnie, czy nie,

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

Zwykle działa i otrzymuję wynik poprawnie. Problem polega na tym, że w niektórych przypadkach samo polecenie nie generuje żadnych wyników. Na przykład czasami tekst, który próbuję grep nie będzie obecny w pliku docelowym, więc w rezultacie nie zostaną dostarczone żadne wyniki. W tym przypadku mój skrypt wykrywa to jako „polecenie nie uruchamia się”, podczas gdy nie jest to prawda.

Jaki jest właściwy sposób na odróżnienie tych dwóch przypadków w Perlu?

Odpowiedzi:

5 dla odpowiedzi № 1

możesz użyć tego, aby dowiedzieć się, czy polecenie nie powiodło się, czy polecenie nie zwraca niczego

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

załóżmy, że text.txt zawiera „123ab”, z którego chcesz uzyskać tylko numer.


1 dla odpowiedzi nr 2

Posługiwać się $? aby sprawdzić, czy polecenie zostało wykonane pomyślnie: patrz backticks nie zwracają żadnej wartości w perlu dla przykładu.


1 dla odpowiedzi nr 3

Jeśli nie jesteś do niczego |grep możesz sprawdzić $? w celu uzyskania bardziej szczegółowego statusu wyjścia,

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

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