所以我正在学习bash中的管道,我发现了这个简洁的描述:
Unix管道连接STDOUT(标准输出)文件描述符 第二个进程到STDIN(标准输入)。什么 那么当第一个进程写入其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
。为什么会这样?我如何使用管道ls
父目录?我误解了管道吗?
答案 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 - 从标准输入
构建和执行命令行