2016-10-31 1 views
0

Ich bin ein Neuling für Linux. Ich habe über Katzenbefehl gelernt, als ich das versuchte.Pipelining der Befehle cat und ls

[email protected]:~$ cat file 
Videos/Arrow/Season* 
[email protected]:~$ cat file | ls -l 

Der Befehl zeigt den Inhalt des aktuellen Ordners anstelle des Ordners in der Datei erwähnt .. Aber wenn ich das richtig

[email protected]:~$ cat file 
Videos/Arrow/Season* 
[email protected]:~$ ls -l $(cat file) 

Der Inhalt der erwarteten Ordner angezeigt

tat. Warum kann ich die Pipeline in diesem Fall nicht benutzen?

+0

Sie können Text nicht in 'ls' für die Verwendung als Dateinamen" pipe ". ls akzeptiert keine Eingaben auf diese Weise. Sie müssten Xargs, z. 'Katzendatei | xargs ls -l'. xargs nimmt Daten von stdin und übergibt sie als Befehlszeilenargumente an den angegebenen Befehl ('ls -l'). –

Antwort

0

Im ersten Beispiel übergeben Sie den Ausgang cat file an den Eingang ls -l. Da ls -l keine Eingabe nimmt, tut es nichts in Bezug auf die Ausgabe von cat file. Im zweiten Beispiel verwenden Sie jedoch $(cat file), die die Ausgabe von cat file an die Stelle eines an ls -l übergebenen Arguments legt, und dieses Mal hat ls -l den Text innerhalb von file an der richtigen Stelle, um etwas damit zu tun. Das Problem hier ist der Unterschied zwischen der Standardeingabe eines Programms und den Argumenten eines Programms. Standardeingabe ist, was Sie haben, wenn Sie beispielsweise scanf in C aufrufen; und die Argumente sind, was Sie in der argv Zeiger erhalten als Parameter für die Hauptprozedur erhalten.