Fish-shell: {x,y,z} Parametererweiterung wird nicht mit Escapezeichen versehen

Erstellt am 30. Dez. 2017  ·  3Kommentare  ·  Quelle: fish-shell/fish-shell

Fischparameter werden in der Regel mit Escapezeichen versehen, bevor sie in Fischbefehle eingefügt werden:

mqudsi@freebsd> echo hello > hello\ world.txt
mqudsi@freebsd> file (echo hello world.txt)
hello world.txt: ASCII text

Das Ergebnis der Klammererweiterung wird jedoch nicht korrekt maskiert, _und_ es gibt keine einfache Möglichkeit, es manuell zu maskieren, da das Einfügen von Anführungszeichen um den Parameter die Erweiterung unterbricht:

mqudsi@freebsd> echo -n hello\ {1,2,3}.txt\n
hello 1.txt
 hello 2.txt
 hello 3.txt

Wie Sie sehen, werden nach dem ersten Parameter echo zwei separate Argumente übergeben: hello und #.txt , was zu dem zusätzlichen Leerzeichen vor den Wörtern führt.

Das Einschließen der Argumente in Anführungszeichen führt zu folgendem:

mqudsi@freebsd> echo -n "hello\ {1,2,3}.txt\n"
hello\ {1,2,3}.txt\n

Beim Versuch, das Problem durch Einfügen von Escape-Anführungszeichen in die ursprüngliche Zeichenfolge zu umgehen (unter der Annahme, dass der Inhalt der Zeichenfolge nach dem Ersetzen und vor der Injektion nicht mit Escape-Zeichen versehen wird), werden die Anführungszeichen korrekt mit Escapezeichen versehen, wodurch das gewünschte Ergebnis verhindert wird:

mqudsi@freebsd> echo -n \"hello\ {1,2,3}.txt\n\"                                                                                                     "hello 1.txt                                                                                                                                                       " "hello 2.txt                                                                                                                                                     " "hello 3.txt                                                                                                                                                     
"

Es sieht so aus, als ob die Parametererweiterung nach der Phase der Argumentaufteilung stattfindet.

question

Alle 3 Kommentare

echo werden zwei separate Argumente hallo und #.txt übergeben, was zu dem zusätzlichen Leerzeichen vor den Wörtern führt.

Ich stimme dieser Diagnose nicht zu. echo werden 3 Argumente übergeben (jedes endet mit \n ), die echo pflichtbewusst mit einem Leerzeichen dazwischen ausgibt. Ich sehe hier keinen Fehler.

Folgendes mache ich, um Argumente zu debuggen:

~> printf '«%s»' hei\ {1,2,3}.txt\n
«hei 1.txt
»«hei 2.txt
»«hei 3.txt
»⏎

Folgendes mache ich, um Argumente zu debuggen:

Ich benutze string escape , dh

> string escape -- hello\ {1,2,3}.txt\n
hello\ 1.txt\n
hello\ 2.txt\n
hello\ 3.txt\n

was bedeutet, dass Sie tatsächlich das bekommen, was ich erwarten würde. Sie erhalten das volle Argument mit "1", dann mit "2" und dann mit "3". Das vollständige Argument enthält zufällig einen Zeilenumbruch.

@mqudsi : Ich würde annehmen, was dich hier

  • Wir teilen nur Befehlsersetzungen ( (command) ) bei Zeilenumbrüchen. Das bedeutet, dass das \n hier keine besondere Bedeutung hat, nachdem es durch ein Newline-Zeichen ersetzt wurde. Es ist "ein Charakter", was den Rest betrifft. Wir müssen den Charakter nicht _escape_, wir führen nur die Aufteilung nicht durch.

Oder in file (echo hello world.txt) wird die "hello world.txt" _nicht_ zu hello\ world.txt escaped, sondern nur nicht geteilt, weil es keinen Zeilenumbruch gibt. Wenn Sie eine Datei namens hello\nworld.txt , hätte dies ähnliche Probleme wie das Problem von bash mit Leerzeichen.

  • echo fügt Leerzeichen zwischen seine Argumente ein (wenn "-s" nicht angegeben wurde). Das ist es, was die seltsame Einrückung verursacht - weil die Leerzeichen direkt nach dem Zeilenumbruch auftreten.

Das heißt, wenn Sie die Ausgabe haben möchten

hello 1.txt
hello 2.txt
hello 3.txt

Verwenden Sie echo -s oder printf '%s\n' hello\ {1,2,3}.txt .

Ich glaube, das ist eher ein Missverständnis als ein Bug. Hab ich recht?

Entschuldigung, Leute! Ich habe versucht, eine minimale Reproduktion für ein Problem zu erstellen, und war von etwas völlig anderem verwirrt. Ich habe das Verhalten der Parametererweiterung falsch verstanden, insbesondere habe ich es mit dem von parallel oder xargs mit einem Limit von 1 verwechselt, dh ich nahm an, dass echo {1,2,3} auf 3 erweitert würde Befehle mit jeweils 1 Argument und nicht 1 Befehl mit 3 Argumenten.

Danke, dass du mich klargestellt hast.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen