转载自 关于 Linux shell 你必须知道的

这个问题一定是最容易让人迷惑的,具体来说,就是搞不清什么时候用管道符 | 和文件重定向><,什么时候用变量 $

比如说,我现在有个自动连接宽带的 shell 脚本 connect.sh,存在我的家目录:

1
2
$> where connect.sh
/home/fdl/bin/connect.sh

如果我想删除这个脚本,而且想少敲几次键盘,应该怎么操作呢?我曾经这样尝试过:

1
$> where connect.sh | rm

实际上,这样操作是错误的,正确的做法应该是这样的:

1
$> rm $(where connect.sh)

前者试图将 where 的结果连接到 rm 的标准输入,后者试图将结果作为命令行参数传入。

标准输入就是编程语言中诸如 scanf 或者 readline 这种命令;而参数是指程序的 main 函数传入的 args 字符数组。

道符和重定向符是将数据作为程序的标准输入,而 $(cmd) 是读取 cmd 命令输出的数据作为参数。

用刚才的例子说,rm 命令源代码中肯定不接受标准输入,而是接收命令行参数,删除相应的文件。作为对比,cat 命令是既接受标准输入,又接受命令行参数:

1
2
3
4
5
6
7
8
$> cat filename
...file text...

$> cat < filename
...file text...

$> echo 'hello world' | cat
hello world

如果命令能够让终端阻塞,说明该命令接收标准输入,反之就是不接受,比如你只运行 cat 命令不加任何参数,终端就会阻塞,等待你输入字符串并回显相同的字符串。