[erledigt] Wieso unterschiedliche Ausgaben?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
GregorS
Beiträge: 3127
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

[erledigt] Wieso unterschiedliche Ausgaben?

Beitrag von GregorS » 25.08.2020 19:22:39

Hallo allerseits!

Die Ausgabe eines Befehls sieht anders aus, wenn ich sie in einer Variable speichere und mir die Variable ausgeben lasse. Wieso ist das so?

Hier mein Terminal

Code: Alles auswählen

gszaktilla@mimi:~$ find /home/gszaktilla/dokumente/ -type d -maxdepth 2 2>/dev/null
/home/gszaktilla/dokumente/
/home/gszaktilla/dokumente/prog
/home/gszaktilla/dokumente/prog/shell
/home/gszaktilla/dokumente/prog/cplusplus
/home/gszaktilla/dokumente/noch-mehr-platz
/home/gszaktilla/dokumente/in_arbeit
/home/gszaktilla/dokumente/elektronik
/home/gszaktilla/dokumente/online
/home/gszaktilla/dokumente/online/1.5
/home/gszaktilla/dokumente/platz
/home/gszaktilla/dokumente/downloads
/home/gszaktilla/dokumente/datensammlung
/home/gszaktilla/dokumente/datensammlung/hardware
/home/gszaktilla/dokumente/datensammlung/lost+found
/home/gszaktilla/dokumente/datensammlung/text
/home/gszaktilla/dokumente/datensammlung/images
/home/gszaktilla/dokumente/datensammlung/video
/home/gszaktilla/dokumente/datensammlung/mechanik
/home/gszaktilla/dokumente/datensammlung/online
/home/gszaktilla/dokumente/datensammlung/software
/home/gszaktilla/dokumente/datensammlung/vorlagen
/home/gszaktilla/dokumente/datensammlung/schriftkram_und_leute
/home/gszaktilla/dokumente/datensammlung/faxarchiv
/home/gszaktilla/dokumente/datensammlung/lustiges
/home/gszaktilla/dokumente/datensammlung/ideensammlung_projekte_kunden
/home/gszaktilla/dokumente/datensammlung/ehem_big-1
/home/gszaktilla/dokumente/datensammlung/sehr_altes_zeug
/home/gszaktilla/dokumente/datensammlung/audio
/home/gszaktilla/dokumente/datensammlung/elektronik
/home/gszaktilla/dokumente/datensammlung/von_anderen
/home/gszaktilla/dokumente/datensammlung/wine
/home/gszaktilla/dokumente/datensammlung/bilder
/home/gszaktilla/dokumente/datensammlung/tempus-kalender
/home/gszaktilla/dokumente/datensammlung/prog
/home/gszaktilla/dokumente/datensammlung/fonts
/home/gszaktilla/dokumente/datensammlung/in_arbeit_gewesen
/home/gszaktilla/dokumente/bild_und_grafik
/home/gszaktilla/dokumente/bild_und_grafik/buidl-kram_8
/home/gszaktilla/dokumente/bild_und_grafik/fotos
/home/gszaktilla/dokumente/bild_und_grafik/scans
gszaktilla@mimi:~$ BLA=`find /home/gszaktilla/dokumente/ -type d -maxdepth 2 2>/dev/null`
gszaktilla@mimi:~$ echo $BLA
/home/gszaktilla/dokumente/ /home/gszaktilla/dokumente/prog /home/gszaktilla/dokumente/prog/shell /home/gszaktilla/dokumente/prog/cplusplus /home/gszaktilla/dokumente/noch-mehr-platz /home/gszaktilla/dokumente/in_arbeit /home/gszaktilla/dokumente/elektronik /home/gszaktilla/dokumente/online /home/gszaktilla/dokumente/online/1.5 /home/gszaktilla/dokumente/platz /home/gszaktilla/dokumente/downloads /home/gszaktilla/dokumente/datensammlung /home/gszaktilla/dokumente/datensammlung/hardware /home/gszaktilla/dokumente/datensammlung/lost+found /home/gszaktilla/dokumente/datensammlung/text /home/gszaktilla/dokumente/datensammlung/images /home/gszaktilla/dokumente/datensammlung/video /home/gszaktilla/dokumente/datensammlung/mechanik /home/gszaktilla/dokumente/datensammlung/online /home/gszaktilla/dokumente/datensammlung/software /home/gszaktilla/dokumente/datensammlung/vorlagen /home/gszaktilla/dokumente/datensammlung/schriftkram_und_leute /home/gszaktilla/dokumente/datensammlung/faxarchiv /home/gszaktilla/dokumente/datensammlung/lustiges /home/gszaktilla/dokumente/datensammlung/ideensammlung_projekte_kunden /home/gszaktilla/dokumente/datensammlung/ehem_big-1 /home/gszaktilla/dokumente/datensammlung/sehr_altes_zeug /home/gszaktilla/dokumente/datensammlung/audio /home/gszaktilla/dokumente/datensammlung/elektronik /home/gszaktilla/dokumente/datensammlung/von_anderen /home/gszaktilla/dokumente/datensammlung/wine /home/gszaktilla/dokumente/datensammlung/bilder /home/gszaktilla/dokumente/datensammlung/tempus-kalender /home/gszaktilla/dokumente/datensammlung/prog /home/gszaktilla/dokumente/datensammlung/fonts /home/gszaktilla/dokumente/datensammlung/in_arbeit_gewesen /home/gszaktilla/dokumente/bild_und_grafik /home/gszaktilla/dokumente/bild_und_grafik/buidl-kram_8 /home/gszaktilla/dokumente/bild_und_grafik/fotos /home/gszaktilla/dokumente/bild_und_grafik/scans
gszaktilla@mimi:~$
Wieso sieht die Ausgabe von echo $BLA anders aus als die Ausgabe des find-Befehls?

