2012-04-05 3 views
2

Warum zeigt es nichts? Warum ist es nicht zeigtShell-Skript kann keine Dateidaten an die Shell-Eingabe übergeben

 April 2012  
Su Mo Tu We Th Fr Sa 
1 2 3 4 5 6 7 
8 9 10 11 12 13 14 
15 16 17 18 19 20 21 
22 23 24 25 26 27 28 
29 30 
+0

'|' verbindet stdout (1) des ersten Prozesses mit stdin (0) des zweiten. Nachdem die Ausgabe in eine Datei umgeleitet wurde, gibt es kein stdout mehr, also gibt es nichts zu verschicken. Auch, Katze | cat macht keinen Sinn, es bekommt zwei Eingaben für stdin – knittl

+0

@knittl Also meinst du 'cat

+0

also, gibt es eine andere Möglichkeit, dies zu tun? – Dewsworld

Antwort

5

| (anonyme Rohr) verbindet Stdout (1) des ersten Prozesses mit Stdin (0) des zweiten. Nachdem die Ausgabe in eine Datei umgeleitet wurde, gibt es kein stdout mehr, also gibt es nichts zu verschicken. Auch dann, wenn cat | cat < file nicht wirklich Sinn macht, wird es zwei Eingänge an stdin verbunden (zumindest mit bash, Umleitung kommt später und „gewinnt“: echo uiae | cat <somefile ausgeben wird der Gehalt an somefile)

Wenn Sie Ausgang eines angezeigt werden sollen Befehl und gleichzeitig in die Datei schreiben, verwenden Sie die tee Binärdatei. Es schreibt in eine Datei, schreibt aber trotzdem in stdout

cal April 2012 | tee t | more 
cat t # content of the above `cal` command 
+0

Können Sie einen Befehl nennen, der aus der Datei liest und stdout gibt? (wie ** tee ** schreibt in Datei und stdout) – Dewsworld

+0

Ups! Meine obere Frage ist so albern ...! :) – Dewsworld

+0

Muss "Katze" sein;) - siehe den zweiten Befehl in meiner Antwort ... – knittl

0

dies funktioniert für mich, wenn es keine vorhandene Datei t im aktuellen Verzeichnis mit dem Namen. Ich benutze bash auf Ubuntu Oneiric.

$ cal April 2012 | cat > t | cat < t | more 
April 2012  
Su Mo Tu We Th Fr Sa 
1 2 3 4 5 6 7 
8 9 10 11 12 13 14 
15 16 17 18 19 20 21 
22 23 24 25 26 27 28 
29 30 
$ cal April 2012 | cat > t | cat < t | more 
$ rm t 
$ cal April 2012 | cat > t | cat < t | more 
April 2012  
Su Mo Tu We Th Fr Sa 
1 2 3 4 5 6 7 
8 9 10 11 12 13 14 
15 16 17 18 19 20 21 
22 23 24 25 26 27 28 
29 30 
+0

Es funktioniert nicht für mich Ich bin am 11.10 .. – Dewsworld

+0

Sollte nicht funktionieren (und funktioniert nicht hier - debian squeeze Ich kann später in ubuntu testen – knittl

+0

Wenn es Trick für Sie funktioniert, können Sie erklären, warum es so passiert? – Dewsworld

1

Denn die ersten cat > t all seinen Ausgang an einet Datei namens sendet, für die Pipeline nicht mehr zu verlassen.

Wenn Ihre Absicht in eine Datei zu senden ist und durch more zum Terminal, benutzen Sie einfach:

cal April 2012 | tee t | more 

Dieses | cat < t Konstrukt ist sehr seltsam, und ich bin nicht einmal sicher, ob es funktionieren würde. Es versucht, zwei völlig verschiedene Dinge mit dem Standard-Eingang von cat zu verbinden und sicherlich unnötig.

Verwandte Themen