Hallo allerseits,
ich bin in einem Abschnitt des Threads Der Einstieg In Die Shell auf einige Dinge gestoßen, die ich nicht ganz verstehe:
Pipes werden im o.g. Thread erklärt, aber das dort angegebene Beispiel cat sehrlangedatei.txt | less hat bei mir dieselbe Wirkung, als würde ich einfach less sehrlangedatei.txt eintippen. Wozu soll die genannte Kombination aus cat und less gut sein?
Die Verwendung von Backticks wird im o.g. Thread am Beispiel von echo `whoami` erklärt: Zunächst wird der Befehl whoami ausgeführt und anschließend dessen Ausgabe an den Befehl echo weitergeleitet. Dies ist sicher kein sehr glücklich gewähltes Beispiel, da dieselbe Wirkung auch durch bloße Eingabe von whoami erzielt werden könnte, aber der wichtigere Punkt ist: Warum kann man denn hier keine Pipe verwenden: echo | whoami gibt einen "Broken pipe" error. Ich hatte eigentlich (nach den vorigen Erklärungen zu den Pipes im o.g. Thread) gedacht, die Ausgabe von whoami wird über die Pipe an echo weitergereicht, aber das stimmt offenbar nicht?!
Kann insofern jemand nochmal den genauen Unterschied zwischen Pipes und Backticks erklären und eventuell einleuchtende Beispiele liefern, wann man welches Verfahren anwenden würde? In dem o.g. Thread sind die Beispiele, sofern ich diese richtig verstanden habe, ein kleines bisschen zu konstruiert, da man dieselbe Wirkung auch mit anderen, einfacheren Mitteln erreichen könnte.
Vielen Dank und schöne Grüße
Def
Seite 1 von 1
Unix Shell: Unterschiede Zwischen Pipe Und Backticks Fragen zum Thread "Der Einstieg In Die Shell"
Anzeige
#2
geschrieben 15. November 2008 - 13:05
mit einer pipe übergibst du die ausgabe des ersten befehls (vor der pipe) in die pipe.
echo | whoami kann nicht funktieren weil echo in dem fall nichts ausgibt und whoami sowieso mit einer ausgabe nichts anfangen könnte.
zB
würde die ausgabe von df -ah in eine mail schmeissen.
dabei kannst du beliebig viele pipes aneinanderreihen. zB beim grepen in den logs ganz hilfreich.
das beispiel mit den backticks bei whoami find ich eigentlich ganz gut erklärt. was ist daran unverständlich?
echo | whoami kann nicht funktieren weil echo in dem fall nichts ausgibt und whoami sowieso mit einer ausgabe nichts anfangen könnte.
zB
df -ah | mail
würde die ausgabe von df -ah in eine mail schmeissen.
dabei kannst du beliebig viele pipes aneinanderreihen. zB beim grepen in den logs ganz hilfreich.
das beispiel mit den backticks bei whoami find ich eigentlich ganz gut erklärt. was ist daran unverständlich?
have you tried turning it off and on again?
#3
geschrieben 15. November 2008 - 13:33
Hi SpaceCowboy,
erstmal vielen Dank für Deine Antwort.
Ja, da hast Du vollkommen recht; das habe ich durcheinandergebracht.
Aber warum bringt whoami | echo keine Ausgabe? Die Ausgabe des Befehls whoami müsste doch damit an den Befehl echo übergeben werden, der diese dann auf den Bildschirm schreibt. Warum also gibt es keine Ausgabe?
Also: Warum muss ich hier die Konstruktion mit den Backticks benutzen und nicht die Pipe? Was ist der Unterschied zwischen Backticks und Pipes?
Viele Grüße
Def
erstmal vielen Dank für Deine Antwort.
Zitat (SpaceCowboy: 15.11.2008, 14:05)
mit einer pipe übergibst du die ausgabe des ersten befehls (vor der pipe) in die pipe.
echo | whoami kann nicht funktieren weil echo in dem fall nichts ausgibt und whoami sowieso mit einer ausgabe nichts anfangen könnte.
echo | whoami kann nicht funktieren weil echo in dem fall nichts ausgibt und whoami sowieso mit einer ausgabe nichts anfangen könnte.
Ja, da hast Du vollkommen recht; das habe ich durcheinandergebracht.
Aber warum bringt whoami | echo keine Ausgabe? Die Ausgabe des Befehls whoami müsste doch damit an den Befehl echo übergeben werden, der diese dann auf den Bildschirm schreibt. Warum also gibt es keine Ausgabe?
Also: Warum muss ich hier die Konstruktion mit den Backticks benutzen und nicht die Pipe? Was ist der Unterschied zwischen Backticks und Pipes?
Viele Grüße
Def
#4 _lustiger_affe_
geschrieben 15. November 2008 - 15:15
Zitat
Warum also gibt es keine Ausgabe?
whoami | xargs echoerreichen.
Manchmal sind beide Varianten möglich, aber spätestens, wenn man mehr als 2 Befehle verketten will, wird es nur mit Backticks schwierig. Abgesehen davon ist z.B. eine Variablenzuweisung mit Pipes nicht möglich, ergo
export NAME="whoami | echo" -> $NAME="whoami | echo" export NAME=`whoami` -> $NAME=deinUser
Mehr Info?
man `basename $SHELL`
Dieser Beitrag wurde von lustiger_affe bearbeitet: 15. November 2008 - 15:26
#5
geschrieben 15. November 2008 - 16:05
Einen hätte ich noch.
whoami | cat
#6
geschrieben 15. November 2008 - 18:38
Hallo,
danke für Eure Antworten.
Sind Nachfragen erlaubt, oder bestehst Du darauf, dass ich mich auf das Nachschlagen in der Manpage beschränke?
Genau das, was Du als "manche Situationen" bezeichnet hast, interessiert mich! Wir kommen meinem Problem also näher. Könnte man sagen, dass der Befehl echo ein Argument benötigt, das die Backticks liefern, während die Pipe standardmäßig kein Argument, sondern, hm, sagen wir, einen "Eingangswert" liefert? Und dass Du genau diesen "Eingangswert" mit xargs in ein Argument umwandelst?
Und dass der Befehl cat eben genau einen solchen "Eingangswert" benötigt, und daher kein xargs benötigt?
Okay, diesen Code verstehe ich (noch) nicht, aber Deine Erklärungen klingen ansonsten logisch.
Nochmal vielen Dank an Euch beide!
Schöne Grüße
Def
danke für Eure Antworten.
Zitat (funky_monkey: 15.11.2008, 16:15)
Mehr Info?
man `basename $SHELL`
Sind Nachfragen erlaubt, oder bestehst Du darauf, dass ich mich auf das Nachschlagen in der Manpage beschränke?
Zitat (funky_monkey: 15.11.2008, 16:15)
Weil das in manchen Situationen nicht klappt(stdout,stderr,...), das gewünschte liesse sich hier aber mit
whoami | xargs echoerreichen.
Genau das, was Du als "manche Situationen" bezeichnet hast, interessiert mich! Wir kommen meinem Problem also näher. Könnte man sagen, dass der Befehl echo ein Argument benötigt, das die Backticks liefern, während die Pipe standardmäßig kein Argument, sondern, hm, sagen wir, einen "Eingangswert" liefert? Und dass Du genau diesen "Eingangswert" mit xargs in ein Argument umwandelst?
Zitat (Witi: 15.11.2008, 17:05)
whoami | cat
Und dass der Befehl cat eben genau einen solchen "Eingangswert" benötigt, und daher kein xargs benötigt?
Zitat (funky_monkey: 15.11.2008, 16:15)
Manchmal sind beide Varianten möglich, aber spätestens, wenn man mehr als 2 Befehle verketten will, wird es nur mit Backticks schwierig. Abgesehen davon ist z.B. eine Variablenzuweisung mit Pipes nicht möglich, ergo
export NAME="whoami | echo" -> $NAME="whoami | echo" export NAME=`whoami` -> $NAME=deinUser
Okay, diesen Code verstehe ich (noch) nicht, aber Deine Erklärungen klingen ansonsten logisch.
Nochmal vielen Dank an Euch beide!
Schöne Grüße
Def
#7 _lustiger_affe_
geschrieben 15. November 2008 - 19:54
Zitat
Sind Nachfragen erlaubt, oder bestehst Du darauf, dass ich mich auf das Nachschlagen in der Manpage beschränke?
Zitat
Könnte man sagen, dass der Befehl echo ein Argument benötigt, das die Backticks liefern, während die Pipe standardmäßig kein Argument, sondern, hm, sagen wir, einen "Eingangswert" liefert? Und dass Du genau diesen "Eingangswert" mit xargs in ein Argument umwandelst?
Wenn ein Programm auf Grund der Gestaltung nicht mit Pipes umgehen kann, bringt es logischerweise nichts, es mit Werten über die Pipe zu bombardieren. Annähernd alles, was in den coreutils ist, lässt sich per Pipe bedienen, darüber hinaus gibt es keine Regeln, wer sein Programm wie schreibt, folglich bleibt nichts anderes übrig, als auszuprobieren.
Zitat
Okay, diesen Code verstehe ich (noch) nicht
xargs alleine funktioniert auch nicht immer, je nach Programm, manchmal muss es xargs -0 sein, manchmal noch mehr.
Folglich, ohne lesen, verstehen und ausprobieren kommt man nicht weit.
#8
geschrieben 15. November 2008 - 20:27
Hallo funky_monkey,
danke so weit erstmal für Deine Erläuterungen. In Grundzügen fange ich jetzt an zu verstehen, was dort abläuft.
Was das Lesen von Anleitungen angeht, hast Du allgemein natürlich recht. Mein Verständnisproblem betraf offenbar verschiedene Bereiche - nicht nur die Shell, sondern auch die ähnliche aber eben doch unterschiedliche Funktionsweise solcher Befehle wie echo und cat. Klar kann man das durch ausgiebiges Lesen aller relevanten Anleitungen, Nachdenken und beharrliches Ausprobieren auch selbst rausfinden, aber meiner Meinung nach ist es ja auch irgendwie der Sinn ein Forums, dass man Fragen stellen kann, oder?
Wie auch immer, jedenfalls vielen Dank für Deine Ausführungen. Mir sind die Dinge jetzt auf jeden Fall so weit klar, dass ich erstmal keine weiteren Fragen habe. Kann auch gut sein, dass ich von hier an tatsächlich ohne fremde Hilfe klarkomme - vorerst zumindest...
Viele Grüße
Def
danke so weit erstmal für Deine Erläuterungen. In Grundzügen fange ich jetzt an zu verstehen, was dort abläuft.
Was das Lesen von Anleitungen angeht, hast Du allgemein natürlich recht. Mein Verständnisproblem betraf offenbar verschiedene Bereiche - nicht nur die Shell, sondern auch die ähnliche aber eben doch unterschiedliche Funktionsweise solcher Befehle wie echo und cat. Klar kann man das durch ausgiebiges Lesen aller relevanten Anleitungen, Nachdenken und beharrliches Ausprobieren auch selbst rausfinden, aber meiner Meinung nach ist es ja auch irgendwie der Sinn ein Forums, dass man Fragen stellen kann, oder?
Wie auch immer, jedenfalls vielen Dank für Deine Ausführungen. Mir sind die Dinge jetzt auf jeden Fall so weit klar, dass ich erstmal keine weiteren Fragen habe. Kann auch gut sein, dass ich von hier an tatsächlich ohne fremde Hilfe klarkomme - vorerst zumindest...
Viele Grüße
Def
Thema verteilen:
Seite 1 von 1