ps -ww
fornece saída de largura ilimitada. Você pode usar tanto de sua linha de comando quanto desejar. Se você prefixar sua string para coincidir com [ ]
, o grep não corresponderá a si próprio. Se você adicionar -q ao grep, não haverá saída, mas você poderá usar o código de retorno: será 0 se for encontrado, 1 caso contrário. Então
if ps alxww | grep -q '[ ]/usr/bin/xpdf -remote myXpdfServer -title Bayes2_notes -papercolor cornsilk -geometry 1910x1019+0+29 /home/simon/research/Ward/Bayes2_notes.pdf'
then echo running
else echo not
fi
grep, na verdade, corresponde a padrões, não a seqüências exatas. Em um padrão, existem personagens "mágicos" que não se sustentam por si mesmos. Felizmente, a string de linha de comando para a qual você está procurando não possui caracteres mágicos, portanto, seu padrão corresponde exatamente à string. Alguns caracteres mágicos são [
, *
, .
, (
, +
. Em particular, o padrão [ ]
significa corresponder ao caractere de espaço. Portanto, é um padrão aparentemente sem sentido porque é exatamente o mesmo que um espaço sozinho: "".
Mas como você sabe, fazer um ps|grep string
encontrará o comando grep, bem como o comando que nos interessa. Mas usando [ ]
, o grep não irá mais corresponder ao seu próprio comando porque na saída do ps existe serão os 3 chars "[]" e não o único caracter "", então o padrão (1 espaço) não será compatível.
É um pouco difícil de entender. Você pode ler sobre padrões, chamados expressões regulares , em man grep
. Eles são incrivelmente úteis.
Quando você executa isRunning=$(ps -ef | grep -q '[ ]xpdf ')
, sua variável é definida como uma string vazia porque grep -q
não produz saída. O código de retorno do último comando executado pelo shell está disponível na variável $?
da shell. Será 0 para verdadeiro, ou seja, o grep correspondido ou diferente de zero (normalmente 1). O valor a esperar é mostrado na seção STATUS DE SAÍDA de man grep
.
Então, se você quiser manter o resultado que você pode fazer, por exemplo:
ps -ef | grep -q '[ ]xpdf '
isRunning=$?
if [ $isRunning = 0 ]
then echo "running. isRunning=$isRunning"
else echo "not. isRunning=$isRunning"
fi