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