繁体   English   中英

管道打印到Bash的ls?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM