如何在crontab中使用别名?


16

我有一些.profile要从我的命令中调用的命令crontab

例如,如果我有,

alias notify-me="~/bin/notify.pl -u user1"
alias notify-team="~/bin/notify.pl -u user1 user2 user3 user4 ...."

我只想调用别名

0 11 * * * notify-team

因此,如果我的列表.profile已更新,则也不必更新crontab。但是,我似乎无法在中使用别名crontab。有没有解决的办法?

我尝试了这里的建议来设置环境(例如/ bin / bash -lc和script-wrapper脚本)。似乎适用于脚本,但不适用于别名。

有任何想法吗?


谢谢,所有有用的信息。在这里结合可能的解决方案,包括我自己的解决方案。最终,我将artifex的原始想法修改为对我的情况更有用的东西。克里斯提供了必要的信息,可以使用单独的脚本进行操作。
基思·本特鲁普

Answers:


10

从有关别名的手册页中:

请注意,默认情况下,别名在非交互式Shell中不会展开,
可以通过设置'expand_aliases'启用它
使用shopt的shell选项。

因此,请尝试shopt -s expand_aliases在采购脚本的开头使用。这应该让您使用华纳的建议。


默认情况下,这在CentOS5上对我来说是启用的。很酷的笔记。
华纳2010年

不过,可能不在脚本中。尝试创建一个输出的测试脚本shopt expand_aliases。我敢打赌它已经关闭了。它在我的RHEL 5.3框中。
Christopher Karel 2010年

你击中了要害。+1
Warner

+1 Thx指出这一点。它为我提供了解决方案的大部分方法,但最终仍然不得不创建另一个文件。我希望没有那个。
基思·本特鲁普

Keith,我遇到了同样的问题,但是eval 'foo'在crontab中做到了。
Artem Russakovskii

6

bash -c与“源”应该工作:

0 11 * * * bash -c "source .profile && notify-team"

这也可能起作用。该期间表示“来源”

0 11 * * * . .profile && notify-team

3

正如克里斯所指出的,非交互式外壳的默认外壳选项是不扩展别名。这是我发现可以使用的解决方案。

编写脚本,启用shell选项,并提供别名。请特别注意它.bashrc是在执行时获取的,这就是为什么在启用expand_aliases之后必须再次获取的原因。

对于最初不正确的建议,我深表歉意。这比我最初预期的要模糊。

脚本:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team

谢谢,但我已经尝试过了。您可以确认它可以在您的系统上正常工作吗?我也尝试过/ bin / bash -lc源〜/ .profile; 通知团队和其他变体。我也不想为每个别名使用单独的脚本。这违反了避免重复的目的。
基思·本特鲁普

我应该在尝试过的每个变体中都包含crontab中的错误:“找不到命令”。
基思·本特鲁普

使用经过测试的建议进行编辑。
华纳2010年

Thx为更新的示例。我认为,如果将-l添加到第一行,则可以摆脱第三行。
基思·本特鲁普

嗯,打个招呼-登录shell将启用expand_aliases。
华纳

1

我喜欢artifex的想法,即从文件中获取别名然后重用它,因为我找不到直接扩展/重用别名的方法。(其他解决方案仍需要另一个脚本。)

因此,我编写了此函数并将其放在我的.profile中:

grab-alias () { sed -n '/alias\s*'$1'\s*=/ {s/[^'\'']*.//;s/'\''\s*$//p}' /home/bentrupk/.profile; }

然后,我可以在crontab中将其用于各种别名,如下所示:

0 11 * * * /bin/bash -lc 'x=`grab-alias notify-team`; $x'
0 7 * * * /bin/bash -lc 'x=`grab-alias notify-me`; $x'

等等

是的,代码重用!谢谢大家


3
那是纯粹的邪恶。
贾斯汀2010年

如果可以直接使用别名,则可以。这就是问题的重点。欢迎提出另一种解决方案,但是我将把这个解决方案应用于整个目录中包含2-3个行的文件-这是在我添加其他通知方案或决定重用其他别名时发生的情况。
基思·本特鲁普

1

实际上,您可以做的最简单的事情就是创建

〜/ bin / notify-me与

#!/bin/sh
~/bin/notify.pl -u user1

〜/ bin / notify-team与

#!/bin/sh
~/bin/notify.pl -u user1 user2 user3 user4 ....

如您所见,shell别名很难维护并集成到其他系统中。最好的办法是将它们转换为不会产生有趣环境问题的完整命令。


1
感谢您的建议,但我从没想到很难维护别名,我宁愿维护1个别名文件,然后维护大量包装文件。问题是在cron作业中执行别名。
基思·本特鲁普

0

bash -ic“ notify-team”是最佳选择。它使别名在crontab中可用。您可能会进一步添加&用作背景,因为我们正在使用带有-i的“交互式” shell,但实际上并不与之交互。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.