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,并且不显示任何错误消息,但我尝试移动的文件消失了。所以我这里有两个问题。
- 为什么会失败?当我从命令行尝试相同时,它
有效。 - 如果失败,为什么我尝试移动的文件会
消失? 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