Festlegen eines IFS für ein Bash-Skript

7

Der typische Fall ist IFS= read.
Das Thema wird in diesem Thread sehr gut erklärt:
Warum ist das Setzen einer Variablen vor einem Befehl in bash legal?
Um ein vollständiges Bild zu erhalten, wäre ich Ihnen sehr dankbar, wenn Sie erklären könnten, warum das folgende Skript nicht wie erwartet funktioniert.
my_script::

#!/bin/bash

echo "$var1"
echo -n "$IFS" | xxd -p
echo "$var2"

exit 0

Aufruf my_script:

var1=foo IFS= var2=bar my_script

Ausgabe:

foo
20090a
bar

Wie Sie sehen können, IFSist unverändert, immer noch als Standard festgelegt.
Wie kommt readder Brauch, IFSwenn er als aufgerufen wird IFS= read?
Vielen Dank im Voraus

Claudio
quelle
Siehe auch Wann kann ich ein temporäres IFS für die Feldaufteilung verwenden? (Aber wie Thomas Dickeys Antwort erklärt, kommen Sie nicht so weit).
Gilles 'SO - hör auf böse zu sein'

Antworten:

11

Das Beispiel wird nicht IFSim Skript festgelegt, da bash den Import IFSaus der Umgebung nicht zulässt. Dies geht aus einem Kommentar in variables.c:

  /* Don't allow IFS to be imported from the environment. */
  temp_var = bind_variable ("IFS", " \t\n", 0);
  setifs (temp_var); 

Integrierte Befehle und Nicht- Skript- Verwendungen erhalten IFSnatürlich die Zuordnung zu , aber denken Sie daran, dass dies IFSnur für die Wortteilung gilt :

Die Shell behandelt jedes Zeichen $IFSals Trennzeichen und teilt die Ergebnisse der anderen Erweiterungen in Wörter auf, wobei diese Zeichen als Feldterminatoren verwendet werden. Wenn IFSnicht festgelegt oder der Wert genau <space><tab><newline>der Standardwert ist, werden Sequenzen von <space>, <tab>und <newline>am Anfang und Ende der Ergebnisse der vorherigen Erweiterungen ignoriert, und jede Zeichenfolge, IFSdie nicht am Anfang oder Ende steht, dient zur Abgrenzung von Wörtern. Wenn IFSder Wert anders als der Standardwert ist, werden die Sequenzen des Leerzeichenzeichens und der Registerkarte am Anfang und Ende des Wortes ignoriert, solange das Leerzeichen den Wert IFS(ein IFSLeerzeichen) hat. Jedes Zeichen IFSdarin ist kein IFS-Leerzeichen, zusammen mit einem benachbartenIFSLeerzeichen, begrenzt ein Feld. Eine Folge von IFSLeerzeichen wird ebenfalls als Trennzeichen behandelt. Wenn der Wert von IFSnull ist, erfolgt keine Wortaufteilung.

Thomas Dickey
quelle