shell 的内件命令exec执行命令时,不启用新的shell进程【注: source 和 . 不启用新的shell,在当前shell中执行,设定的局部变量在执行完命令后仍然有效;bash或sh 或shell script执行时,另起一个子shell,其继承父shell的环境变量,其子shelll的变量执行完后不影响父shell,注意三类的区别】exec是用被执行的命令行替换掉当前的shell进程,且exec命令后的其余命令将再也不执行。例如在当前shell中执行 exec ls 表示执行ls这条命令来替换当前的shell 即为执行完后会退出当前shell。为了不这个结果的影响,通常将exec命令放到一个shell脚本中,用主脚本调用这个脚本,调用处能够用bash xx.sh(xx.sh为存放exec命令的脚本)。这样会为xx.sh创建一个子shell去执行,当执行exec后该子脚本进程就被替换成相应的exec的命令shell
其中有一个例外:当exec命令对文件描述符操做的时候,就不会替换shell,而是操做完成后还会继续执行后面的命令bash
查看系统操做符ui
[root@localhost ~]# ll /dev/fd/ total 0 lrwx------. 1 root root 64 Jul 2 18:18 0 -> /dev/pts/1 lrwx------. 1 root root 64 Jul 2 18:18 1 -> /dev/pts/1 lrwx------. 1 root root 64 Jul 2 18:18 2 -> /dev/pts/1 lr-x------. 1 root root 64 Jul 2 18:18 3 -> /proc/54592/fd
exec 3<&0 表示将操做符3也指向标准输入 spa
exec 8<>tmp_in命令行
[root@localhost ~]# echo "ls -li">&8 [root@localhost ~]# echo "free -m">&8 [root@localhost ~]# cat tmp_in df -h ls -li free -m [root@localhost ~]#
应用code
#!/bin/bash rm -rf tmp_in mknod tmp_in p exec 8<>tmp_in telnet 127.0.0.1 23 <&8 & echo xxx >>tmp_in sleep echo -e "35quit">>tmp_in