Comando executado diferentemente do terminal ou no script bash

0

Estou tentando automatizar um script de backup com o sótão, mas estou preso a esse problema: o comando real do sótão é executado de maneira diferente quando executado a partir do script e quando executado diretamente no terminal.

O script cria e executa o comando:

/usr/bin/attic create --stats --verbose --exclude '/home/.cache' /media/attic-backup/paolo.attic::2016-08-27 /home

o comando gera os arquivos de backup do sótão:

/home
/home/.attic
/home/.attic/keys
/home/.cache
/home/git
/home/git/.bash_history
etc etc

O diretório /home/.cache deveria ter sido ignorado ...

No entanto, se eu executar o mesmo comando do terminal, obtenho:

$ /usr/bin/attic create --stats --verbose --exclude '/home/.cache' /media/attic-backup/paolo.attic::2016-08-27 /home
/home
/home/.attic
/home/.attic/keys
/home/git
/home/git/.bash_history
etc etc

Agora, o diretório /home/.cache foi ignorado.

Não é uma questão de sudo.

Por que o comando no script se comporta de maneira diferente?

    
por Paolo Benvenuto 27.08.2016 / 16:20

1 resposta

1

Quando você diz que o script "constrói" o comando, você quer dizer que ele armazena em uma string (variável), e então tenta executar a string como um comando? Se assim for, colocar aspas dentro da string ( '/home/.cache' ) não fará o que você espera, porque as aspas são tratadas como dados e passadas para o comando como parte do argumento, em vez de serem analisadas e removidas antes de serem passadas como um argumento. argumento. Essencialmente, isso significa que o rsync estava sendo instruído a excluir '/home/.cache' em vez de apenas /home/.cache . Veja BashFAQ # 50: Estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham! para mais info.

Se você está tentando construir o comando peça por peça, geralmente a melhor maneira de fazer isso é com uma matriz. Algo parecido com isto:

atticcmd=(/usr/bin/attic create --stats --verbose --exclude '/home/.cache' /media/attic-backup/paolo.attic::2016-08-27 /home)
"${atticcmd[@]}"

Ou você pode criar apenas uma parte dele em uma matriz:

atticopts=(--stats --verbose)
for e in "${excludes[@]}"; do
    atticopts+=(--exclude "$e")
done
/usr/bin/attic create "${atticopts[@]}" /media/attic-backup/paolo.attic::2016-08-27 /home
    
por 27.08.2016 / 18:33