经常看到一些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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