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?
bash
cat
brace-expansion
CDPF
źródło
źródło
echo
zamiast,cat
aby zobaczyć, jaki wiersz poleceń masz. (Lub użyjset -x
do debugowania).Odpowiedzi:
Z definicji rozszerzenie nawiasu klamrowego w GNU Bash wymaga albo wyrażenia sekwencji, albo szeregu wartości oddzielonych przecinkami:
Szczegółowe informacje można znaleźć w instrukcji .
Kilka prostych próbek:
źródło
{subfolder1}
ocenia{subfolder1}
, ponieważ nie ma alternatywy. Użyjsubfolder1
zamiast tego.źródło
csh
(skąd pochodzi rozwinięcie nawiasu)tcsh
lubfish
.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
źródło
/path/{a,}/filename
rozwija się do dwóch łańcuchów/path/a/filename
i/path//filename
, które mogą być niepożądane.ambiguous redirect
jeśli spróbujesz przekierować do pliku podanego przez niecytowaną zmienną, która nie ma wartości, npecho 'hello' >$idontexist
.> *.txt
przypadku wielu.txt
plików lub> $file
jeśli$file
zawiera spacje. Ale oczywiście nie ma nic dwuznacznego w podawaniucat
wielu argumentów