Ich bin verwirrt über die Rolle, die die Wortspaltung spielt zsh
. Ich war bei der Programmierung in C, Python oder MATLAB nicht mit diesem Konzept vertraut, und dies hat mein Interesse geweckt, warum die Wortteilung etwas Besonderes für die Shell-Programmierung zu sein scheint.
Ich habe auf dieser und anderen Websites bereits von Worttrennung gelesen, aber keine klare Erklärung für das Konzept gefunden. Wikipedia hat eine Definition der Wortteilung, aber es scheint keine Hinweise darauf zu geben, wie sie auf Unix-Shells angewendet wird.
Hier ist ein Beispiel für meine Verwirrung in zsh
:
In den Z Shell FAQ habe ich Folgendes gelesen:
3.1: Warum macht
$var
wovar="foo bar"
nicht was ich erwarte?In den meisten Bourne-Shell-Derivaten werden Variablen mit mehreren Wörtern, z. B.
var="foo bar"
in Wörter aufgeteilt, wenn sie an einen Befehl übergeben oder in einerfor foo in $var
Schleife verwendet werden. Standardmäßig weist zsh dieses Verhalten nicht auf: Die Variable bleibt intakt. (Dies ist kein Fehler! Siehe unten.) Die Option istSH_WORD_SPLIT
vorhanden, um Kompatibilität bereitzustellen.
Im Z-Shell-Handbuch habe ich jedoch Folgendes gelesen:
SH_WORD_SPLIT (-y) <K> <S>
Bewirkt, dass die Feldaufteilung bei nicht zitierten Parametererweiterungen durchgeführt wird. Beachten Sie, dass diese Option nichts mit der Wortteilung zu tun hat . (Siehe Parametererweiterung.)
Warum heißt es, dass SH_WORD_SPLIT
das nichts mit Wortspaltung zu tun hat ? Spaltet sich nicht genau das, worum es geht?
"word1 word2 word3"
in Listen / Arrays des Formulars umwandelt"word1" "word2" "word3"
? Ich habe auch das OP mit einer bestimmten Quelle der Verwirrung in zsh aktualisiert.$IFS
Zeichen. Daher ist "Feldaufteilung" ein besserer Name. In der Muschelliteratur wird dieses Konzept jedoch häufig als "Wortspaltung" bezeichnet. In der zsh-Dokumentation wird über Wörter gestritten.rc
(die plan9-Shell, ebenfalls auf Unix portiert) für ein noch besseres Design als zsh, wenn es um Variablen und Arrays geht.Die Wortteilung ist nicht wirklich Shell-spezifisch.
Die meisten Programme, die Texteingaben analysieren müssen, verwenden als ersten Schritt eine Form der Wortteilung. Dies erfolgt vor der Identifizierung anhand dieser "Wörter", Zahlen, Operatoren, Zeichenfolgen, Token und ähnlicher Entitäten, die sie verarbeiten müssen.
Das Besondere an den Shells ist, dass sie die Argumentliste der aufgerufenen Befehle (C argc / argv, python sys.argv) ordnungsgemäß erstellen müssen, einschließlich der Übergabe von Argumenten mit eingebetteten Leerzeichen, leeren Argumenten, benutzerdefinierten Begrenzern usw. Viele Shells verwenden die IFS-Variable, um dort eine gewisse Flexibilität zu ermöglichen.
quelle
In diesem speziellen Fall der ZSH wird das Wort Aufspalten etwas anders als Feldaufspaltung definiert.
Betrachten wir
prog a b c
, wird es ganz gleich in drei Argumente übergeben , wie Sie festgelegtIFS
. Dies ist Wort Spaltung.Wenn Sie das tun
A="a b c"; prog $A
, wird es in drei Argumente übergeben , wennIFS
sonst Raum oder ein Argument enthält. Dies ist Feldaufspaltung.Definitionen hier sind subtil. Was das Zsh Dokument versucht zu sagen ist , dass, selbst wenn Sie diese Option deaktivieren,
prog a b c
wird nach wie vor getrennte Argumente bekommen (das ist , was die Leute immer erwarten).quelle