Erro no script rsync Bash

3

Um script bash tem a seguinte linha

    rsync $OPTS $BACKDIR $USER@$DEST:$DESTDIR     

mas uma das opções é rsh='ssh -p2222' Ele reclama:

    rsync: -p2222': unknown option
    rsync error: syntax or usage error (code 1) at main.c(1425) [client=3.0.7]

Mas quando eu mudo o script para:

    echo rsync $OPTS $BACKDIR $USER@$DEST:$DESTDIR     

e execute manualmente o comando impresso que funciona.

Por favor, informe

    
por Humble Debugger 23.02.2011 / 17:32

4 respostas

5

Resposta curta: veja BashFAQ # 50 .

Resposta longa: Colocar comandos (ou partes de comandos) em variáveis e depois recuperá-las intactas é complicado. Quando o shell expande uma variável na linha de comando, se a variável estiver entre aspas duplas, ela não será analisada (consulte a resposta do @Dennis Williamson); se não estiver entre aspas, os espaços serão analisados como quebras de argumentos, mas aspas e escape não serão analisadas (e é por isso que você recebeu um erro sobre uma aspa literal em um dos argumentos para rsync). Em ambos os casos, colocar aspas no valor da variável não faz nada útil.

Existem, no entanto, várias maneiras de corrigir seu script, dependendo de quão complexo é o OPTS:

  1. Se --rsh é a única coisa no OPTS, então cite duas vezes (como na resposta de Dennis Williamson):

    OPTS='--rsh=ssh -p2222'
    rsync "$OPTS" "$BACKDIR" "$USER@$DEST:$DESTDIR"
    

    (Observe também as aspas duplas em torno dos outros argumentos: isso é para evitar erros de interpretação se eles contiverem espaços e geralmente é uma boa higiene de script).

  2. Se o conteúdo de OPTS é constante (ou pelo menos, a parte --rsh é), então não tente colocá-lo em uma variável, apenas use diretamente:

    rsync --rsh='ssh -p2222' $RESTOFOPTS "$BACKDIR" "$USER@$DEST:$DESTDIR"
    
  3. Se nenhum desses casos simples se aplicar, use uma matriz em vez de uma variável simples:

    OPTS=(-x --delete --inplace)
    if [[ "$rsync_version" == 2.* ]]; then
        OPTS+=(-aE)
    else
        OPTS+=(-aNHX)
    fi
    if [[ -n "$using_rsh" ]]; then
        OPTS+=('--rsh=ssh -p2222')
    fi
    rsync "${OPTS[@]}" "$BACKDIR" "$USER@$DEST:$DESTDIR"
    
por 23.02.2011 / 22:19
1

Para preservar as citações e os espaços em branco na variável, é necessário citar a variável quando ela é referenciada:

rsync "$OPTS" "$BACKDIR" "$USER@$DEST:$DESTDIR"
    
por 23.02.2011 / 18:01
0

Eu acho que sua opção rsh deve ser usada com o sinalizador -e (resp. --rsh ) do rsync para que o rsync saiba usar a porta personalizada para a conexão ssh. Seu comando parece assim:

ssh -some -opts --rsh="ssh -p222" fromdir/ user@host:/todir

Pode ser que as aspas em torno da parte 'ssh -p222' estejam simplesmente ausentes quando o rsync é executado. Você poderia tentar definir a variável rsh desta forma:

rsh='"ssh -p222"'

para que ele seja avaliado como "ssh -p222" durante a execução (literalmente, incluindo as aspas duplas).

    
por 23.02.2011 / 17:41
0

Uma opção é remover o "espaço" do $ IFS no seu script:

#!/bin/bash
IFS=$'\n\t'
...
rsync $OPTS $BACKDIR $USER@$DEST:$DESTDIR

O Bash se comportará como a maioria dos programadores esperaria, já que os espaços não serão mais usados como separadores de campo dentro das variáveis.

    
por 23.02.2011 / 18:17

Tags