명령의 반환 값은 스크립트에 표시되지 않습니다.

명령의 반환 값은 스크립트에 표시되지 않습니다.

명령줄에서 다음 rsync 명령을 실행하면 올바른 반환 상태가 표시됩니다.

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

echo $?
255

액세스할 수 없으므로 hostname반환 값은 255입니다.

나는 괜찮습니다. 하지만 동일한 명령을 스크립트에 넣으면 bash어떤 반환 값도 얻지 못합니다.

#!/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

스크립트 출력에는 공백이 표시됩니다. 인쇄되지 않았습니다 $ret_value.

여기서 내가 놓치고 있는 것은 rsync스크립트를 통해 인쇄된 명령의 반환 값을 얻는 것입니다.

답변1

이 시도.

#!/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

문제는 실행 중인 명령이 파일로 파이프되기 때문에 출력이 생성되지 않는다는 것입니다. 마지막 명령 종료 코드를 에코하는 명령을 추가하면 원하는 결과를 얻을 수 있습니다.

답변2

ret_value= `…`

이상한 동작이 있습니다. 먼저 백틱 내부의 명령을 실행합니다. 그런 다음 명령의 출력은 단어로 분할되며 첫 번째 단어는 실행할 명령으로 사용됩니다. 단어가 하나 이상 있으면 명령으로 실행되고(다른 단어는 인수로 사용) ret_value환경 변수는 명령 기간 동안에만 빈 문자열로 설정됩니다. 그러나 역따옴표 안의 명령 출력은 비어 있기 때문에 이 줄은 할당입니다. 즉, 쉘 변수를 ret_value빈 문자열로 설정합니다.

당신은 글을 쓰고 싶을 수도 있습니다

ret_value=`…`

등호 뒤에는 공백이 없습니다. 이는 ret_value다음과 같이 설정됩니다 .산출백틱의 명령 - 이것이 백틱의 의미입니다. 쉘에서는 특히 할당에서 공백이 중요하다는 점을 기억하십시오.

명령의 반환 값을 얻으려면 명령을 실행하고(원하는 위치에서 출력) 특수 변수의 내용을 읽으십시오 $?. 이 $?변수에는 이전에 실행된 명령의 상태가 포함됩니다.

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

$?다른 명령이 실행되면 변수가 변경되므로 다른 변수에 저장하기를 원하거나 저장해야 할 수도 있습니다 .

/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

관련 정보