我的工作我的方式,通過對殼牌(bash)的腳本底漆和有以下疑問:Linux命令:爲什麼重定向操作符 - |即管道在這裏失效?
爲什麼沒有下面的命令打印
cp's
目錄的內容:which cp | ls -l
不定義管道是指我們將一個命令的輸出傳遞給另一個命令,即重定向輸出?
有人可以幫我嗎?我是新手..
我的工作我的方式,通過對殼牌(bash)的腳本底漆和有以下疑問:Linux命令:爲什麼重定向操作符 - |即管道在這裏失效?
爲什麼沒有下面的命令打印
cp's
目錄的內容:which cp | ls -l
不定義管道是指我們將一個命令的輸出傳遞給另一個命令,即重定向輸出?
有人可以幫我嗎?我是新手..
which
的輸出被輸送到標準輸入ls
。但是,ls
不需要任何標準輸入。你想要它(我認爲)作爲參數傳遞。有一對夫婦的這樣做的方法:
which cp | xargs ls -l
或
ls -l `which cp`
或
ls -l $(which cp)
在第一個例子中,xargs
命令將前一個命令的標準輸出和使每行都成爲其名稱緊跟在xargs
之後的命令的參數。所以,例如
find/| xargs ls -l
將在文件系統中的每個文件做一個ls -l
(也有一些問題,這與獨有的命名文件,但已經超出了這個答案的範圍)。
其餘兩個是大致相同的,並使用shell來完成此操作,將which
的輸出擴展到cp
的命令行。
這將是,
$ ls -l $(which cp)
-rwxr-xr-x 1 root root 130304 Mar 24 2014 /bin/cp
OR
$ which cp | xargs ls -l
-rwxr-xr-x 1 root root 130304 Mar 24 2014 /bin/cp
要通過一個命令的輸出作爲另一個命令的參數,你需要使用xargs
與沿管道符號。
man xargs
從
xargs的 - 建立和執行從標準input.xargs命令行讀取來自標準輸入項目 ,由坯件(其可以被保護 與雙或單引號或反斜槓)分隔或換行符,並執行 命令(默認爲/ bin/echo)一次或多次,其中任何初始-參數後跟從標準輸入讀取的項目。 上的空白行將被忽略。
謝謝@AvinashRaj :) – pranav
嗨,@abligh,非常感謝你;我如何才能知道ls不會從STDIN中獲取任何東西? – pranav
一個答案:閱讀手冊頁。更好的回答:當你輸入'ls -l/path/to/file'並按下回車鍵時,命令是否等待你通過鍵盤輸入更多的數據?不,它不。像'tr a z'這樣的東西會的。 – abligh
謝謝@abligh,那是:) – pranav