微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

shell中的exec命令说明

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

原文地址:https://www.jb51.cc/wenti/3279179.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