Por que o "sudo -n true" funciona dentro de colchetes em loop / condicional?

1

Eu tenho um loop que solicitará a senha sudo até que fique correta. O motivo não é relevante, digamos que é parte de um roteiro maior e outras soluções não são apropriadas.

until sudo -n true 2> /dev/null; do
  read -s -p "Password:" sudo_password
  sudo -S -v <<< "${sudo_password}" 2> /dev/null
done

Isso funciona muito bem. No entanto, não funciona quando entre parênteses

until [[ $(sudo -n true 2> /dev/null) ]]; do
  read -s -p "Password:" sudo_password
  sudo -S -v <<< "${sudo_password}" 2> /dev/null
done

Eu tentei isso de várias maneiras, com loops e condicionais. Eu até fui tão longe quanto fazer

until [[ $(sudo -n true 2> /dev/null; echo "$?") -ne 0 ]]; do
  read -s -p "Password:" sudo_password
  sudo -S -v <<< "${sudo_password}" 2> /dev/null

  # check exit status is indeed 0
  sudo -n true 2> /dev/null
  echo "$?"
done

Isso também não funciona e eu não entendo o porquê. Na verdade, este caso sempre retorna 0 (de acordo com o último echo "$?" ) mesmo que a senha esteja errada, mas nunca salta para fora do loop, mesmo que a senha esteja correta, o que é ainda mais estranho.

Editar: Acabou de perceber por que o último não funcionou, embora parecesse em outros casos. Com essa comparação específica, deveria ter sido while , não until .

    
por user137369 20.10.2015 / 02:28

1 resposta

2

passo a passo.

  1. until sudo -n true 2> /dev/null; do avalie sudo -n true , descarte o erro padrão e forneça o código de retorno para until .

  2. $(sudo -n true 2> /dev/null) this

    2.1 avalie sudo -n true ,

    2,2 descartar erro padrão 2 > / dev / null

    2.3 pegue a saída padrão empty

  3. until [[ $(sudo -n true 2> /dev/null) ]]; do this

    3.1-3.3 o mesmo que acima

    3.4 use [[<>> vazio ]] este é provavelmente um erro

  4. until [[ $(sudo -n true 2> /dev/null; echo "$?") -ne 0 ]]; do this

    4,1 a 4,4 iguais aos anteriores

    4.5 compare vazio para 0

A primeira linha é a corret, sudo fornece um código de retorno, simplesmente use-a.

Um erro comum é confundir o código de retorno: um inteiro (geralmente 0 ou 1 ou 2 (Nenhum arquivo ou diretório)), com saída (pode ser qualquer coisa, texto ou binário).

Shells (bash / dash / whateversh) podem ser avisados para ver o código de retorno ( set -e ) ou em test .

    
por 20.10.2015 / 11:17

Tags