小括号,圆括号()
相信很少人会在命令行中使用(),大多数都是直接输入执行,就比如:
[root@linus ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg
简单来说,在()中的命令,会由一个进程列表子shell执行,执行完成后将会退出。
[root@linus ~]# (ls)
anaconda-ks.cfg initial-setup-ks.cfg
对于()的另一种应用,可以调用命令的执行结果,这个我们都熟悉,使用反撇号或者是$(),这里的()也是同义,都是通过子shell执行其中的命令,而前面的$符号,则是调用命令的执行结果。
[root@linus ~]# echo (ls)
-bash: 未预期的符号 `ls' 附近有语法错误
[root@linus ~]# echo $(ls)
anaconda-ks.cfg initial-setup-ks.cfg
简单案例
首先,linux在开机时,会默认打开一个shell环境,例如:root
[root@linus ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
通过ps命令,可以查看我们shell的PID号
[root@linus ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1640 1634 0 20:59 pts/0 00:00:00 -bash
root 40767 1640 0 21:30 pts/0 00:00:00 ps -f
如果新开一个子shell,也会有对应的PID号
[root@linus ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1640 1634 0 20:59 pts/0 00:00:00 -bash
root 40786 1640 0 21:32 pts/0 00:00:00 bash #子shell
root 40821 40786 0 21:32 pts/0 00:00:00 ps -f
[root@linus ~]# echo $PPID #父进程
1640
以上的是子shell环境,而使用()所打开的shell是进程子shell。
进程子shell
是否生成了进程子shell,需要借助echo $BASH_SUBSHELL,如果该命令返回0,表示没有子shell。 如下图所示:一组命令放入括号中,产生了一个子shell去执行的。
[root@linus ~]# ls;pwd echo $BASH_SUBSHELL
anaconda-ks.cfg initial-setup-ks.cfg
/root
[root@linus ~]# (ls;pwd;echo $BASH_SUBSHELL)
anaconda-ks.cfg initial-setup-ks.cfg
/root
1
进程子shell是在当前的shell环境下产生的子shell,也就是说,不会打开新的shell环境,不会增加shell进程和PID。
[root@linus ~]# x=1 ; (echo $x)
1
因为()执行完成即退出的特点,常用于一次性操作,例如计算等等。
[root@linus ~]# (a=12 ; b=14 ; c=$[$a * $b] ; echo $c )
168
[root@linus ~]# echo $a
最后,列举一个案例来帮助大家理解,可以猜测或者是动手,来看一看其执行结果是什么。
[root@linus ~]# x=1;echo "pid=$$";(echo "subx=$x"; echo "subpid=$$"; x=2; echo "subx=$x"); echo "x=$x"