Reutilizar flags similares para múltiplos comandos

3

Digamos que eu queira executar vários comandos com sinalizadores semelhantes, como:

du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4

Eu quero reutilizar a sequência de --exclude flags e tornar o código mais limpo, por exemplo, salvando essas bandeiras em uma variável.

Então, os comandos acima parecem com

du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"

Observe que tar exclui arquivos e diretórios relativos ao diretório especificado.

Qual é a melhor e mais limpa solução?

Antecedentes

Eu quero fazer backup do meu sistema usando o tar e excluir alguns diretórios que eu não preciso.

    
por polym 25.06.2014 / 20:32

3 respostas

4

Você pode tentar isso:

$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4

Aqui usamos a expansão do histórico bash :

  • !! refere-se ao último comando
  • 3-$ refere-se ao 3º parâmetro até o último

Você deve ativar os recursos de expansão de histórico bash em seu script, que estão desativados no shell não interativo:

set -o history
set -o histexpand
    
por 25.06.2014 / 20:44
2

No Bash, uma maneira muito clara é usar matrizes:

myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"

Eles podem manipular espaços e outros personagens engraçados:

myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"

Eles também podem ser forjados, por exemplo, você deseja excluir todos os subdiretórios do diretório /this/one , que contêm a letra g :

exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"
    
por 26.06.2014 / 16:56
1

Eu teria adicionado isso como um comentário, exceto que ainda não descobri como formatar comentários!

De qualquer forma, acredito que você esteja 90% do caminho até lá. Tente: -

EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS

Citações necessárias na primeira linha, pois há espaços envolvidos.

Não há cotações ao usar a variável para dividir os argumentos nos espaços.

Se houver espaços nos nomes de diretório excluídos, você precisará escapar deles.

    
por 25.06.2014 / 21:06