今天群里在讨论这么个问题:
file和 : > file一样嘛?
file会产生新进程嘛?还是在某些平台等同于: > file?
手头上只有bash shell,以下内容限于linux& bash,其他平台不一定相同:
这种问题很纠结,看来了解shell的命令解析和执行永远是关健
在info bash里3.1.1有关于shell命令解析步骤描述指出:shell扩展之后紧接着是重定向,接着才是命令执行,
重定向不会创建进程,命令执行不一定创建进程,根据情况(关于子进程的创建前边有文章有提及)
说回问题
首先是">file",这是个不完整,但bash又接受的命令行,
说不完整,是因为这条命令没有用于执行的命令(command name)
但bash充许这种情况,见info bash:"3.7.1 Simple Command Expansion"一节
一般的shell命令在解析完后(包括标号
因为在命令解析时的重定向完后,shell发现没有命令符号了,这个命令就结束了,命令返回0
接着是": >file",这个是个完整的命令行
在命令解析步骤执行到重定向时,跟">file"是一样的
但是接下来的命令行执行,这行命令行的的执行体是:":",这个是个builtin命令
builtin的直接执行在当前shell进程下执行的
:buitin命令的功能很简单,即:在返回0
这二条命令,功能上是一样的
实现过程基本一样,第二条多了个builtin调用
这边可以做一种小动作让这二条命令的区别更加明显化:
将:定义成一个函数
[root@rac0 tmp]# :(){ echo hehe >&2; }
[root@rac0 tmp]# : >11121
hehe
[root@rac0 tmp]#
函数的直接用,也是不创建进程的