cat 和 ls 命令的流水线化

Pipelining of cat and ls commands

我是 linux 的新手。当我尝试这个时,我一直在学习 cat 命令。

harish@harish-Lenovo-G50-45:~$ cat file
Videos/Arrow/Season*
harish@harish-Lenovo-G50-45:~$ cat file | ls -l

该命令显示当前文件夹的内容,而不是文件中提到的文件夹。但是当我这样做时

harish@harish-Lenovo-G50-45:~$ cat file
Videos/Arrow/Season*
harish@harish-Lenovo-G50-45:~$ ls -l $(cat file) 

预期文件夹的内容显示正确。为什么我不能在这种情况下使用管道?

在第一个示例中,您将 cat file 的输出传递给 ls -l 的输入。由于 ls -l 不接受任何输入,因此它不会对 cat file 的输出做任何事情。但是,在第二个示例中,您使用的是 $(cat file),它将 cat file 的输出放在传递给 ls -l 的参数的位置,这次 ls -l 的文本位于 file 在正确的地方用它做点什么。这里的问题是注意程序的标准输入和程序的参数之间的区别。例如,标准输入就是您在 C 中调用 scanf 时所拥有的;参数是您在作为参数传递给主过程的 argv 指针中得到的。