我有这个简单的csh脚本来rsync东西:
#!/bin/csh
set SOURCE_FOLDER = $1
set DESTINATION_SERVER_NAME = $2
set DESTINATION_FOLDER = $3
echo Copying ${SOURCE_FOLDER} to ${DESTINATION_SERVER_NAME}:${DESTINATION_FOLDER}
if (ssh $DESTINATION_SERVER_NAME '[ -d $DESTINATION_FOLDER') then
rsync -vlptr ${SOURCE_FOLDER} ${DESTINATION_SERVER_NAME}:${DESTINATION_FOLDER}
set RSYNCSTATUS = $status
if ($RSYNCSTATUS == 0) then
echo "COPY : Done"
else
exit $RSYNCSTATUS
endif
else
echo " ${DESTINATION_SERVER_NAME}:${DESTINATION_FOLDER} does not exist "
exit 1
endif
我以超级用户身份运行它,所以我可以在没有密码或用户名的情况下自由地运行。我想处理rsync的所有错误情况,即Source不退出,目标不存在。
使用$ status和inner if条件来处理不存在的来源。 但是,对于不存在的目标,rsync会创建目标文件夹(如果它不存在)。因此我被迫明确地处理它。我知道-e / folder或-d /文件夹检查文件夹是否存在,但我如何跨机器进行?
这个问题How to check if dir exist over ssh and return results to host machine
在我尝试时处理它。但是当我运行上面的脚本时:我得到if:表达式语法
以上是bash,所以不确定csh是否不支持该答案。所以,我尝试使用命令模式:
if (`ssh $DESTINATION_SERVER_NAME '[ -d "$DESTINATION_FOLDER" ]'`) then
和
if (`ssh $DESTINATION_SERVER_NAME '[ -d '$DESTINATION_FOLDER' ]'`) then
第一个给我$ DESTINATION_FOLDER未定义变量。第二个给我一个错误的输出,即如果条件失败,即使存在路径。
我该如何使这项工作?我觉得我在某个地方很近。或者还有其他更简单的替代方案吗?我的手在这里使用csh(遗留代码,老板),这是一个缓慢的挣扎过程。任何输入都会很棒。
答案 0 :(得分:0)
您需要谨慎对待变量和引号。第一个示例将在服务器上进行评估,您没有这样的变量,第二个例子是完全错误的,因为您将单引号转换为另一个。你可以尝试这个:
if (`ssh $DESTINATION_SERVER_NAME "[ -d \\\"$DESTINATION_FOLDER\\\" ]"`) then
它应该做你需要的。