Verständnis des Standardwerts von IFS


10

In meiner GNU-Bash-Version 4.2.8 hat IFS standardmäßig den Standardwert für Leerzeichen, Tabulator und Zeilenvorschub:

usr@T42 ~ $ echo -n "$IFS" | hexdump -C
00000000  20 09 0a                                          | ..|
00000003
usr@T42 ~ $ 

Gibt es einen Grund für ein solches Standard-IFS? Welche Dienstprogramme verwenden IFS neben dem integrierten Bash read?

Antworten:


13

Die IFS - Variable wird jedes Mal die Shell führt eine Aufgabe genannt verwendet Wörter aufgespalten . Die häufigsten Fälle, in denen dies verwendet wird, sind nach der Parametererweiterung (z. B. $var) oder der Befehlssubstitution (z. B. $(some-command)oder den veralteten Backticks) in einem Befehl. Wenn die Erweiterung IFSZeichen enthält , wird sie vor der Verarbeitung des Befehls in verschiedene Wörter aufgeteilt. Tatsächlich bedeutet dies, dass diese Zeichen den ersetzten Text in verschiedene Argumente aufteilen (einschließlich des Namens des Befehls, wenn die Variable zuerst angegeben wird).

Der Grund für den Standardwert IFSLeerzeichen, Tabulator und Zeilenumbruch ist daher, dass dies die Leerzeichen sind, von denen normalerweise erwartet wird, dass sie ein Wort teilen.

Eine Möglichkeit, das Aufteilen von Wörtern zu verhindern, besteht darin, die Erweiterung ( "$var") in doppelte Anführungszeichen zu setzen - tatsächlich haben Sie dies in Ihrer Frage getan. Wenn Sie dies nicht tun würden, gäbe es keine Ausgabe von, echoda es keine Argumente hätte, sondern nur Zeichen, die Argumente aufteilen.

Beachten Sie auch, dass zwei Stellen, an denen nach der Parametererweiterung keine Wortaufteilung stattfindet, mit variabler Zuweisung (z. B. var=$othervarund var=$(somecommand)in Ordnung) und innerhalb des [[ ]]Konstrukts ( [[ $var = $othervar ]]in Ordnung, aber [ $var = $othervar ]in Anführungszeichen gesetzt) ​​sind.

Schließlich ist, wie ein weiser Mann mir einmal sagte, ein häufiges Missverständnis, dass die Verhinderung der Wortteilung der einzige Grund ist, eine Variable zu zitieren. Ist dies nicht der Fall, verhindert das Zitieren auch die Erweiterung von Pfadnamen oder Globs, wie es allgemein bekannt ist. Wenn eine Variable Glob-Zeichen wie *diese enthält, können diese zu Dateinamen erweitert werden, wenn die Variable in einem Befehl ohne Anführungszeichen verwendet wird. Betrachten Sie zB:

var=*
echo $var

Dadurch werden die Namen der Dateien im aktuellen Verzeichnis angezeigt.

Wie Stephane weiter unten ausführt , ist die Reihenfolge der Zeichen IFSbeim Erweitern von Bedeutung "$*". Von der bashManpage:

"$*" is equivalent to "$1c$2c...", where c is the first character of the value of
the IFS variable.  If IFS is unset, the parameters are separated by spaces.  If
IFS is null, the parameters are joined without intervening separators.

Weitere Beispiele für die Wortteilung finden Sie in dieser Antwort: /unix//a/118444/48083


1
Das erste Zeichen von $IFSwird auch verwendet "$*", weshalb die Reihenfolge wichtig ist.
Stéphane Chazelas

2
Beachten Sie auch, dass zshdas NUL-Zeichen standardmäßig enthalten ist $IFS(andere Shells unterstützen das Halten des NUL-Zeichens in ihren Variablen nicht).
Stéphane Chazelas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.