如何让‘at’命令理解bash的别名或函数?

如何让‘at’命令理解bash的别名或函数?

我在里面写了一个函数,bashrc比如 -

function build_image ()
{
 ...
}

该函数将触发源代码的编译。

现在我需要在今天午夜触发这个图像构建/编译过程。所以我使用at命令。

所以我跑起来就像-

-bash-4.4 $at midnight
warning: commands will be executed using /bin/sh
at> build_image
at> <EOT>
job 4 at Thu Feb 11 00:00:00 2021

看起来使用的shellat是sh。如何指示at命令使用bashshell 以便我的别名和函数正常工作?

答案1

从手册页:

at 调用时 SHELL 环境变量的值将确定使用哪个 shell 来执行 at 作业命令。如果调用 at 时未设置 SHELL,则将使用用户的登录 shell。

但是,.bashrc仅当您的 shell 是交互式的时才会获取。在这种情况下at,您需要设置 BASH_ENV 变量或使用不同的机制(例如将函数实现为单独的 shell 脚本)。请参阅启动文件部分在 Bash 手册中。

答案2

at被设计为使用/bin/sh而不是/bin/bash,因此它会在前面添加一个您可以使用 看到的代码序言。如果你想插入东西并使用它,这里有一个简单的函数:at -c {jobnumber}bash

at_with_bash_alias_and_functions(){
  ( 
    echo "exec /bin/bash <<END"
    alias
    typeset -f
    cat
    echo END
  ) | sed 's/\$/\\$/g' | at "$@"
}

显示别名和函数是否存在:

at_with_bash_alias_and_functions now <<< "alias;typeset -f"

限制:内联可能会由于 shell 替换而丢失语法;它的工作原理并不完全一样at。使用exec cat而不是验证您的语法exec bash

相关内容