exec命令(exec命令打开文件的逻辑)
什么是cisco的EXEC 命令?
EXEC不是cisco的, 是linux的环境高级。
exec函数族,顾名思义,就是一簇函数,他把当前进程映像替换成新的程序文件,而且该程序通常main函数开始执行!用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。
exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。有六种不同的exec函数可供使用,它们常常被统称为exec函数。这些exec函数都是UNIX进程控制原语。用fork可以创建新进程,用exec可以执行新的程序。exit函数和两个wait函数处理终止和等待终止。这些是我们需要的基本的进程控制原语。

shell脚本中的 exec 命令
??exec执行命令时,不会启用新的shell进程。
??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 都是空白描述符
其含义是: 复制标准输出到3 ,错误输出到 4 ,把 3 4 保存在bash.log 这个文件中。
其含义是:将bash.sh脚本执行的标准输出和错误输出追加重定向到 bash.log
如果exec 跟的是其他命令,则其他命令结束后,本shell也随之停止
可以看到随着 echo " hello oracle" 这条指令运行完本 整个脚本执行完毕,后面的 echo " hello db2" 没有执行!
二、Linux shell 脚本中, $@ 和 $@ 分别是什么意思?
$@ 表示所有脚本参数的内容
$# 表示返回所有脚本参数的个数
示例:编写如下shell脚本,保存为test.sh
说明:给脚本提供了两个参数,所以 @代表了参数的内容!
怎么理解shell脚本中 exec "`dirname "$0"`/node""$0" "$@" ?
$0 ?????????? #脚本自己的路径
"`dirname "$0"`"/node ???#脚本目录下的node程序的路径
$@ ???????????#脚本被执行时的命令行参数
合起来就是:用脚本目录下的node程序来解释这个脚本本身
exec scala "$0" "$@" 是什么意思
这是bash语法。
$0 ?????????#表示当前脚本的名字
$@ ?????????#表示当前脚本执行的所有参数
exec scala "$0" "$@" ??#表示用scala命令,带参数,执行当前脚本
$0 是位置参数,表示脚本名称
$1 表示脚本的第一个参数,依次类推直到 $9
exec用于执行命令、或脚本、或外部可执行程序,会新建一个shell去执行
综上,这里exec sh "$0" 就是执行脚本本身
所以,就是一个循环过程,每隔两秒打印一次 Hello
Linux 命令:exec
命令简介
exec 命令用于调用并执行指定的命令。
exec 命令通常用在 Shell 脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。
-c #在空环境中执行指定的命令
-l #在传递给command的第零个arg的开头放置一个破折号
-a #Shell将name作为第零个参数传递给command
输出指定信息
其它总结
【exec】shell脚本中的 exec 命令
exec 是 bash 的内置命令
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的命令。
其中有一个例外:当exec命令对文件描述符操作的时候,就不会替换shell,而是操作完成后还会继续执行后面的命令!
在shell脚本中使用exec命令,根据操作的对象不同会有不同的行为
文件描述符
shell中描述符一共有12个
0 ?代表标准输入
1 ?代表标准输出
2 ?错误输出
其他 3-9 都是空白描述符
# ?exec31?42?1?bash.log?21
其含义是: 复制标准输出到3 ,错误输出到 4 ,把 3 4 保存在bash.log 这个文件中。
# ?./bash.sh ? bash.log ? 21
其含义是:将bash.sh脚本执行的标准输出和错误输出追加重定向到 bash.log
如果exec 跟的是其他命令,则其他命令结束后,本shell也随之停止
# ?cat test_exec.sh
###################
#!/bin/bash ?
#?
echo "Hello mysql" ?
exec echo "Hello oracle" ?
echo "Hello sqlserver"
####################
可以看到随着 echo " hello oracle" ?这条指令运行完本 整个脚本执行完毕,后面的 echo " hello db2" 没有执行!
Linux shell 脚本中, $@ 和$# 分别是什么意思?
$@ ?表示所有脚本参数的内容
$# 表示返回所有脚本参数的个数
示例:编写如下shell脚本,保存为test.sh
###############
#!/bin/sh
echo "number:$#"
echo "argume:$@"
###############
执行脚本:
./test.sh?first_arg ?second_arg
说明:给脚本提供了两个参数,所以$#输出的结果是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/sh
echo ?"Hello!"
sleep 2
execsh?"$0"
#############
$0 ? 是位置参数,表示脚本名称
$1 ? 表示脚本的第一个参数,依次类推直到$9
exec用于执行命令、或脚本、或外部可执行程序,会新建一个shell去执行
综上,这里exec sh ?"$0" ?就是执行脚本本身
所以,就是一个循环过程,每隔两秒打印一次 Hello
#############
#!/bin/sh
echo ?"Hello!"
sleep 2
exec ??"$0"
#############
exec函数执行命令后可以获取全部数据吗
exec函数执行命令后可以获取全部数据。根据查询相关资料显示,exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容获取全部数据。exec函数系列可以根据指定的文件名或目录名查找可执行文件,以代替原始调用过程中的数据段、代码段和堆叠栈段。
数据库的“EXEC”是什么意思?应该怎么用?
sqlserver中\x0d\x0aEXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理\x0d\x0a\x0d\x0a1.使用系统存储过程sp_executesql运行Unicode命令字符串\x0d\x0a语法如下:\x0d\x0asp_executesql [@stmt=] stmt\x0d\x0a[\x0d\x0a {,[@params=] N'@parameter_name data_type [,...n]'}\x0d\x0a {,[@param1=] 'value' [,...n]}\x0d\x0a]\x0d\x0a说明:必须先将各个包含所要运行的命令语句的Unicode字符串相加在一起,再交给系统存储过程sp_executesql来运行,而不能在sp_executesql的语句中来相加各个命令字符串。\x0d\x0a举例如下:\x0d\x0adeclare @DBName nvarchar(20),\x0d\x0a @Tbname nvarchar(20),\x0d\x0a @SQLString nvarchar(500)\x0d\x0aset @DBName=N'Northwind'\x0d\x0aset @Tbname=N'Customers'\x0d\x0aset @SQLString=N'USE '+@DBName+char(13) --char(13)换行\x0d\x0aSET @SQLString=@SQLString+N'select * from '+@Tbname\x0d\x0a--必须先将命令字符串组合完毕后再交给sp_executesql来运行\x0d\x0aexec sp_executesql @SQLString\x0d\x0a\x0d\x0a2.使用EXECUTE命令运行命令字符串\x0d\x0a要使用EXECUTE命令来运行一个命令字符串的语法如下:\x0d\x0aEXEC[UTE] ({@string_variable|[N] 'stql_string'} [+...n])\x0d\x0a从语法看出,可以先将包含所要运行的命令的字符串赋给一个局部变量@string_variable,再使用EXECUTE命令来运行,或是直接使用EXECUTE命令去运行一个包含所要运行的命令语句的字符串。此外,您也可以将多个包含所要运行的命令语句的字符串相加在一起,再交给EXECUTE命令来一次运行。\x0d\x0a\x0d\x0a例:\x0d\x0adeclare @sql nvarchar(4000) \x0d\x0a set @sql='select * from [表] where email=''test@163.com''' \x0d\x0a exec (@sql)