LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1370|回复: 7

高手帮忙解释下反引号和管道的区别!!

[复制链接]
发表于 2008-2-1 17:21:24 | 显示全部楼层 |阅读模式
如题,最好能举例说明,谢谢!比如
ls | ls 和 ls ·ls·两个命令的区别,为什么两个命令的输出会不一样
发表于 2008-2-2 11:20:04 | 显示全部楼层
这怎么会混淆呢?所有UNIX shell教程都会提到。
反引号:用反引号内命令的输出代替整个反引号。其实你可以进行人肉扩展 :-p
管道:把前命令的标准输出送到后命令的标准输入。
ls `ls` 为什么和 ls | ls 不一样?因为前者相当于 ls * ;而后者是把 ls 的标准输出送到 ls 作为标准输入。ls 根本不管这标准输入,它不是一个filter,所以它的所用就是列出当前目录的内容, ls | ls 相当于 lsls | ls -a 相当于 ls -a
回复 支持 反对

使用道具 举报

发表于 2008-2-2 12:45:32 | 显示全部楼层
cmd1 | cmd2 相当于先执行cmd1, 结果送给cmd2
cmd1 `cmd2` 相当于先执行cmd2,结果送给cmd1
回复 支持 反对

使用道具 举报

发表于 2008-2-3 09:01:16 | 显示全部楼层
补充 biinn 兄的说法.

| 是把结果通过标准输入送给下一个程序, 而 `` 是把结果通过参数的形式传给下一个程序, 至于这 "下一个程序" 支持哪种形式的输入就取决于具体的程序了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-5 12:13:11 | 显示全部楼层
谢谢各位的答疑解惑,另为请教下,像grep,wc,cat这样的命令是不是可以接收通过管道的输入,而ls这样的命令不接收。
回复 支持 反对

使用道具 举报

发表于 2008-2-9 23:24:28 | 显示全部楼层
我也有一个疑问,比如当前目录下有个3个文件夹,a,b,c。
执行ls|ls
那么,第一个ls产生的输出就包括a,b,c,然后,送到下一个ls,那么下一个ls应该分别显示三个目录下面的内容。
但是现实中貌似不是如此。我上面的叙述有什么问题吗?
回复 支持 反对

使用道具 举报

发表于 2008-2-10 09:28:08 | 显示全部楼层
ls 不支持从管道读入文件名
回复 支持 反对

使用道具 举报

发表于 2008-2-10 14:07:14 | 显示全部楼层
UNIX filter的普遍实现导致的混淆,它们多是如果在命令行指定文件名作为参数就从该文件读入,否则从标准输入读入,久而久之就令各位产生了 命令行参数=标准输入 的错觉。

自己用一些语言实现一个简单的UNIX filter,有这样的特性:
  1. $ filter file
  2. # 和下效果一样...
  3. $ filter < file
复制代码
我想就能很好的明白了吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表