Upstart: canaliza a saída de múltiplos comandos

1

Eu tento detectar se existe um link de rede (cabo conectado / desconectado) em um script upstart (Ubuntu 12.04). Aqui a parte relevante do meu script (que didndt trabalho):

script
if  [ /sbin/ethtool eth0 | /bin/grep "Link detected: yes" > /dev/null ] ; then
    exec prog1
else
    exec prog2
fi

end script

(tente iniciar o prog1 se houver um link de outra forma prog2.) Como consertar isso?

    
por RobertK 04.06.2014 / 16:12

2 respostas

2

A maneira correta de fazer isso é usar

if /sbin/ethtool eth0 | /bin/grep -q "Link detected: yes" ; then
    exec prog1
else
    exec prog2
fi

O argumento -q para o grep descartará o stdout e a instrução if verificará o status do comando executado. [ /sbin/ethtool eth0 | /bin/grep -q "Link detected: yes" ] não é um comando válido, porque [ é na verdade um programa que aceita argumentos como o grep. Portanto, [ não consegue entender /sbin/ethtool eth0 | /bin/grep -q "Link detected: yes" e isso falha.

    
por CameronNemo 04.06.2014 / 17:37
0

Você deve se lembrar que o Upstart executa o shell code em / bin / sh (que é o Dash), não o / bin / bash. Se você colocar seu código em sh , isso não funcionará:

$ if  [ /sbin/ethtool eth0 | /bin/grep "Link detected: yes" > /dev/null ]; then echo cheese; fi
sh: 9: [: missing ]
/bin/grep: ]: No such file or directory

Portanto, há um problema de sintaxe lá. Em vez de usar a verificação do código de status implícito que o bash usa, eu consideraria dividir as coisas da seguinte forma:

/sbin/ethtool eth0 | /bin/grep "Link detected: yes" > /dev/null
if  [ $? -eq 0 ]; then echo cheese; fi

O acima funciona para mim em sh .

Ou você pode forçar o comportamento bash por agrupando-o em um bash loader :

script
/bin/bash <<EOT
    if  [ /sbin/ethtool eth0 | /bin/grep "Link detected: yes" > /dev/null ]; then echo cheese; fi
EOT
end script
    
por Oli 04.06.2014 / 16:42