Die Klammererweiterungssyntax akzeptiert Kommas, jedoch kein Leerzeichen nach dem Komma. In vielen Programmiersprachen sind Leerzeichen nach Kommas an der Tagesordnung, hier jedoch nicht. In Bash verhindert das Vorhandensein eines Leerzeichens ohne Anführungszeichen, dass eine Klammererweiterung durchgeführt wird.
Entfernen Sie das Leerzeichen, und es wird funktionieren:
cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}
Beachten Sie, dass Sie das Nachziehen .bin
außerhalb der geschweiften Klammern verschieben können, obwohl dies überhaupt nicht erforderlich ist :
cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
Wenn Sie den Effekt der Klammererweiterung testen möchten, können Sie dies mit echo
oder printf '%s '
oder printf
mit einer beliebigen Formatzeichenfolge tun. (Ich persönlich benutze echo
dies nur, wenn ich mich in Bash befinde , da Bashs echo
eingebaute Escape-Sequenzen standardmäßig nicht erweitern und daher ziemlich gut geeignet ist, um zu überprüfen, welcher Befehl tatsächlich ausgeführt wird.) Zum Beispiel:
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 behandelt diesen Raum wie jeden anderen. B. IFS, The Internal Field Separator. Dies wird zum Teilen von Wörtern nach der Erweiterung und zum Teilen von Zeilen in Wörter mit dem Befehl read builtin verwendet.
Durch Einfügen des Trennzeichens ohne Flucht haben Sie bash mitgeteilt, dass Ihr Befehl und Ihre Argumente wie folgt lauten:
Hätten Sie Anführungszeichen oder eine Flucht "\", hätten Sie:
Das wäre auch nicht das, was Sie wollten, es sei denn, "new-name-of-file.bin" ist der neue Dateiname, den Sie wollten. Platz inbegriffen. Wenn zuerst die geschweifte Klammer und dann die Tilde-Erweiterung erfolgt, führt bash Folgendes aus:
Das Entfernen des Leerzeichens würde all das beheben.
quelle
cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}
undIFS
das Ergebnis beeinflusst. Weder ist so. Hier ist Leerzeichen ein Metazeichen bei der Tokenisierung ( Schritt 2 ). Siehe 3.5.7 über das Aufteilen. Versuchen Sie esIFS=x
dannprintf '[%s]\n' {a,b}
printf '[%s]\n' {a, b}
printf '[%s]\n' {a,xb}
printf '[%s]\n' {a, xb}
.