WinFuture-Forum.de: Unix Shell: Unterschiede Zwischen Pipe Und Backticks - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Linux
Seite 1 von 1

Unix Shell: Unterschiede Zwischen Pipe Und Backticks Fragen zum Thread "Der Einstieg In Die Shell"


#1 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 429
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 15. November 2008 - 12:32

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
Eingefügtes Bild
0

Anzeige



#2 Mitglied ist offline   SpaceCowboy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 762
  • Beigetreten: 17. August 04
  • Reputation: 1

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
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?
0

#3 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 429
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 15. November 2008 - 13:33

Hi SpaceCowboy,

erstmal vielen Dank für Deine Antwort.

Beitrag anzeigenZitat (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.

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
Eingefügtes Bild
0

#4 _lustiger_affe_

  • Gruppe: Gäste

geschrieben 15. November 2008 - 15:15

Zitat

Warum also gibt es keine Ausgabe?
Weil das in manchen Situationen nicht klappt(stdout,stderr,...), das gewünschte liesse sich hier aber mit
whoami | xargs echo
erreichen.

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

0

#5 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 15. November 2008 - 16:05

Einen hätte ich noch. :D
whoami | cat

0

#6 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 429
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 15. November 2008 - 18:38

Hallo,

danke für Eure Antworten.

Beitrag anzeigenZitat (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? :whistling:

Beitrag anzeigenZitat (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 echo
erreichen.

Genau das, was Du als "manche Situationen" bezeichnet hast, interessiert mich! Wir kommen meinem Problem also näher. :P 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?

Beitrag anzeigenZitat (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?

Beitrag anzeigenZitat (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

:rolleyes:
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
Eingefügtes Bild
0

#7 _lustiger_affe_

  • Gruppe: Gäste

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?
Handbücher sind nunmal zum Lesen da, einzelne Informationen findet man auch bei Google/Wiki. Wenn du die manpage nicht verstehst, dann kannst du betreffende Passagen ja zur Klärung pasten, aber alles neuschreiben ist nunmal etwas...sinnlos?!

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?
Ja.
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
Die erste Zeile weist der Variablen NAME den Wert "whoami | echo" zu, die zweite Zeile hingegen die Ausgabe des in `` gesetzten Befehls, ergo den Usernamen, mit dem du eingeloggt bist.

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.
0

#8 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 429
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

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? :whistling:
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
Eingefügtes Bild
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0