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