Eu tenho um comando rsync com os seguintes parâmetros:
rsync -avz --{partial,stats,delete,exclude=".*"}
Eu quero colocar esses parâmetros dentro de uma variável para reutilizá-la depois no script. Algo assim:
#!/bin/bash
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
$VAR /dir1 /dir2
Eu tentei com aspas, aspas simples, colchetes, sem sucesso.
bash
shell-script
Kellyson
fonte
fonte
Respostas:
Colocar um comando complexo em uma variável nunca é uma abordagem recomendada. Veja BashFAQ / 050 - Estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham!
Seu requisito se torna realmente simples, se você decidir usar uma função em vez de uma variável e passar argumentos para ela.
Algo como
e agora passe os argumentos necessários para ele como
A definição da função é bem simples, de certa forma, primeiro verificamos a contagem de argumentos de entrada usando a variável
$#
que não deve ser zero. Emitimos uma mensagem de erro dizendo que nenhum argumento é fornecido. Se houver argumentos válidos,"$@"
representa os argumentos reais fornecidos à função.Se esta é uma função que você usaria com bastante frequência, ou seja, também em scripts / linha de comando, adicione-a aos arquivos de inicialização do shell
.bashrc
,.bash_profile
por exemplo.Ou, como observado, pode valer a pena expandir a expansão de chaves para separar args para uma melhor legibilidade, como
fonte
Isso tenta executar o comando
-avz
com argumentos--partial
,--stats
etc. e comVAR
definidorsync
no ambiente.O formulário entre aspas não funciona porque chaves não são expandidas entre aspas, e não dentro de atribuições, nem são expandidas depois que uma variável é expandida.
Se você precisar armazenar argumentos de linha de comando em uma variável, use uma matriz:
Agora
"${args[@]}"
vai se expandir pararsync
,-avz
,--partial
, etc. como palavras distintas.As matrizes também permitem anexar opções à lista, condicionalmente, se necessário, para que você possa, por exemplo:
fonte
Você pode pelo menos salvar as opções parcialmente em uma variável:
O teste é importante, porque o mascaramento pode ser difícil:
Como existem várias alternativas, como usar o histórico, usar um alias, usar uma função, não há nenhum caso de uso óbvio em que eu possa pensar. Raramente existe um compartilhamento de opções complexo entre programas diferentes; portanto, para uma solução ad-hoc para o shell interativo, o alias parece uma maneira melhor:
Sua amostra
não pode funcionar, porque a atribuição é finalizada no primeiro espaço em branco. Você tem que mascarar os espaços em branco:
uma coisa bastante perigosa para testar, com essa opção --delete, não é? Como as opções podem conter novamente "," e aspas simples, o mascaramento pode ficar difícil muito em breve. Eu iria procurar um apelido ou confiar na história.
Um alias pode ser armazenado no arquivo ~ / .bashrc para uso contínuo em várias sessões. As funções também podem ser armazenadas no bashrc, mas você só precisa delas, se quiser manipular parâmetros, passadas para a função a ser avaliada nela.
fonte