Hintergrund: Ich benötige letztlich eine Liste, die der Ausgabe von find entspricht, weil ich sie anschließend mit grep um die Zeilen erleichtere, die „datensammlung“ enthalten. Grep mag aber nicht so wie ich will, wenn es die Eingabe nicht zeilenweise bekommt.

Der ganze Befehls-Wust lautet also

Code: Alles auswählen

find /home/gszaktilla/dokumente -type d -maxdepth 2 2>/dev/null | grep -iv datensammlung
Hinweise zur Lösung meines Problems werden begeistert entgegengenommen :-)

Gruß

Gregor
Zuletzt geändert von GregorS am 25.08.2020 22:02:03, insgesamt 1-mal geändert.
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Wieso unterschiedliche Ausgaben?

Beitrag von Meillo » 25.08.2020 19:27:16

Probier's mal mit Doublequotes. ;-)


Du kannst ja mal versuchen zu erklaeren, warum es dann geht.
Use ed once in a while!

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: Wieso unterschiedliche Ausgaben?

Beitrag von tobo » 25.08.2020 19:59:57

Abseits deines Quotingproblems sollte man das bestimmt auch direkt in find lösen können:

Code: Alles auswählen

find /home/gszaktilla/dokumente -type d -maxdepth 2 ! -iname datensammlung 2>/dev/null

Benutzeravatar
GregorS
Beiträge: 3127
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Wieso unterschiedliche Ausgaben?

Beitrag von GregorS » 25.08.2020 20:10:39

Meillo hat geschrieben: ↑ zum Beitrag ↑
25.08.2020 19:27:16
Probier's mal mit Doublequotes. ;-)
Den Hinweis kapiere ich nicht. Wo sollen da Zollzeichen hin?!
Du kannst ja mal versuchen zu erklaeren, warum es dann geht.
Ich möchte eine Liste von Verzeichnissen, in der es „datensammlung“ nicht gibt. Ziel ist, diese Liste in einem Skript abzuarbeiten (WIP):

Code: Alles auswählen

  for DIR in $SRC; do
    echo 
    echo "---------------------------------------------------"
    echo "Bearbeite $DIR"
    echo "---------------------------------------------------"
    if ! [ -e $DST/$DIR ]; then
      echo "*** VERZEICHNIS $DST/$DIR EXISTIERT NICHT! ***"
      echo "*************** ABBRUCH ***************"
      exit
    else
      echo "rsync $LOG $EXCLUDE $RSYNC_MISC_OPTS $RSYNC_EXCLUDE $DIR $DST/$DIR"
#      rsync $LOG $EXCLUDE $RSYNC_MISC_OPTS $RSYNC_EXCLUDE $DIR $DST/$DIR
    fi
  done
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Wieso unterschiedliche Ausgaben?

Beitrag von Meillo » 25.08.2020 20:17:42

tobo hat geschrieben: ↑ zum Beitrag ↑
25.08.2020 19:59:57
Abseits deines Quotingproblems sollte man das bestimmt auch direkt in find lösen können:
Stimmt, aber es braucht auch noch Sterne, da `-iname' in der Art von `-x' in grep matcht:

Code: Alles auswählen

find /home/gszaktilla/dokumente -type d -maxdepth 2 ! -iname '*datensammlung*' 2>/dev/null
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Wieso unterschiedliche Ausgaben?

Beitrag von Meillo » 25.08.2020 20:20:14

GregorS hat geschrieben: ↑ zum Beitrag ↑
25.08.2020 20:10:39
Meillo hat geschrieben: ↑ zum Beitrag ↑
25.08.2020 19:27:16
Probier's mal mit Doublequotes. ;-)
Den Hinweis kapiere ich nicht. Wo sollen da Zollzeichen hin?!
Du solltest jede Variablenexpansion in doppelte Anfuehrungzeichen einschliessen. Oft funktioniert es auch ohne, meist ist es mit aber besser. Die Unterschiede siehst du eben gerade bei deinem Problem.

Also statt:

Code: Alles auswählen

echo $foo
solltest du es so schreiben:

Code: Alles auswählen

echo "$foo"
Use ed once in a while!

Benutzeravatar
GregorS
Beiträge: 3127
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Wieso unterschiedliche Ausgaben?

Beitrag von GregorS » 25.08.2020 20:58:55

Meillo hat geschrieben: ↑ zum Beitrag ↑
25.08.2020 20:20:14
Du solltest jede Variablenexpansion in doppelte Anfuehrungzeichen einschliessen. Oft funktioniert es auch ohne, meist ist es mit aber besser. Die Unterschiede siehst du eben gerade bei deinem Problem.
Worin genau besteht der Unterschied, ob es funktioniert? Ich habe zwar seit rund 25 Jahren mit Linux zu tun, aber ein derartiges Problem ist mir noch nie begegnet.

Danke für den Hinweis!

Gruß

Gregor

PS: Dein find-Befehl funktioniert nicht:

Code: Alles auswählen

root@mimi:/home/gszaktilla# find  /home/gszaktilla/dokumente -type d -maxdepth 2 ! -iname '*datensammlung*' 2>/dev/null
/home/gszaktilla/dokumente
/home/gszaktilla/dokumente/prog
/home/gszaktilla/dokumente/prog/shell
/home/gszaktilla/dokumente/prog/cplusplus
/home/gszaktilla/dokumente/noch-mehr-platz
/home/gszaktilla/dokumente/in_arbeit
/home/gszaktilla/dokumente/elektronik
/home/gszaktilla/dokumente/online
/home/gszaktilla/dokumente/online/1.5
/home/gszaktilla/dokumente/platz
/home/gszaktilla/dokumente/downloads
/home/gszaktilla/dokumente/datensammlung/hardware
/home/gszaktilla/dokumente/datensammlung/lost+found
/home/gszaktilla/dokumente/datensammlung/text
/home/gszaktilla/dokumente/datensammlung/images
/home/gszaktilla/dokumente/datensammlung/video
/home/gszaktilla/dokumente/datensammlung/mechanik
/home/gszaktilla/dokumente/datensammlung/online
/home/gszaktilla/dokumente/datensammlung/software
/home/gszaktilla/dokumente/datensammlung/vorlagen
/home/gszaktilla/dokumente/datensammlung/schriftkram_und_leute
/home/gszaktilla/dokumente/datensammlung/faxarchiv
/home/gszaktilla/dokumente/datensammlung/lustiges
/home/gszaktilla/dokumente/datensammlung/ideensammlung_projekte_kunden
/home/gszaktilla/dokumente/datensammlung/ehem_big-1
/home/gszaktilla/dokumente/datensammlung/sehr_altes_zeug
/home/gszaktilla/dokumente/datensammlung/audio
/home/gszaktilla/dokumente/datensammlung/elektronik
/home/gszaktilla/dokumente/datensammlung/von_anderen
/home/gszaktilla/dokumente/datensammlung/wine
/home/gszaktilla/dokumente/datensammlung/bilder
/home/gszaktilla/dokumente/datensammlung/tempus-kalender
/home/gszaktilla/dokumente/datensammlung/prog
/home/gszaktilla/dokumente/datensammlung/fonts
/home/gszaktilla/dokumente/datensammlung/in_arbeit_gewesen
/home/gszaktilla/dokumente/bild_und_grafik
/home/gszaktilla/dokumente/bild_und_grafik/buidl-kram_8
/home/gszaktilla/dokumente/bild_und_grafik/fotos
/home/gszaktilla/dokumente/bild_und_grafik/scans
root@mimi:/home/gszaktilla# 
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Wieso unterschiedliche Ausgaben?

