rsync, не ведущий себя то же в сценарии по сравнению с оболочкой

ServerFault во второй половине дня,

Я поразил проблему, которой я, может казаться, достигаю решения, у меня в настоящее время есть резервный сценарий, который предназначен к rsync VMs от нашего поля VMWare на наш сервер резервного копирования, проблема, которую я поразил, является этим

**** Starting New Backup
Date: Thu Jan 29 14:09:44 EST 2015
Host: vmhost2
Backup Location: /srv/backups/prod
Dry Run: true

+++=== New VM Backup [27] on [vmhost2] ===+++
---> Target: iDRAC\ Nat
---> VM State: off
rsync -avzhP --delete-after --stats -n root@vmhost2:"/vmfs/volumes/OfficeProd/iDRAC\ Nat" "/srv/backups/prod"
---> RSYNCing VM files
Unexpected local arg: Nat"
If arg is a remote file/dir, prefix it with a colon (:).
rsync error: syntax or usage error (code 1) at main.c(1246) [Receiver=3.0.9]
---! RSYNC Failed, ...
..... truncated .....
+++=== Backup Finished For [27] on [vmhost2] ===+++

An error occurred.  Please check /var/log/backups/prod.log

Но если я выполняю отраженную команду, она хорошо работает

$ rsync -avzhP --delete-after --stats -n root@vmhost2:"/vmfs/volumes/OfficeProd/iDRAC\ Nat" "/srv/backups/prod" 
receiving file list ... 
16 files to consider
iDRAC Nat/
iDRAC Nat/iDRAC Nat-e4289c3b.vswp
iDRAC Nat/iDRAC Nat-flat.vmdk
....truncated....
sent 71 bytes  received 411 bytes  321.33 bytes/sec
total size is 17.83G  speedup is 36996625.28 (DRY RUN)

Вот то, как я могу, пытаясь выполнить команду в сценарии

Примечание: $rsynccmd установлен rsynccmd="rsync -avzhP --delete-after --stats"

if $dryrun
then
  rsynccmd_compiled="$rsynccmd -n root@$vmhost:\"$datastore\" \"$backupprefix\""
  echo $rsynccmd_compiled
else
  rsynccmd_compiled="$rsynccmd root@$vmhost:\"$datastore\" \"$backupprefix\" 2>&1"
fi

log "---> RSYNCing VM files"
cmdresult=`$rsynccmd_compiled`
EXITCODE=$?

if [ $EXITCODE -ne 0 ]
then
  chkcmd $? rsync.backup "$cmdresult"

  log "---! RSYNC Failed, trying again $retrylimit more times"

  EXITCODE=1
  retrycount=0
  until [ $EXITCODE -eq 0 ]; do
    retrycount=$((retrycount + 1))

    if [ $retrycount -gt $retrylimit ]
    then
      break
    fi

    log "---> RSYNC Retry #$retrycount"
    cmdresult=`$rsynccmd_compiled`
    EXITCODE=$?
    chkcmd $EXITCODE rsync.backup.retry "$cmdresult"
    sleep 5
  done
fi

Любая справка с этим высоко ценится!

1
задан 29 January 2015 в 06:01
1 ответ

Обратные кавычки (` ) вводят свою дополнительную потребность в побеге. Я считаю, что использование $ (...) в bash лучше, так как оно не требует дополнительного экранирования.

Попробуйте заменить:

cmdresult=`$rsynccmd_compiled`

на:

cmdresult=$($rsynccmd_compiled)

Альтернативой будет замена каждой одиночной обратной косой черты тройной rsynccmd_compiled:

  rsynccmd_compiled="$rsynccmd root@$vmhost:\\\"$datastore\\\" \\\"$backupprefix\\\" 2>&1"

Для любопытных, количество обратных косых черт для заданного уровня вложенности составляет (2 ^ n) -1, что означает 0, 1, 3, 7, 15, ... Синтаксис $ (...) может быть вложенными без разрыва обратной косой черты.

0
ответ дан 4 December 2019 в 08:07

Теги

Похожие вопросы