所以我在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 – 从标准输入构建和执行命令行