Я пытался объединить текстовые файлы в подпапках и попытался:
cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var
Однако это ничего не вернуло. Итак, попытался добавить несуществующую подпапку2
cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var
И на этот раз все получилось, конкатенация файлов прошла успешно. Почему это происходит?
bash
cat
brace-expansion
CDPF
источник
источник
echo
вместо того,cat
чтобы увидеть, какую командную строку вы получили. (Или используйтеset -x
для отладки.)Ответы:
По определению, расширение скобок в GNU Bash требует либо выражения последовательности, либо серии значений, разделенных запятыми:
Вы можете прочитать руководство для деталей.
Несколько простых примеров:
источник
{subfolder1}
оценивает{subfolder1}
, так как нет альтернатив. Используйтеsubfolder1
вместо этого.источник
csh
(откуда берется расширение скобок)tcsh
илиfish
.Скобки будут расширяться только в том случае, если у них есть строки, разделенные запятой, например, {abc, def} или диапазон, например, {a..e}, указанный между ними.
В вашем случае вы можете просто написать подпапку1, не заключая ее в фигурные скобки, так как в этом нет необходимости
источник
/path/{a,}/filename
расширяется до двух строк/path/a/filename
и/path//filename
, что может быть нежелательным.ambiguous redirect
если попытаетесь перенаправить в файл, заданный переменной без кавычек, которая не имеет значения, напримерecho 'hello' >$idontexist
.> *.txt
с несколькими.txt
файлами, или> $file
если$file
содержит пробелы. Но, конечно, нет ничего неоднозначного в приведенииcat
множества аргументов