管道打印到Bash的ls?

时间:2017-02-15 06:24:12

标签: linux bash shell

所以我正在学习bash中的管道,我发现了这个简洁的描述:

  

Unix管道连接STDOUT(标准输出)文件描述符   第二个进程到STDIN(标准输入)。什么   那么当第一个进程写入其STDOUT时就会发生这种情况   输出可以通过第二个过程立即读取(来自STDIN)。

Source

鉴于这种理解,让我们将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。为什么会这样?我如何使用管道ls父目录?我误解了管道吗?

2 个答案:

答案 0 :(得分:3)

许多程序不会从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

答案 1 :(得分:2)

问题是ls无法按照您的意图从stdin读取。您需要使用从stdin读取的工具,例如xargs,并将读取输入提供给ls

printf "someSampleFolderOrFile" | xargs ls 

xargs man页面,

  

xargs - 从标准输入

构建和执行命令行