Чому "cat {foo}" не виводить foo, а "cat {foo, bar}" робить?


12

Я намагався об'єднати текстові файли у підпапки і спробував:

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

Однак це нічого не повернуло. Отже, спробував додати неіснуючу "підпапку2"

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

І цього разу це вийшло, успішно об'єднавши файли. Чому це відбувається?


2
Використовуйте echoзамість того, catщоб побачити, який командний рядок ви отримали. (Або використовувати set -xдля налагодження.)
Пітер Кордес

Відповіді:


22

За визначенням, розширення дужок у GNU Bash вимагає або вираження послідовності, або ряд значень, розділених комами:

Шаблони, що підлягають розширенню дужок, набувають форми необов'язкової преамбули з наступною послідовністю послідовностей, розділених комами, або виразом послідовності між парою дужок, за яким слід необов'язковий постскрипт.

Ви можете прочитати посібник для детальної інформації.

Кілька простих зразків:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2


1

Брекети розширюватимуться лише у тому випадку, якщо вони містять рядки з комою, наприклад {abc, def} або діапазон, наприклад, {a..e}, вказаний між ними.

У вашому випадку ви можете просто написати підпапка1, не вкладаючи її в дужки, оскільки в цьому немає необхідності

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var

На жаль, /path/{a,}/filenameрозширюється до двох рядків /path/a/filenameі /path//filename, що може бути небажаним.
Кусалаланда

дякую @Kusalananda за виправлення мене, так, Баш подасть попередження: "неоднозначне перенаправлення"
Neo_Returns

Ні, ви отримуєте, ambiguous redirect якщо спробуєте перенаправити у файл, заданий змінною без котирування, яка не має значення, наприклад echo 'hello' >$idontexist.
Кусалаланда

1
... або якщо ім'я файлу при переадресації розширюється на кілька слів. Як і > *.txtз кількома .txtфайлами, або > $fileякщо вони $fileмістять пробіл. Але, звичайно, немає нічого неоднозначного в cat
наведенні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.