59

我以为我直到现在才理解 *nix 管道......我有一个名为的可执行文件studio,它指向我的安装的符号链接,我Android Studio假设我可以通过以下方式获得链接到的位置

which studio | ls -l

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

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

那么为什么管道版本不起作用?我对管道有什么不了解的地方?

4

3 回答 3

85

为此,您需要xargs

which studio | xargs ls -l

来自man xargs

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

要全面了解管道的工作原理,您可以阅读关于 BASH 中管道如何工作的简单解释是什么?

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

于 2013-08-13T13:51:57.440 回答
31

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

ls -l "$( which studio )"

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

于 2013-08-13T13:55:08.297 回答
2

由于ls -l不接受任何输入,因此它不会对 的输出做任何事情which studio。这里重要的是理解标准输入和参数之间的区别。标准输入是使用过程读取的特殊文件(例如由 C 中的程序),程序的参数作为和参数scanf传递给主过程。是一个以空字符结尾的 char 数组的数组,并且是该数组的长度。argvargcargvargc

于 2016-10-31T18:17:58.810 回答