Entendo o que é expansão de braçadeira , mas não sei qual a melhor forma de usá-la.
Quando você o usa?
Por favor, ensine-me alguns exemplos convenientes e notáveis, se você tiver sua própria dica.
Entendo o que é expansão de braçadeira , mas não sei qual a melhor forma de usá-la.
Quando você o usa?
Por favor, ensine-me alguns exemplos convenientes e notáveis, se você tiver sua própria dica.
Respostas:
A expansão de chaves é muito útil se você tiver nomes de caminhos longos. Eu o uso como uma maneira rápida de fazer backup de um arquivo :
cp /a/really/long/path/to/some/file.txt{,.bak}
irá copiar /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 sequência . Certa vez, 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
program
recebe três palavras: "-f file1" "-f file2" "-f file3"
, em vez de 6: "-f" "file1" "-f" "file2" "-f" "file3"
.
for
loop é um pouco inútil, pois você pode escrever for ((i=1; i<=100; i++))
e é mais eficiente.
A expansão de chaves é muito útil ao criar grandes estruturas de diretório:
mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}
Isso lhe dará
find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2
Você poderia dar um passo adiante e colocar a expansão de chaves na expansão de chaves:
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
Isso fornecerá a mesma estrutura de diretórios do exemplo acima.
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
) não serve para nada. Você poderia ter feito isso: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
.
subdir1
e subdir2
no sentido não literal. Substituir subdir1
com cat
e subdir2
com dog
, por exemplo.
Eu o uso para comparar a saída de teste real com a saída de teste desejada durante o desenvolvimento. Se o teste nº 41 falhar, é fácil ver qual a diferença entre a saída de teste (no arquivo tests.output / 041) e a saída desejada (no arquivo tests.out / 041):
$ diff tests.{out,output}/041
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 complicado usar o controle de versão nas duas últimas tarefas).
Para comparar (já mencionado):
diff path{1,2}/a.txt
Existem várias ótimas respostas aqui, mas nenhuma delas menciona quando não usar expansão de chaves. Como os outros respondentes, uso bastante a expansão entre chaves na linha de comando. Também o uso em meus aliases e funções, pois posso esperar um shell inteligente.
Eu não o uso nos meus scripts de shell (a menos que haja outra razão pela qual os scripts sejam bash ou zsh, embora nesses casos seja melhor atualizar para uma linguagem de script "real" como perl
ou python
). A expansão de chaves não é portátil, pois não está no padrão de shell POSIX. Mesmo se ele funciona em seus /bin/sh
- shebang scripts shell ed, não irá funcionar em sistemas com mais despojado /bin/sh
conchas (por exemplo dash
).
No caso de uma diferença de um único dígito, você não precisa de expansão de chaves; uma classe de personagem será suficiente:
Bashism:
diff file{1,2}
Portátil:
diff file[12]
file{1,2}
sempre se expandirá para file1 file2
, enquanto se file[12]
expande apenas para os nomes de arquivos existentes: ou seja, se file1
existe, mas file2
não existe , se file[12]
expande file1
apenas para . A []
expansão é realmente uma versão restrita da ?
expansão (e elas são chamadas de "expansões de nome de caminho").
program -f file1 -f file2 -f file3
, você pode fazerprogram "-f file"{1..3}