source和 .也不会启用新的shell进程,在当前shell中实行,设定的局部变量在实行完命令后仍旧有效。
bash或sh实行时,会另起一个子shell进程,其继续父shell进程的环境变量,其子shell进程的变量实行完后不影响父shell进程。
exec是用被实行的命令行更换掉当前的shell进程,且exec命令后的其他命令将不再实行。

例如在当前shell中实行 exec ls 表示实行ls这条命令来更换当前的shell ,即为实行完后会退出当前shell。
为了避免父shell被退出,一样平常将exec命令放到一个子shell脚本中,在父sehll中调用这个子shell脚本,调用处可以用bash xx.sh(xx.sh为存放exec命令的脚本),这样会为xx.sh建立一个子shell去实行,当实行exec后该子shell进程就被更换成相应的exec的命令。
个中有一个例外:当exec命令对文件描述符操作的时候,就不会更换shell,而是操作完成后还会连续实行后面的命令!
文件描述符
shell中描述符一共有12个
0 代表标准输入
1 代表标准输出
2 缺点输出
其他 3-9 都是空缺描述符
# exec3>&14>&21>>bash.log2>&1
其含义是: 复制标准输出到3 ,缺点输出到 4 ,把 3 4 保存在bash.log 这个文件中。
# ./bash.sh >> bash.log 2>&1
其含义是:将bash.sh脚本实行的标准输出和缺点输出追加重定向到 bash.log
如果exec 跟的是其他命令,则其他命令结束后,本shell也随之停滞
# cat test_exec.sh####################!/bin/bash echo "Hello mysql" exec echo "Hello oracle" echo "Hello sqlserver"
test_exec.sh实行结果
可以看到随着 echo " hello oracle" 这条指令运行完本 全体脚本实行完毕,后面的 echo " hello db2" 没有实行!
$@ 表示所有脚本参数的内容
$# 表示返回所有脚本参数的个数
示例:编写如下shell脚本,保存为test.sh
################!/bin/shecho "number:$#"echo "argume:$@"###############实行脚本:./test.shfirst_arg second_arg
test.sh实行结果
解释:给脚本供应了两个参数,以是$#输出的结果是2,$@代表了参数的内容!
怎么理解shell脚本中 exec "`dirname "$0"`/node""$0" "$@" ?
$0 # 脚本自己的路径
"`dirname "$0"`"/node # 脚本目录下的node程序的路径
$@ # 脚本被实行时的命令行参数
合起来便是:用脚本目录下的node程序来阐明这个脚本本身
exec scala "$0" "$@"是什么意思
这是bash语法。
$0 表示当前脚本的名字
$@ 表示当前脚本实行的所有参数
exec scala "$0" "$@" 表示用scala命令,带参数,实行当前脚本
exec sh "$0 在这个文件里,exec sh $0是什么意思?
#############!/bin/shecho "Hello!"sleep 2exec sh"$0"#############
$0 是位置参数,表示脚本名称
$1 表示脚本的第一个参数,依次类推直到$9
exec用于实行命令、或脚本、或外部可实行程序,会新建一个shell去实行
综上,这里exec sh "$0" 便是实行脚本本身
以是,便是一个循环过程,每隔两秒打印一次 Hello
tesh.sh实行结果
转载:https://www.jianshu.com/p/ca012415cd5f