Autor Tópico: varmount=`mount ....`não retorna o código de retorno do mount. Por quê?  (Lida 1812 vezes)

Offline delmarwichnieski

  • Usuário Ubuntu
  • *
  • Mensagens: 15
    • Ver perfil
Olá amigos

Dados os seguintes conhecimentos:

man mount

RETURN CODES
mount has the following return codes (the bits can be ORed):

0 success

1 incorrect invocation or permissions

2 system error (out of memory, cannot fork, no more loop devices)

4 internal mount bug or missing nfs support in mount

8 user interrupt

16 problems writing or locking /etc/mtab

32 mount failure

64 some mount succeeded

e

`...`    Executa comandos numa subshell, retornando o resultado    `ls`

ou

$(...) Executa comandos numa subshell, retornando o resultado    $( ls )

porque as linhas de código abaixo não retornam o código de retorno do mount

varmount=`mount -t cifs -o username=delmar,password= //10.1.1.6/bck /mnt/winbackup/delmar/`
varmount=$(mount -t cifs -o username=delmar,password= //10.1.1.6/bck /mnt/winbackup/delmar/)

ou seja, varmount nunca tem 0, 1, 2, 4, 8, 16 ou 32. Por quê?

Teria que fazer alguma conversão?

Lembro que por outro lado, $? retorna corretamente.

Delmar

Offline delmarwichnieski

  • Usuário Ubuntu
  • *
  • Mensagens: 15
    • Ver perfil
Re: varmount=`mount ....`não retorna o código de retorno do mount. Por quê?
« Resposta #1 Online: 27 de Abril de 2010, 21:37 »
Caiu a ficha, eu mesmo vou responder, creio que entendi. Senão, favor corrigir.

Para tal, é preciso ter em mente ambos os conhecimentos

`...`    Executa comandos numa subshell, retornando o resultado    `ls`

ou

$(...) Executa comandos numa subshell, retornando o resultado    $( ls )

e

$?    Código de retorno do último comando executado
A variável $? possui o código de retorno do último comando. Cada comando é como uma função que retorna um valor. Caso haja sucesso esse valor é 0 caso haja erro é diferente de 0. Esse valor (código de retorno) sempre é colocado na variável de ambiente $?.

Há uma sútil diferença na terminologia das palavras
"resultado" versus "código de retorno" mas que expressão valores bem diferentes.

Vejam que na sintaxe abaixo:

varmount=`mount -t cifs -o username=delmar,password= //10.1.1.6/bck /mnt/winbackup/delmar/`

eu estava tentando colocar na variável varmount o "resultado". Mas não é o "resultado" que eu preciso, pois o "resultado" neste caso será um ponto de montagem e provavelmente uma variável será incapaz de representar um ponto de montagem. O que eu queria de fato é o "código de retorno" do último comando executado (mount). Nesta caso a solução é:

mount -t cifs -o username=delmar,password= //10.1.1.6/bck /mnt/winbackup/delmar/

if [ $? -eq 0 ]; then
   echo "sucesso $?"
else
   echo "falha $?"
fi

e assim o "código de retorno" do mount estará no $? e poderei testar se executou o mount com sucesso ou não.



Já na sintaxe abaixo
testemount=`mount | grep delmar | awk {'print $3'}`

desejo obter o "resultado" do comando e não o "código de retorno" do comando.
E o "resultado" do comando será uma string vazia se não encontrar a string delmar em nenhum ponto de montagem ou será o ponto de montagem se encontrar.
Neste caso eu quero uma string que será vazia ou o próprio ponto de montagem.

if [ -n "$testemount" ]; then
   #echo "desmontando $testemount porque já está montado"
   umount /mnt/winbackup/delmar/ 
fi

Se eu quisesse o "código de retorno", ou seja, se foi executado com sucesso ou não, acessando $? é bem provável que em 100% das execuções teria sucesso, ou seja, código de retorno 0, independente se encontrasse o ponto de montagem ou não.

Offline delmarwichnieski

  • Usuário Ubuntu
  • *
  • Mensagens: 15
    • Ver perfil
Re: varmount=`mount ....`não retorna o código de retorno do mount. Por quê?
« Resposta #2 Online: 27 de Abril de 2010, 21:49 »
Resumindo, faça a pergunta: eu quero o resultado ou o código de retorno?

Se a resposta for resultado use:
variável=`comando`
ou
variável=$( comando )
ou seja, atribua para a variável

Se a resposta for código de retorno use:
comando
$?
ou seja, não atribua para a variável, pois o código de retorno vai automaticamente para $?