`exec {logOutFd}>&1 {logErrFd}>&2` 这条Shell命令的作用是什么?
解析NixOS启动脚本中的
exec {logOutFd}>&1 {logErrFd}>&2 这行代码并非无意义的空exec命令,而是Bash特有的文件描述符动态分配与复制语法,具体功能拆解如下:
{logOutFd}>&1:让Bash自动分配一个未被占用的文件描述符,将其编号存入变量logOutFd,同时把这个新描述符设置为标准输出(文件描述符1)的副本——也就是说,这个新描述符会指向和当前标准输出相同的目标(比如启动时的控制台)。{logErrFd}>&2:逻辑和上面一致,自动分配另一个未被占用的文件描述符并赋值给logErrFd,同时将其设置为标准错误(文件描述符2)的副本。
实际作用
在启动流程中,后续脚本很可能会将标准输出/错误重定向到日志文件(比如exec >/var/log/boot.log 2>&1),此时原来的控制台输出通道会被覆盖。而通过logOutFd和logErrFd这两个保存下来的描述符,脚本可以随时将指定内容输出到原本的控制台(比如关键的启动成功/失败提示),而不是写入日志文件,保证用户能及时看到重要信息。
比如后续可以这样使用:
# 临时输出到原控制台 echo "系统启动完成,请登录" >&$logOutFd
内容的提问来源于stack exchange,提问作者l0b0
相关产品推荐
相关产品推荐

