我以为我理解* nix管道直到现在......我有一个名为studio
的可执行文件符号链接到我的Android Studio
安装程序,我假设我可以通过< / p>
which studio | ls -l
但这不起作用。它给我的东西等同于在当前目录中运行ls -l
。
如果我运行which studio
,我会获得/home/me/bin/studio
。如果我运行ls -l /home/me/bin/studio
,我会得到预期的输出,显示符号链接位置。
那么为什么管道版本不起作用?什么没有我对管道的了解?
答案 0 :(得分:48)
要做到这一点,您需要xargs
:
which studio | xargs ls -l
来自man xargs
:
xargs - 从标准输入
构建和执行命令行
要完全了解管道的工作原理,您可以阅读What is a simple explanation for how pipes work in BASH?:
Unix管道连接STDOUT(标准输出)文件描述符 第二个进程到STDIN(标准输入)。什么 那么当第一个进程写入其STDOUT时就会发生这种情况 输出可以通过第二个过程立即读取(来自STDIN)。
答案 1 :(得分:20)
ls
不从标准输入读取其参数,而是从命令行读取。要在命令行中获取目录,必须使用命令替换:
ls -l "$( which studio )"
(如果路径可能包含空格,则需要双引号。)
答案 2 :(得分:0)
由于ls -l
不接受任何输入,因此它不会对which studio
的输出执行任何操作。这里重要的是理解标准输入和参数之间的区别。标准输入是一个特殊文件,使用scanf
过程(例如C中的程序)读取,程序的参数作为argv
和{{传递给主过程。 1}}参数。 argc
是一个由null终止的char数组的数组,argv
是该数组的长度。