Quero verificar se um USB está ocupado e armazenar o resultado em uma variável:
$ foo=$(umount /dev/sdb1)
$ umount: /path/mounted: target is busy.
Mas quando quero imprimir $foo
, recebo uma variável vazia
$ echo $foo
$
Meu objetivo final é desmontar o USB. Se o destino estiver ocupado, emita um aviso ao usuário, usando whiptail
. Então:
$ [[ -z $foo ]] || whiptail --msbox "Cancel the operation that is maintaining your USB busy" 0 0
É possível armazenar o erro target is busy
em uma variável ou devo usar outro tipo de técnica?
Os programas geralmente gravam mensagens de erro no fluxo de E/S de “erro padrão”; “stderr” para abreviar. Se você pesquisar por esse termo, obterá milhões de resultados; a explicação curta é que stderr existe para que as mensagens de erro possam e irão para a tela quando a “saída padrão” (“stdout”) for redirecionada, como em um comando hipotético como
E você pode ver isso acontecendo; a mensagem de erro aparece na tela mesmo que você esteja tentando capturá-la em uma variável.
A resposta igualmente curta é usar
2>&1
para mesclar o fluxo stderr no fluxo stdout, entãoirá capturar a mensagem de erro na variável.
Outra abordagem, conforme sugerido por jordanm em um comentário , é observar o status de saída. Variações sobre este tema incluem: