2016-10-31 62 views
0

我是linux的新手。當我嘗試這個時,我一直在學習貓命令。流水線的貓和ls命令

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

該命令將顯示當前文件夾的文件中提到的文件夾,而不是內容。但是,當我預期的文件夾中顯示的內容正確地做這個

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

。爲什麼不能在這種情況下使用管道?

+0

您不能將文本「管道」到'ls'作爲文件名。 ls不接受這種方式。你必須使用xargs,例如'cat file | xargs ls -l'。 xargs從stdin獲取數據並將其作爲命令行參數傳遞給指定的命令('ls -l')。 –

回答

0

在第一個示例中,您將cat file的輸出傳遞給ls -l的輸入。由於ls -l沒有任何輸入,因此不會對cat file的輸出做任何事情。然而,在第二個示例中,您使用的是$(cat file),它將cat file的輸出放置在傳遞給ls -l的參數的位置,而此時ls -lfile中的文本位於正確的位置,用於執行某些操作。這裏的問題是注意到一個程序的標準輸入和一個程序的參數之間的區別。例如,當您在C中調用scanf時,標準輸入是您所擁有的;並且參數是您在argv指針中作爲參數傳遞給主過程的參數。