リモートサーバーのmvコマンドが機能しない

リモートサーバーのmvコマンドが機能しない
B=$1
CHECK="$(ssh $USER@$LOGINHOST <<EOD
        . /path/loadprofile.sh
        if [[ ! -e \$TXTDR/$B.txt ]]; then; echo "TXT file for this job does not exist."; exit; fi
        mv \$TXTDR/$B.txt /tmp/$B
EOD)"

終了コード1で失敗し、エラーメッセージも表示されませんが、移動しようとしたファイルが消えました。だからここに2つの質問があります。

  1. なぜ失敗したのですか?コマンドラインで同じ操作を試すと
    機能します。
  2. 失敗した場合、移動したいファイルが
    消えるのはなぜですか? MVはもともとこんな感じですか?

注:このスクリプトはbashシェルで実行され、デフォルトのリモートサーバーシェルはkshです。

答え1

ここで、文書区切り記号はEOD文書の終わりを表し、別々の行を取る必要があります。文字列EOD)は同じではありませんEOD

mv失敗した場合、ファイルは削除されません。$B空白文字が含まれていないと仮定し、TXTDR変数がリモートシェルによって定義されていない場合に実行されるコマンドは次のとおりです。

mv /$B.txt /tmp/$B

(呼び出し前にローカルシェルによって拡張されます)、ターゲットが$B書き込み可能でない限りssh削除されません。/$B.txt

空白文字が含まれている場合は、$B二重引用符で囲む必要があります(例:$TXTDRそうする必要があります)。

mv "\$TXTDR/$B.txt" "/tmp/$B"

このコードスニペットで実行されている特定のタスクを実行するには、次のように書くことができます。

ssh "$user@$server" sh -s -- "$somepath/file.txt" <<'END_SCRIPT'
[ -e "$1" ] && mv "$1" "/new/location/${1##*/}"'
END_SCRIPT

それとも

ssh "$user@$server" sh -s -- "$somepath/file.txt" "/new/location/file.txt" <<'END_SCRIPT'
mv "$1" "$2"
END_SCRIPT

(ここでは全く書類が必要ないと言え、減って言うことができますssh "$user@$server" mv "..." "..."

...不要なテキストを出力しません。成功したかどうかをテストしたい場合は、$?これを見てください(すべてがうまくいけばゼロになります)。

これはまた働きます:

if ! ssh "$user@$server" mv "..." "..."; then
    echo 'Something went wrong with ssh or remote mv' >&2
fi

関連情報