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?

CDPF
źródło
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
Arthur Hess
źródło
21

{subfolder1}ocenia {subfolder1}, ponieważ nie ma alternatywy. Użyj subfolder1zamiast tego.

Ignacio Vazquez-Abrams
źródło
2
Zauważ, że różni się od in csh(skąd pochodzi rozwinięcie nawiasu) tcshlub fish.
Stéphane Chazelas,
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
Neo_Returns
źródło
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