Я понимаю, что такое расширение скобок , но я не знаю, как лучше его использовать.
Когда вы используете это?
Пожалуйста, научите меня некоторым удобным и замечательным примерам, если у вас есть свой совет.
Я понимаю, что такое расширение скобок , но я не знаю, как лучше его использовать.
Когда вы используете это?
Пожалуйста, научите меня некоторым удобным и замечательным примерам, если у вас есть свой совет.
Ответы:
Расширение скобок очень полезно, если у вас длинные имена путей. Я использую это как быстрый способ сделать резервную копию файла :
cp /a/really/long/path/to/some/file.txt{,.bak}
будет копировать /a/really/long/path/to/some/file.txt
в/a/really/long/path/to/some/file.txt.bak
Вы также можете использовать его в последовательности . Однажды я сделал так, чтобы загрузить много страниц из Интернета:
wget http://domain.com/book/page{1..5}.html
или же
for i in {1..100}
do
#do something 100 times
done
program
получает три слова: "-f file1" "-f file2" "-f file3"
, вместо 6: "-f" "file1" "-f" "file2" "-f" "file3"
.
for
цикле немного бессмысленно, так как вы можете писать, for ((i=1; i<=100; i++))
и это более эффективно.
Расширение скобок очень удобно при создании больших структур каталогов:
mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}
Это даст вам
find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2
Вы могли бы даже сделать еще один шаг и добавить расширение скобки в расширение скобки:
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
Это даст вам ту же структуру каталогов, что и в примере выше.
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
) фактически не имеет никакого значения. Вы могли бы просто сделать это: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
.
subdir1
и subdir2
в не буквальном смысле. Заменить subdir1
на cat
и subdir2
с, dog
например.
Я использую его, когда хочу уменьшить количество набираемых текстов:
geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}
Другой пример:
wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev
Я использую его для сравнения фактического результата теста с желаемым результатом теста во время разработки. Если тест № 41 не пройден, легко увидеть разницу между тестовым выводом (в файле tests.output / 041) и желаемым выводом (в файле tests.out / 041):
$ diff tests.{out,output}/041
Некоторые частые случаи для меня:
Для переименования:
mv myText.{txt,tex}
или же
mv myText.tex{,.old}
или же
cp myText.tex{,.backup}
(Хотя использовать управление версиями для последних двух задач не так уж и сложно.)
Для сравнения (уже упоминалось):
diff path{1,2}/a.txt
Здесь есть несколько отличных ответов, но ни один из них не упоминает, когда не следует использовать скобки. Как и другие ответчики, я немного использую расширение скобок в командной строке. Я также использую его в своих псевдонимах и функциях, поскольку могу ожидать умную оболочку.
Я не использую его в своих сценариях оболочки (если только по какой-то другой причине сценарии должны быть bash или zsh, хотя в этих случаях лучше всего перейти на «настоящий» язык сценариев, такой как perl
или python
). Расширение Brace не является переносимым, поскольку оно не входит в стандарт оболочки POSIX. Даже если он работает в ваших /bin/sh
- притон скриптов ред оболочки, он не будет работать на системах с более раздели /bin/sh
оболочек (например dash
).
В случае разницы в одну цифру вам не нужно расширять скобки; Класс персонажа будет достаточно:
Bashism:
diff file{1,2}
Портативный:
diff file[12]
file{1,2}
он всегда будет расширяться file1 file2
, в то время как будет file[12]
расширяться только до существующих имен файлов: то есть, если file1
существует, но file2
не будет, file[12]
расширяется file1
только до . []
Расширение действительно ограниченная версия ?
расширения (и они называются «имя пути расширения»).
program -f file1 -f file2 -f file3
, вы можете сделатьprogram "-f file"{1..3}