return value do comando não exibido no script

0

Se eu executar o comando rsync abaixo na linha de comando, estou obtendo o status de retorno adequado

/usr/bin/rsync -azv -p /home/zaman x11server:/home/zamanr &> rsyncjob/output."$datetime"

echo $?
255

O hostname está inacessível, portanto, estou obtendo um valor de retorno de 255

Isso está bem para mim. Mas se eu colocar o mesmo comando em um script bash , não receberei nenhum valor de retorno

#!/bin/bash
datetime='date +%Y.%m.%d'
ret_value= '/usr/bin/rsync -azv -p /home/zaman x11server:/home/zamanr &> rsyncjob/output."$datetime"'
echo $ret_value

A saída do script mostra apenas em branco. O $ret_value não é impresso.

O que eu estou perdendo aqui para obter o valor de retorno do comando rsync impresso via script.

    
por Zama Ques 11.01.2016 / 12:19

2 respostas

1

tente isso.

#!/bin/bash
datetime='date +%Y.%m.%d'
ret_value='/usr/bin/rsync -azv -p /home/zaman x11server:/home/zamanr &> rsyncjob/output."$datetime"; echo $?'
echo $ret_value

O problema é que o comando que você está executando não produz uma saída, já que você está enviando o arquivo para um arquivo. Anexar o comando para ecoar o último código de saída do comando deve fornecer o resultado que você está procurando.

    
por 11.01.2016 / 13:12
1

A linha

ret_value= '…'

tem um comportamento estranho. Primeiro executa o comando dentro dos backticks. A saída desse comando é então dividida em palavras, e a primeira palavra é usada como um comando para executar. Se houvesse pelo menos uma palavra, ela seria executada como um comando (com as outras palavras como parâmetros), com a variável de ambiente ret_value definida como a cadeia vazia somente durante a duração desse comando. Mas como a saída do comando nos backticks está vazia, o que acontece é que a linha é uma atribuição: define a variável do shell ret_value para a string vazia.

Você provavelmente quis escrever

ret_value='…'

sem espaço após o sinal de igual. Isso configuraria ret_value para a saída do comando nos backticks - é o que os backticks significam. Lembre-se que no shell, os espaços são significativos e, em particular, você não pode ter espaços dentro de uma atribuição.

Se você deseja obter o valor de retorno de um comando, execute esse comando (com sua saída indo para onde quiser) e, em seguida, leia o conteúdo da variável especial $? . A variável $? contém o status do comando anterior que foi executado.

/usr/bin/rsync -azv -p /home/zaman x11server:/home/zamanr &> rsyncjob/output."$datetime"
echo $?

Você pode querer ou até mesmo precisar salvar $? em outra variável, pois ela será alterada assim que mais um comando for executado.

/usr/bin/rsync -azv -p /home/zaman x11server:/home/zamanr &> rsyncjob/output."$datetime"
ret_value=$?
if [ $ret_value -eq 0 ]; then
  echo "Success"
else
  echo "Failure, rsync return status $ret_value"
fi
exit $ret_value
    
por 12.01.2016 / 00:50