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 № 1moż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
}