linux在()使用命令有什么用?

小括号,圆括号()

相信很少人会在命令行中使用(),大多数都是直接输入执行,就比如:

[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"
发布了68 篇原创文章 · 获赞 8 · 访问量 5743

猜你喜欢

转载自blog.csdn.net/qq_42534026/article/details/104426131
今日推荐