shell中的exec命令说明
经常看到一些shell脚本中用到exec,且每次都要花时间去理解,索性将典型的应用列出来,方便理解首先讲下exec,这个命令在linux里面也有,主要是创建进程且exec之后的代码将不会执行,只会执行exec执行的进程,例如exec ls,则只会执行ls命令,而exec后面的代码不再执行但是shell里面一般不是这么用的,很多时候都是用来重定向文件描述符,这种情况下不会重新创建进行,而是会继续执行
经常看到一些shell脚本中用到exec,且每次都要花时间去理解,索性将典型的应用列出来,方便理解
首先讲下exec,这个命令在linux里面也有,主要是创建进程且exec之后的代码将不会执行,只会执行exec执行的进程,例如exec ls,则只会执行ls命令,而exec后面的代码不再执行
但是shell里面一般不是这么用的,很多时候都是用来重定向文件描述符,这种情况下不会重新创建进行,而是会继续执行后面的代码
经典用法:
CT_LogEnable() {
local clean=no
local arg
for arg in "$@"; do eval "$arg"; done
exec 6>&1 7>&2 8<&0 --1
CT_BUILD_LOG="${CT_TOP_DIR}/build.log"
CT_LOG_ENABLED=y
if [ "$clean" = "yes" ]; then
rm -f "${CT_BUILD_LOG}"
fi
exec >>"${CT_BUILD_LOG}" --2
}
我们以上面一段代码为例,进行说明
其中第1个exec主要是将标准输入(0)复制到文件描述符8,标准输出(1)复制到文件描述符7,标准错误(2)复制到文件描述符6,这样后面只要执行echo "test" > &7(注意>和&之间一定不能有空格),就是输出到终端。执行完成后会继续往下执行(上文已经提过)
第2个exec主要是将标准输出重定向到一个文件中(追加的形式),也就是将exec后面的所有echo的信息直接输出到文件里面
整理了常见的重定向命令如下:
exec > filename 将标准输出重定向到一个新文件中
exec >> filename 将标准输出重定向到一个文件中(追加)
exec 1 > fielname 将标准输出重定向到一个文件中
exec > filename 2>&1 将标准输出和标准错误一起重定向到一个文件中
exec 2 > filename 将标准错误重定向到一个文件中
exec 2 >> filename 将标准输出重定向到一个文件中(追加)
exec >> filename 2>&1 将标准输出和标准错误一起重定向到一个文件中(追加)
exec < filename >filename2 将command命令以filename文件作为标准输入,以filename2文件作为标准输出
exec < filename 将command命令以filename文件作为标准输入
exec << delimiter 将从标准输入中读入,直至遇到delimiter分界符
exec <&m 将文件描述符m作为标准输入
exec >&m 将标准输出重定向到文件描述符m中
exec &m<&- 关闭文件描述符m
更多推荐
所有评论(0)