[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bash-Frage



Hallo Andre,

> Folgendes ist mir nicht ganz klar:
> 
> $ a="x
> > y
> > z"
> 
> $ echo $a
> x y z
> 
> $ echo "$a"
> x
> y
> z
> 
> Warum wird das unterschiedlich dargestellt?

Das Stichwort ist Word Splitting. In [Ba]sh werden erst die Parameter
ersetzt und dannach Word Splitting angewendet. Dieses legt fest, deine
Zeile in einzelne Wörter aufgeteilt wird. Dazu wird der String an
allen Zeichen, die in der Variable IFS stehen, aufgeteilt.
In ersterem Fall werden echo also 3 parameter übergeben: "a", "b" und
"c". Echo gibt einfach alle übergebenen parameter mit leerzeichen
getrennt aus. (deswegen gibt "echo a         b" dir auch "a b" aus)

Im zweiten Fall quotest du den Parameter, damit wird $a komplett als
ein parameter übergeben und unterliegt nicht dem splitting. Damit
bleiben die Zeilenumbrüche erhalten.

> Ähnlicher Fall:
> 
> $ ls
> a  b  c
> 
> $ ls | grep b
> b
> 
> $ echo a b c | grep b
> a b c

Hier passiert was ganz anderes. ls verhält sich auf einem tty
(also wenn es direkt auf die konsole ausgibt) anders als wenn es z.B.
in eine Pipe oder Datei ausgibt (probier mal "ls | cat"), da steht dann
jede Datei auf einer Zeile und grep sucht zeilenweise.

Bitte beachte, dass man NIEMALS auf "ls" greppen soll, das ist
ist schlicht ein Fehler und es gibt immer einfachere und bessere Wege
für das, was du tun willst. Weitere Infos dazu gibts im wooledge-wiki: 
http://mywiki.wooledge.org/BashPitfalls

> Ah, ich sehe einen:
> 
> $ ls | od -cx
> 0000000   a  \n   b  \n   c  \n
>            0a61    0a62    0a63
> 
> Wieso wird \n in der Ausgabe von ls nicht als newline dargestellt,
> hier aber schon:
> 
> $ echo -ne "a\nb"
> a
> b
> 
> Ich steh hier grad auf dem Schlauch... Vielleicht hat jemand ein paar
> Gedanken dazu.

Wie oben erwähnt, "weis" ein Prozess, ob seine Ausgabe auf das Terminal
geschrieben wird oder in eine Datei bzw Pipe. Manche Prozesse verhalten
sich in diesen Fällen unterschiedlich.

Liebe Grüße,
Micha


Reply to: