我在里面写了一个函数,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
命令使用bash
shell 以便我的别名和函数正常工作?
答案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
。