Quando você usa a expansão de contraventamento?

45

Eu entendo o que é expansão da cinta , mas não sei como usá-lo melhor.

Quando você o usa?
Por favor, me ensine alguns exemplos convenientes e notáveis se você tiver sua própria dica.

    
por Benjamin 15.09.2014 / 08:13

6 respostas

50

A expansão de chave é muito útil se você tiver nomes de caminho longos. Eu uso isso como uma maneira rápida de fazer o backup de um arquivo :

cp /a/really/long/path/to/some/file.txt{,.bak}

copia /a/really/long/path/to/some/file.txt para /a/really/long/path/to/some/file.txt.bak

Você também pode usá-lo em uma seqüência . Uma vez eu fiz isso para baixar muitas páginas da web:

wget http://domain.com/book/page{1..5}.html

ou

for i in {1..100}
do
   #do something 100 times
done
    
por 18.01.2011 / 14:08
29

A expansão de chaves é muito útil ao criar estruturas de diretórios grandes:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}

Isso vai te dar

find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2

Você pode até dar um passo além e colocar a expansão de contraventamento na expansão de contraventamento:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}

Isso lhe dará a mesma estrutura de diretório que o exemplo acima.

    
por 31.01.2011 / 10:04
21

Eu uso quando quero reduzir a digitação:

geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}

Outro exemplo:

wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev
    
por 31.01.2011 / 16:46
12

Eu o uso para comparar a saída de teste real com a saída de teste desejada durante o desenvolvimento. Se o teste # 41 falhar, é fácil ver qual é a diferença entre a saída do teste (no arquivo tests.output / 041) e a saída desejada (no arquivo tests.out / 041):

$ diff tests.{out,output}/041
    
por 18.01.2011 / 18:10
10

Alguns casos frequentes para mim são:

Para renomear:

mv myText.{txt,tex}

ou

mv myText.tex{,.old}

ou

cp myText.tex{,.backup}

(Embora seja menos confuso usar o controle de versão nas duas últimas tarefas.)

Para comparar (já mencionado):

diff path{1,2}/a.txt
    
por 01.02.2011 / 20:44
3

Há várias ótimas respostas aqui, mas nenhuma delas menciona quando não usa a expansão de chaves. Como os outros respondentes, eu uso bastante a expansão de chaves na linha de comando. Eu também uso em meus aliases e funções, já que posso esperar um shell inteligente.

Eu faço não usá-lo em meus scripts de shell (a menos que haja algum outro motivo para os scripts serem bash ou zsh, embora nesses casos seja melhor atualizar para uma linguagem de script "real" como perl ou python ). A expansão do Brace é não portátil , pois não está no padrão de shell POSIX. Mesmo que funcione em seus scripts de shell /bin/sh - shebang , ele não funcionará em sistemas com mais /bin/sh shells (por exemplo, dash ).

No caso de uma diferença de um único dígito, você não precisa de expansão de contraventamento; uma classe de personagem será suficiente:

Bashism:

diff file{1,2}

Portátil:

diff file[12]
    
por 15.01.2015 / 22:33