讓我們建立一個測試文件:

讓我們建立一個測試文件:

我已經在這個問題上苦苦掙扎了一段時間,如果有人能為我澄清它,我將非常感激。假設我試圖將這兩個命令連接在一起。readlinkcat

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

相關內容