在Bash中pipe道printf到ls?

所以我在bash学习pipe道,我发现这个简洁的描述:

Unixpipe道将第一个进程的STDOUT(标准输出)文件描述符连接到第二个进程的STDIN(标准input)。 那么会发生什么呢,当第一个进程写入到STDOUT时,第二个进程可以立即读取(从STDIN)输出。

资源

根据这个理解,让我们将printf的STDOUT连接到ls的STDIN。 为了简单起见,打印父目录( printf .. )。

 ~/Desktop/pipes$ mkdir sub ~/Desktop/pipes$ ls sub ~/Desktop/pipes$ cd sub (no files) ~/Desktop/pipes/sub$ printf .. | ls (no files) ~/Desktop/pipes/sub$ 

我想要做的是: ls ..但是看来我得到的只是ls 。 这是为什么? 我怎样才能使用pipe道的父目录? 我误解了pipe道?

许多程序不会从stdin读取,不仅仅是ls 。 程序也可能不写入stdout

这是一个可以澄清事情的小实验。 执行这些步骤:

 cat > file1 This is file1 ^D 

^ D是您按<CTRL>+D ,这是默认的文件结束。 所以,我们首先调用cat程序并将其stdout重定向到file1 。 如果你不提供输入文件名,那么它从stdin输入读取,所以我们输入“This is file1”。

现在做类似的:

 cat > file2 This is file2 ^D 

现在如果你:

 cat < file1 

你得到:

 This is file1 

如果你:

 cat file1 | cat file2 

要么:

 cat file2 < file1 

为什么? 因为如果你提供一个输入文件名,那么cat程序不会读取stdin ,就像ls一样。

现在,如何:

 cat - file1 < file2 

按照惯例, -意味着一个标准的流, stdin在读或写stdout时候。

问题是ls不能从stdin读取,因为你打算这样做。 你需要使用一个从stdin读取数据的工具,像xargs一样读取输入到ls

 printf "someSampleFolderOrFile" | xargs ls 

xargs man页,

xargs – 从标准输入构建和执行命令行