2017-02-15 56 views
3

所以我瞭解在bash管道和我發現這個簡練的描述:管道打印到ls在Bash?

UNIX管道連接STDOUT(標準輸出)的 第一個進程文件描述符的所述STDIN(標準輸入)第二。 然後發生的是,當第一個進程寫入其STDOUT時,第二個進程可以立即讀取(從STDIN) 輸出。

Source

鑑於這種認識,讓我們連接的printf標準輸出到ls標準輸入。爲了簡單起見,打印父目錄(printf ..)。

~/Desktop/pipes$ mkdir sub 
~/Desktop/pipes$ ls 
sub 
~/Desktop/pipes$ cd sub 
(no files) 
~/Desktop/pipes/sub$ printf .. | ls 
(no files) 
~/Desktop/pipes/sub$ 

我想要做的:ls ..但似乎所有我得到的是ls。這是爲什麼?我怎麼能ls父目錄使用管道?我誤解管道嗎?

+2

'ls'不從標準輸入讀取。所以,'ls ..'是在這裏得到你想要的東西的方法。 「男人是你的朋友」。 – codeforester

+0

那麼這僅僅是'ls'的一個屬性?我對管道的理解是否正確? 'ls ..'沒有采用STDIN的'..'參數嗎? –

+0

你需要'ls'使用'xargs' @KennethWorden – Inian

回答

2

許多程序不從stdin讀取,而不僅僅是ls。程序也可能不寫入stdout

這是一個可能會澄清事情的小實驗。執行這些步驟:

cat > file1 
This is file1 
^D 

的^ d是在按<CTRL>+D,這是默認的檔案結尾。所以,我們首先調用cat程序並將其stdout重定向到file1。如果你沒有提供輸入文件名,那麼它從stdin中讀取,所以我們輸入「This is file1」。

現在做類似:

cat > file2 
This is file2 
^D 

現在,如果你:

cat < file1 

你得到:

This is file1 

,如果你:

cat file1 | cat file2 

或:

cat file2 < file1 

爲什麼?因爲如果您提供輸入文件名,則cat程序不會讀取stdin,就像ls一樣。

現在,如何:

cat - file1 < file2 

按照慣例,-意味着標準流,stdin讀取時或寫入時stdout

2

問題是ls沒有按照您的意願從stdin中讀取。你需要使用一個工具,從stdinxargs讀取和飼料讀出輸入到ls

printf "someSampleFolderOrFile" | xargs ls 

xargs man頁,

xargs的 - 建立和從標準輸入執行命令行

+0

我的問題是關於管道是如何工作的,但是謝謝你的回答。 –