Ekspansja klamra składnia akceptuje przecinków, ale nie akceptuje miejsca po przecinku. W wielu językach programowania spacje po przecinkach są powszechne, ale nie tutaj. W Bash obecność niecytowanej przestrzeni uniemożliwia wykonanie rozwinięcia nawiasu.
Usuń spację, a to zadziała:
cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}
Chociaż wcale nie jest to wymagane, pamiętaj, że możesz przesunąć spływ .bin
poza klamry:
cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
Jeśli chcesz przetestować działanie interpretacji nawiasów, można użyć echo
albo printf '%s '
, albo printf
z dowolnym formacie ciąg wolisz, aby to zrobić. (Osobiście używam echo
do tego, gdy jestem w Bash, ponieważ wbudowane Bashecho
domyślnie nie rozwija sekwencji ucieczki, a zatem jest całkiem odpowiednie do sprawdzania, które polecenie faktycznie uruchomi się.) Na przykład:
ek@Io:~$ echo cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
cp /home/ek/some/dir/my-file-to-rename.bin /home/ek/some/dir/new-name-of-file.bin
Bash traktuje tę przestrzeń tak, jak każdą inną. Jak IFS, separator pola wewnętrznego. Służy do dzielenia słów po rozwinięciu i dzielenia linii na słowa za pomocą wbudowanego polecenia odczytu.
Wstawiając separator, nieskalowany, powiedziałeś bashowi, że twoje polecenie i argumenty to:
Gdybyś miał cytaty lub znak ucieczki „\”, miałbyś:
Co również nie byłoby tym, czego chciałeś, chyba że „new-name-of-file.bin” jest nową nazwą pliku, którą chciałeś. Miejsce w komplecie. Ponieważ najpierw następuje rozwinięcie nawiasu, a następnie rozszerzenie tyldy, bash wykona:
Usunięcie tego miejsca naprawiłoby to wszystko.
źródło
cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}
iIFS
wpływa na wynik. Tak też nie jest. Tutaj spacja jest metaznakiem w tokenizacji ( krok 2 ). Zobacz rozdział 3.5.7, kiedy nastąpi podział. SpróbujIFS=x
więcprintf '[%s]\n' {a,b}
printf '[%s]\n' {a, b}
printf '[%s]\n' {a,xb}
printf '[%s]\n' {a, xb}
.