[英]Pipe printf to ls in Bash?
所以我正在学习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
使用管道的父目录? 我误解管道吗?
许多程序不读取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 - 从标准输入构建和执行命令行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.