コマンドラインから次の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= `…`
奇妙な動作があります。まず、バックティック内のコマンドを実行します。その後、コマンドの出力は単語に分割され、最初の単語は実行するコマンドとして使用されます。 1つ以上の単語がある場合はコマンドとして実行され(他の単語は引数として使用されます)、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