Dlaczego „cat {foo}” nie wyświetla foo, a „cat {foo, bar}”?


12

Próbowałem połączyć pliki tekstowe w podfolderach i próbowałem:

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

Jednak to nic nie zwróciło. Próbowałem więc dodać nieistniejący „podfolder2”

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

I tym razem się udało, łącząc pliki z powodzeniem. Dlaczego tak się dzieje?


2
Użyj echozamiast, cataby zobaczyć, jaki wiersz poleceń masz. (Lub użyj set -xdo debugowania).
Peter Cordes

Odpowiedzi:


22

Z definicji rozszerzenie nawiasu klamrowego w GNU Bash wymaga albo wyrażenia sekwencji, albo szeregu wartości oddzielonych przecinkami:

Wzory do rozszerzenia nawiasów klamrowych mają postać opcjonalnej preambuły, po której następuje seria ciągów oddzielonych przecinkami lub wyrażenie sekwencyjne między parą nawiasów klamrowych, a następnie opcjonalny postscriptum.

Szczegółowe informacje można znaleźć w instrukcji .

Kilka prostych próbek:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2


1

Nawiasy klamrowe będą się rozszerzać tylko wtedy, gdy będą miały łańcuchy rozdzielone przecinkami, np. {Abc, def} lub zakres, np. {A..e} określone między nimi.

W twoim przypadku możesz po prostu napisać podfolder1 bez zamykania go w nawiasy klamrowe, ponieważ nie ma takiej potrzeby

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

Niestety /path/{a,}/filenamerozwija się do dwóch łańcuchów /path/a/filenamei /path//filename, które mogą być niepożądane.
Kusalananda

dzięki @Kusalananda za naprawienie mnie, tak bash dostarczy ostrzeżenie „niejednoznaczne przekierowanie”
Neo_Returns

Nie, otrzymujesz, ambiguous redirect jeśli spróbujesz przekierować do pliku podanego przez niecytowaną zmienną, która nie ma wartości, np echo 'hello' >$idontexist.
Kusalananda

1
... lub jeśli nazwa pliku w przekierowaniu zostanie rozszerzona do wielu słów. Podobnie jak w > *.txtprzypadku wielu .txtplików lub > $filejeśli $filezawiera spacje. Ale oczywiście nie ma nic dwuznacznego w podawaniu catwielu argumentów
ilkkachu
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.