
我已經在這個問題上苦苦掙扎了一段時間,如果有人能為我澄清它,我將非常感激。假設我試圖將這兩個命令連接在一起。readlink
和cat
readlink Command output
$ readlink -f SUService.log
/cygdrive/c/SUService.log
現在如果我嘗試這樣的事情(它失敗了)
$ readlink -f SUService.log | cat
雖然這樣的事情會起作用
$ readlink -f SUService.log | xargs cat
我想知道這是為什麼?我讀過了這在這裡發帖,其中OP有類似的問題並且這帖子試圖解釋參數和輸入之間的差異,但是我仍然無法理解已接受的答案。據我了解,readlink
將結果返回標準輸出,即終端螢幕,同時cat
需要輸入作為參數。這反過來又促使我問我如何知道命令的輸出(例如locate或readlink)是否可以作為下一個命令的參數?我做了更多閱讀,結果我想知道什麼時候應該使用 xarg 命令?
答案1
你的例子相當混亂。
您通常不會只向 cat 發送任何字元。
您通常將文件發送給 cat。
然而,當您向 cat 發送一些字元時,它會列印這些字元。
$ echo abc12123 | cat
abc12123
通常你將檔案名稱傳送給 cat
$ cat abc12123
cat: abc12123: No such file or directory
因此請注意,cat 本身對透過管道傳遞給它的有趣字元的處理方式與將它們作為參數傳遞的方式不同。
$ cat b.b
textofb.b
$ echo b.b | cat
b.b
$ cat b.b
textofb.b
我將使用一個比你的更簡單的例子
$ echo b.b | xargs cat
textofb.b
see 它會列印 bb 的內容 asdfasdfs | xargs cat
,因為 會將 asdfasdfs 的輸出作為參數傳送給 cat。
所以
echo b.b | xargs cat
=
cat b.b
而 echo b.b | cat
與 不一樣cat b.b
答案2
以下命令的作用是不是失敗。它只是做了一些你意想不到的事情:
readlink -f SUService.log | cat
當cat
給定 stdin 時,它會將其複製到 stdout。它不會在其中查找文件名。
或者,這將從指定檔案中讀取:
cat "$(readlink -f SUService.log)"
xargs
也會將名稱放在cat
命令列上,產生相同的結果:
readlink -f SUService.log | xargs cat
答案3
請參閱 cat 和 xargs 的線上幫助頁,了解它們的作用。
man cat
cat - concatenate files and print on the standard output
和:
man xargs
xargs - build and execute command lines from standard input
這是一個小演示
讓我們建立一個測試文件:
echo "a" > test
echo "b" >> test
echo "c" >> test
貓
cat test
讀取文件並給出:
a
b
c
迴聲|貓
echo test | cat
根據man cat
,這與以下內容相同:
echo test | cat -
它透過管道test
輸入 cat 的標準輸入,並告訴 cat 從標準輸入讀取。
迴聲|貓
echo test | xargs cat
產生並執行以下命令:
cat test
我們已經展示了它的輸出。
如果我們跑
<test xargs -n1 cat
Xargs 在輸入中看到這一點:
a
b
c
它會產生以下命令:
cat a
cat b
cat c
這應該會導致三個錯誤,因為這些文件不存在。
為什麼-n1
?
根據man xargs
,-n1
告訴 xargs 在它產生的每個命令中使用一個參數(從 stdin 讀取)。
如果我們使用-n2
相反的方式,我們會產生以下命令,每個命令最多使用兩個參數:
cat a b
cat c
如果我們使用-n3
或更高,或者乾脆省略-n
:
< test xargs cat
我們得到:
cat a b c