Evitando que o script bash seja encerrado após o erro do comando

0

Eu tenho um script que executa um comando que gera várias linhas de texto:

qmicli -d /dev/cdc-wdm0 --nas-get-serving-system

quais saídas:

Registration state: 'registered'
    CS: 'detached'
    PS: 'detached'
    Selected network: 'unknown'
    Radio interfaces: '1'
            [0]: 'none'
    Data service capabilities: '0'
    Detailed status:
            Status: 'none'
            Capability: 'cs-ps'
            HDR Status: 'none'
            HDR Hybrid: 'yes'
            Forbidden: 'yes'

Eu quero verificar a string entre aspas na primeira linha. Se a string for igual a 'registered', eu quero fazer alguma coisa. Então, originalmente, coloquei isso no meu script:

qmicli -d /dev/cdc-wdm0 --nas-get-serving-system | grep "'registered'"
if [ $? -eq 0 ]; then
    #do stuff
fi

Isso funciona, exceto de vez em quando, o comando qmicli cometa erros (está fazendo interface com um dispositivo externo e, às vezes, o hardware simplesmente não responde quando deveria). Quando isso acontece, todo o roteiro é lançado. Então eu orei o comando qmicli com true para que fosse imune ao erro:

qmicli -d /dev/cdc-wdm0 --nas-get-serving-system || true | grep "'registered'"

Mas agora, $? é sempre 0, então não posso usar a condicional if que eu configurei.

Existe uma maneira melhor de verificar uma string dentro de uma saída de várias linhas de um comando, mas também impedir que o script seja encerrado se o comando retornar um erro?

    
por Dan Laks 22.05.2018 / 03:42

1 resposta

3

Suponho que você tenha set -e ou equivalente no script, portanto, ele será encerrado se um comando falhar.

Agora isso é unidiomático:

some command
if [ $? -eq 0 ]; then ...

É uma forma desnecessariamente indireta de fazer:

if some command; then ...

Um comando na parte de teste de uma instrução if não aciona set -e se falhar, porque isso invalidaria o ponto da instrução if . De os documentos do Bash para -e :

The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command’s return status is being inverted with !.

Então, se você fizer isso:

if qmicli -d /dev/cdc-wdm0 --nas-get-serving-system | grep "'registered'"; then
    #do stuff
fi

qmicli failing não acionará set -e .

(Além disso, não acho que haja qmicli de falha causando o problema - é qmicli falhando de forma a fazer com que o comando grep falhe, causando o problema.)

    
por 22.05.2018 / 03:47