让我们创建一个测试文件:

让我们创建一个测试文件:

readlink我已经在这个问题上挣扎了一段时间了,如果有人能帮我澄清一下,我将不胜感激。假设我试图将这两个命令连接在一起。cat

readlink Command output
$ readlink -f SUService.log
/cygdrive/c/SUService.log

现在如果我尝试这样的事情(它会失败)

$ readlink -f SUService.log | cat

虽然像这样的事情会起作用

$ readlink -f SUService.log | xargs cat

我想知道这是为什么?我读过楼主在这里发过一个类似的问题这篇文章试图解释参数和输入之间的区别,但我仍然无法理解可接受的答案。据我所知,它将readlink结果返回到 stdout,即终端屏幕,同时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

看到它打印了 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 从标准输入读取。

回声| xargs 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

相关内容