2017-02-15 43 views
3

所以我了解在bash管道和我发现这个简练的描述:管道打印到ls在Bash?

UNIX管道连接STDOUT(标准输出)的 第一个进程文件描述符的所述STDIN(标准输入)第二。 然后发生的是,当第一个进程写入其STDOUT时,第二个进程可以立即读取(从STDIN) 输出。

Source

鉴于这种认识,让我们连接的printf标准输出到ls标准输入。为了简单起见,打印父目录(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

'ls'不从标准输入读取。所以,'ls ..'是在这里得到你想要的东西的方法。 “男人是你的朋友”。 – codeforester

+0

那么这仅仅是'ls'的一个属性?我对管道的理解是否正确? 'ls ..'没有采用STDIN的'..'参数吗? –

+0

你需要'ls'使用'xargs' @KennethWorden – Inian

回答

2

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

2

问题是ls没有按照您的意愿从stdin中读取。你需要使用一个工具,从stdinxargs读取和饲料读出输入到ls

printf "someSampleFolderOrFile" | xargs ls 

xargs man页,

xargs的 - 建立和从标准输入执行命令行

+0

我的问题是关于管道是如何工作的,但是谢谢你的回答。 –