Beitrag von Meillo » 25.08.2020 21:26:54

GregorS hat geschrieben: ↑ zum Beitrag ↑
25.08.2020 20:58:55
Meillo hat geschrieben: ↑ zum Beitrag ↑
25.08.2020 20:20:14
Du solltest jede Variablenexpansion in doppelte Anfuehrungzeichen einschliessen. Oft funktioniert es auch ohne, meist ist es mit aber besser. Die Unterschiede siehst du eben gerade bei deinem Problem.
Worin genau besteht der Unterschied, ob es funktioniert?
Nach der Variablenexpansion wird die Befehlszeile erneut in Worte geteilt. Wenn im Variablenwert Whitespace ist wird der separate Worte geteilt:

Code: Alles auswählen

a="foo bar"
echo $a
Aus:

Code: Alles auswählen

echo $a
wird:

Code: Alles auswählen

echo foo bar
Dann wird `echo' mit *zwei* Argumenten aufgerufen.

Im Gegensatz dazu:

Code: Alles auswählen

a="foo bar"
echo "$a"
Aus:

Code: Alles auswählen

echo "$a"
wird:

Code: Alles auswählen

echo "foo bar"
Dann wird `echo' mit *einem* Argument aufgerufen.

In dem Beispiel siehst du keinen Unterschied. Er wird aber deutlich wenn du anderen Whitespace verwendest:

Code: Alles auswählen

a="foo    bar"
echo $a
echo "$a"
Aus:

Code: Alles auswählen

echo $a
wird:

Code: Alles auswählen

echo foo    bar
Die Ausgabe ist dann:

Code: Alles auswählen

foo bar
Weil `echo' zweischen jedes seiner Argumente einen Space setzt.

Aus:

Code: Alles auswählen

echo "$a"
wird dagegen:

Code: Alles auswählen

echo "foo    bar"
Die Ausgabe ist dann:

Code: Alles auswählen

foo    bar
Weil `echo' das eine Argument (mit dem enthaltenen Whitespace) so ausgibt wir es ist.

In deinem Fall war der Whitespace halt Newlines statt mehreren Spaces wie in diesem Beispiel. Der Effekt ist aber der gleiche: Ohne Quotes wird nach der Variablenexpansion an den Newlines in Worte gesplittet. Jeder Pfad ist dann ein eigenes Argument fuer `echo', die dann mit jeweils einem Space dazwischen ausgegeben werden.

Verwendest du Doublequotes, dann bleibt der Whitespace (also die Newlines) in dem *einen* Argument unangetastet.


Wenn du statt `echo' eine solche Funktion aufrufst, siehst du die Anzahl der Argumente:

Code: Alles auswählen

printargs() {
	echo "argc: $#"
	while [ $# -gt 0 ]; do
		echo "arg: $1"
		shift;
	done
}


P.S.
Warum der find-Befehl nicht funktioniert weiss ich nicht. Da muessen die find-Experten ran. Liegt vermutlich an der Bedinungsreihenfolge oder so. Da kenne ich mich nicht aus.
Use ed once in a while!

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: Wieso unterschiedliche Ausgaben?

Beitrag von tobo » 25.08.2020 21:51:19

Vom eingesetzten Dateinamen mal abgesehen hatte ich mir oben auch die Dateiliste nicht sorgfältig genug angeschaut!? So sollte das dann eventuell besser passen:

Code: Alles auswählen

find /home/gszaktilla/dokumente -type d -maxdepth 2 ! -ipath '*datensammlung*' 2>/dev/null

Benutzeravatar
GregorS
Beiträge: 3127
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Wieso unterschiedliche Ausgaben?

Beitrag von GregorS » 25.08.2020 22:01:41

tobo hat geschrieben: ↑ zum Beitrag ↑
25.08.2020 21:51:19
Vom eingesetzten Dateinamen mal abgesehen hatte ich mir oben auch die Dateiliste nicht sorgfältig genug angeschaut!? So sollte das dann eventuell besser passen:

Code: Alles auswählen

find /home/gszaktilla/dokumente -type d -maxdepth 2 ! -ipath '*datensammlung*' 2>/dev/null
Jetzt sieht es gut aus. Danke!

Die Optionen -iname und -ipath kannte ich noch nicht.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Wieso unterschiedliche Ausgaben?

Beitrag von JTH » 26.08.2020 10:31:25

Meillo hat geschrieben: ↑ zum Beitrag ↑
25.08.2020 21:26:54
Aus:

Code: Alles auswählen

echo $a
wird:

Code: Alles auswählen

echo foo    bar
Die Ausgabe ist dann:

Code: Alles auswählen

foo bar
Weil `echo' zweischen jedes seiner Argumente einen Space setzt.
Da muss ich doch mal Erbsen zählen ;-)

echo trennt in der Ausgabe zwar auch mehrere Argumente durch ein Leerzeichen, die drei Leerzeichen verschwinden hier allerdings schon beim Ersetzen der Variable:

Aus:

Code: Alles auswählen

echo $a
wird:

Code: Alles auswählen

echo foo bar
Die Shell selbst ersetzt hier schon mehrere Leerzeichen, Zeilenumbrüche oder Tabulatoren durch ein einzelnes Leerzeichen, im Rahmen des Word-Splitting. Word-Splitting findet fast immer dann statt, wenn man Variablen nicht quotet "...", deshalb sollte man das zur Sicherheit fast immer tun, um unerwartete Effekte zu vermeiden.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Wieso unterschiedliche Ausgaben?

Beitrag von Meillo » 26.08.2020 11:15:22

JTH hat geschrieben: ↑ zum Beitrag ↑
26.08.2020 10:31:25
Meillo hat geschrieben: ↑ zum Beitrag ↑
25.08.2020 21:26:54
Aus:

Code: Alles auswählen

echo $a
wird:

Code: Alles auswählen

echo foo    bar
Die Ausgabe ist dann:

Code: Alles auswählen

foo bar
Weil `echo' zweischen jedes seiner Argumente einen Space setzt.
Da muss ich doch mal Erbsen zählen ;-)
Da mache ich gerne mit, ich glaube naemlich, dass du falsch liegst. ;-)
echo trennt in der Ausgabe zwar auch mehrere Argumente durch ein Leerzeichen, die drei Leerzeichen verschwinden hier allerdings schon beim Ersetzen der Variable:

Aus:

Code: Alles auswählen

echo $a
wird:

Code: Alles auswählen

echo foo bar
Die Shell selbst ersetzt hier schon mehrere Leerzeichen, Zeilenumbrüche oder Tabulatoren durch ein einzelnes Leerzeichen, im Rahmen des Word-Splitting. Word-Splitting findet fast immer dann statt, wenn man Variablen nicht quotet "...", deshalb sollte man das zur Sicherheit fast immer tun, um unerwartete Effekte zu vermeiden.
Mein Problem an deiner Aussage ist das Wort ``ersetzt''. Ersetzen ist eine Operation, bei der Zeichen in einem String geaendert werden. Wenn man in C in einem String mehrere Whitespace-Zeichen durch einen Space ersetzen will, dann ist das eine recht aufwaendige Angelegenheit. Entweder man muss im Char-Array das Dahinterstehende nachruecken oder man muss den String stueckweise umkopieren. Warum sollte die Shell das machen, wenn es nicht noetig ist?

Die Variablenexpansion selbst wird die Ersetzung nicht machen, weil sie sonst, je nach Quoting underschiedlich arbeiten muesste. Das Word-Splitting selbst hat keine Notwendigkeit die Ersetzung durchzufuehren, da es den String nur aufteilt. Es erzeugt also ein Array von Char-Pointern in den String und zwar jeweils zum Anfang des Worts. Die ganzen IFS-Zeichen, die Wortzwischenraeme darstellen, kann man durch Null-Bytes ersetzen. Da ist es egal ob es eines oder mehrere sind. Heraus kommt ein argv-Array, das man exec(3) uebergeben kann.

Die Shell hat beim Aufrufen des Befehls ja gar keine Zwischenraumzeichen mehr. Es hat nur noch ein Array von Strings, die jeweils fuer ein Wort und damit fuer ein Argument stehen. Die Zwischenraeume also zu verkuerzen waere unnoetige Arbeit.


Auf der von dir verlinkten Seite steht:
https://wiki.bash-hackers.org/syntax/expansion/wordsplit hat geschrieben: The results of the expansions mentioned above are scanned for IFS-characters. If one or more (in a sequence) of them is found, the expansion result is split at these positions into multiple words.
Ich finde hier nichts von einem Ersetzen.


Auch in POSIX steht nichts davon:
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05 hat geschrieben: After parameter expansion (Parameter Expansion), command substitution (Command
Substitution), and arithmetic expansion (Arithmetic Expansion), the shell shall
scan the results of expansions and substitutions that did not occur in
double-quotes for field splitting and multiple fields can result.

The shell shall treat each character of the IFS as a delimiter and use the
delimiters as field terminators to split the results of parameter expansion,
command substitution, and arithmetic expansion into fields.

1. If the value of IFS is a <space>, <tab>, and <newline>, or if it is unset, any
sequence of <space>, <tab>, or <newline> characters at the beginning or end of
the input shall be ignored and any sequence of those characters within the
input shall delimit a field. For example, the input:

<newline><space><tab>foo<tab><tab>bar<space>


yields two fields, foo and bar.

2. If the value of IFS is null, no field splitting shall be performed.

3. Otherwise, the following rules shall be applied in sequence. The term " IFS
white space" is used to mean any sequence (zero or more instances) of
white-space characters that are in the IFS value (for example, if IFS contains
<space>/ <comma>/ <tab>, any sequence of <space> and <tab> characters is
considered IFS white space).

a. IFS white space shall be ignored at the beginning and end of the input.

b. Each occurrence in the input of an IFS character that is not IFS white
space, along with any adjacent IFS white space, shall delimit a field, as
described previously.

c. Non-zero-length IFS white space shall delimit a field.

Ich bin mir ziemlich sicher, dass mehrfache IFS-Zeichen *nicht* durch eines ersetzt werden. Sie gehen einfach dadurch verloren, dass sie beim Word-Splitting wegfallen, weil ab da nur noch Worte, nicht aber mehr Wortzwischenraeume interessieren.
Use ed once in a while!

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Wieso unterschiedliche Ausgaben?

Beitrag von JTH » 26.08.2020 13:09:26

Meillo hat geschrieben: ↑ zum Beitrag ↑
26.08.2020 11:15:22
Da mache ich gerne mit, ich glaube naemlich, dass du falsch liegst. ;-)
Gerne, aus deinen Beiträgen lernt man immer was :-)

Meillo hat geschrieben: ↑ zum Beitrag ↑
26.08.2020 11:15:22
Mein Problem an deiner Aussage ist das Wort ``ersetzt''. […] Warum sollte die Shell das machen, wenn es nicht noetig ist?

[…] Das Word-Splitting selbst hat keine Notwendigkeit die Ersetzung durchzufuehren, da es den String nur aufteilt. Es erzeugt also ein Array von Char-Pointern in den String und zwar jeweils zum Anfang des Worts. Die ganzen IFS-Zeichen, die Wortzwischenraeme darstellen, kann man durch Null-Bytes ersetzen. Da ist es egal ob es eines oder mehrere sind. Heraus kommt ein argv-Array, das man exec(3) uebergeben kann.

Die Shell hat beim Aufrufen des Befehls ja gar keine Zwischenraumzeichen mehr. Es hat nur noch ein Array von Strings, die jeweils fuer ein Wort und damit fuer ein Argument stehen.

[…]

Ich bin mir ziemlich sicher, dass mehrfache IFS-Zeichen *nicht* durch eines ersetzt werden. Sie gehen einfach dadurch verloren, dass sie beim Word-Splitting wegfallen, weil ab da nur noch Worte, nicht aber mehr Wortzwischenraeume interessieren.
Du hast völlig recht, da hab ich oben einen Schritt zu kurz gedacht :oops:

Wenn ich mir die Implementierung[1] – der Bash – von word_split[2] grob anschaue, werden da[3] schon die einzelnen Worte[4, 5] fröhlich nochmal kopiert[6, 7] (zweimal sogar),aber definitiv nicht vorher mehrere IFS-Zeichen durch eines ersetzt. Wirklich beim Word-Splitting nur eine Liste mit char * zurückzugeben, wie du vermutest, wäre wahrscheinlich zu speziell nur für den Anwendungsfall mit der Liste anschließend execX aufzurufen.

Wobei, die dash ersetzt tatsächlich mit \0 [8, 9] :-)

(Beides wahrscheinlich oberflächliche Blicke auf den jeweiligen Code.)

[1] https://git.savannah.gnu.org/cgit/bash. ... -5.0#n2726
[2] https://git.savannah.gnu.org/cgit/bash. ... 5.0#n10768
[3] https://git.savannah.gnu.org/cgit/bash. ... -5.0#n2835
[4] https://git.savannah.gnu.org/cgit/bash. ... sh-5.0#n38
[5] https://git.savannah.gnu.org/cgit/bash. ... h-5.0#n140
[6] https://git.savannah.gnu.org/cgit/bash. ... sh-5.0#n91
[7] https://git.savannah.gnu.org/cgit/bash. ... sh-5.0#n38
[8] https://salsa.debian.org/debian/dash/-/ ... and.c#L187
[9] https://salsa.debian.org/debian/dash/-/ ... nd.c#L1099
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [erledigt] Wieso unterschiedliche Ausgaben?

Beitrag von Meillo » 26.08.2020 13:27:54

Cool! Danke fuer die Blicke in den Code.

Durch deinen Einstieg in das Thema (voellig egal dass du falsch gelesen bist), haben wir beide (und vermutlich noch ein paar weitere Mitleser) etwas gelernt. :THX: Darauf kommt es an. Darum bin ich gerne hier: weil ich Motivation und Einstiegspunkte finde, mich mit den Themen naeher zu beschaeftigen. Natuerlich koennte ich am Sonntagnachmittag auch so mal POSIX lesen ... es passiert bloss nicht (so oft ;-) ), irgendwie ist das zu beliebig. Aber wenn es spannende Probleme mit Detailknobeleien und Erbenzaehlerei gibt, dann lese ich liebend gerne nach, recherchiere, teste ... und lerne immer wieder Neues kennen. Dafuer braucht es den Dialog, die gegenseitige Inspration. Das hat hier ja mal wieder super geklappt. :-)

Also, weiter so!
Use ed once in a while!

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [erledigt] Wieso unterschiedliche Ausgaben?

Beitrag von JTH » 26.08.2020 15:06:48

Meillo hat geschrieben: ↑ zum Beitrag ↑
26.08.2020 13:27:54
Darum bin ich gerne hier: weil ich Motivation und Einstiegspunkte finde, mich mit den Themen naeher zu beschaeftigen. Natuerlich koennte ich am Sonntagnachmittag auch so mal POSIX lesen ... es passiert bloss nicht (so oft ;-) ), irgendwie ist das zu beliebig. Aber wenn es spannende Probleme mit Detailknobeleien und Erbenzaehlerei gibt, dann lese ich liebend gerne nach, recherchiere, teste ... und lerne immer wieder Neues kennen.
Das geht mir genau so. Mit alltäglichen Konfigurationsproblemen u.a. kann man sich auch bei der Arbeit genug herumschlagen, für nen Blick in die Tiefe findet sich dann hier gelegentlich mal ein Anstoß :THX:
Manchmal bekannt als Just (another) Terminal Hacker.

Antworten