Я понимаю, что такое расширение скобок , но я не знаю, как лучше его использовать.
Когда вы используете это?
Пожалуйста, научите меня некоторым удобным и замечательным примерам, если у вас есть свой совет.
Я понимаю, что такое расширение скобок , но я не знаю, как лучше его использовать.
Когда вы используете это?
Пожалуйста, научите меня некоторым удобным и замечательным примерам, если у вас есть свой совет.
Ответы:
Расширение скобок очень полезно, если у вас длинные имена путей. Я использую это как быстрый способ сделать резервную копию файла :
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}