Unixpipe入ls

我以为我理解* nixpipe道,直到现在…我有一个可执行文件称为studio ,符号链接到我安装的Android Studio ,我假设我可以得到链接到的位置

 which studio | ls -l 

但是这不起作用。 它给我的相当于在当前目录下运行ls -l

如果我运行which studio ,我会得到/home/me/bin/studio 。 如果我运行ls -l /home/me/bin/studio我会得到预期的输出,显示符号链接的位置。

那么为什么pipe道版本不工作? 我还没有关于pipe道的什么?

Solutions Collecting From Web of "Unixpipe入ls"

要做到这一点,你需要xargs

 which studio | xargs ls -l 

man xargs

xargs – 从标准输入构建和执行命令行

要充分了解管道的工作原理,可以阅读BASH中管道工作原理的简单解释。 :

Unix管道将第一个进程的STDOUT(标准输出)文件描述符连接到第二个进程的STDIN(标准输入)。 那么会发生什么呢,当第一个进程写入到STDOUT时,第二个进程可以立即读取(从STDIN)输出。

ls不会从标准输入读取它的参数,而是从命令行读取它的参数。 要在命令行中获取目录,您必须使用命令替换:

 ls -l "$( which studio )" 

(如果路径可能包含空格,则需要双引号。)

因为ls -l没有任何输入,所以对于which studio的输出没有任何作用。 这里重要的是理解标准输入和参数之间的区别。 标准输入是一个特殊的文件,使用scanf过程(例如用C语言scanf程序)读取,程序的参数作为argvargc参数传递给主程序。 argv是char的一个以null结尾的数组,而argc是该数组的长度。