远程服务器上的 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,并且不显示任何错误消息,但我尝试移动的文件消失了。所以我这里有两个问题。

  1. 为什么会失败?当我从命令行尝试相同时,它
    有效。
  2. 如果失败,为什么我尝试移动的文件会
    消失? mv 一般都是这样的吗?

注意:该脚本在 bash shell 中运行,默认远程服务器 shell 是 ksh。

答案1

此处文档分隔符EOD表示文档的结束符,必须单独占一行。该EOD)字符串不等于EOD

mv失败时不删除文件。假设$B不包含空格字符,并且如果TXTDR远程 shell 未定义该变量,则执行的命令将为

mv /$B.txt /tmp/$B

(在调用$B之前由本地 shell 扩展),但如果目标不可写,则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

相关内容