假设我有这个脚本文件名为pma.sh
:
#!/bin/bash
apt-get install phpmyadmin -y
function uninstpma {
apt-get purge phpmyadmin -y
}
uninstpma ()
要运行整个脚本,at
我可以做到./pma.sh | at 'now + 2 minuts'
。但我不希望整个脚本都使用它;相反,仅适用于脚本内的函数。所以:
我怎样才能只使用at
实用程序安排功能?
假设我有这个脚本文件名为pma.sh
:
#!/bin/bash
apt-get install phpmyadmin -y
function uninstpma {
apt-get purge phpmyadmin -y
}
uninstpma ()
要运行整个脚本,at
我可以做到./pma.sh | at 'now + 2 minuts'
。但我不希望整个脚本都使用它;相反,仅适用于脚本内的函数。所以:
我怎样才能只使用at
实用程序安排功能?
如果可以,请将函数定义移动到单独的“库”文件中。
如果可以接受编辑脚本,那么最好的解决方案可能是将脚本中的函数定义移到单独的文件中。该文件包含函数定义,然后将由脚本获取(以及从脚本中删除函数,您必须向执行此操作的脚本添加命令),以及您的任何其他脚本或命令正在运行
at
。例如,现在你
pma.sh
看起来像:(您的原始脚本的格式不同,并且
uninstpma ()
最后一行也有。在 Bourne 样式的 shell 中,参数列表,无论是否为空,都没有括在括号中。而且,至少在我系统上的 bash 4.3.46 中,这是不被接受的作为替代语法。所以我认为这()
是一个错误并将其删除。)您可以创建一个名为的新文件
pma_funcs.sh
——你可以随意命名它——它包含:它还可以包含其他函数定义。
它没有
#!/bin/bash
hashbang 行,也不需要标记为可执行文件,因为它不会作为自包含脚本执行。相反,它实际上将用作其他脚本的库。所有调用者将首先使用函数定义获取文件。
假设您放入
pma.sh
一个/opt/pma-helpers
目录。(我不是说你应该把它放在哪里——它很可能不是最好的地方——我只需要选择一些东西。)然后你会修改pma.sh
:内置的
.
源你的脚本,也就是说,它使 shell 执行作为其参数(/opt/pma-helpers/pma_funcs.sh
) 传递的文件中的所有命令。由于没有创建子shell 来运行它们(参见这个问题和那个问题),定义新变量和函数的命令对调用者生效。(该调用者是运行的脚本.
,而不是运行它的任何脚本,如果有的话,除非也使用.
了其他脚本。)然后,当你需要修改一个函数时,你只有一个副本可以编辑——在
pma_funcs.sh
. 新版本将在. /opt/pma-helpers/pma_funcs.sh
此后pma_funcs.sh
更新的 shell 实例中定义。在使用函数之前,您必须获取包含函数定义的文件,但您不必在脚本的最顶部这样做(除非下一行使用其中一个)。
要在运行时调用这些函数之一
at
,您将在运行的代码中获取脚本at
。您的示例代码需要
bash
,但at
使用sh
.然而,在这种特殊情况下,使用
at
运行脚本/bin/sh
还有一个额外的复杂性,在 Ubuntu 中由dash
, notbash
提供,但您的脚本使用了更基本的 POSIX shell(如 Dash)不支持的 Bash 特定功能。(该功能是定义函数的语法
function name compound-command
。与所有符合 POSIX 的 shell 一样,Dash 确实支持函数,但仅支持标准语法。Bash 也支持,所以如果这是您正在使用的唯一 Bash 特定功能,那么您可以切换到标准语法。不过,我猜它不是您计划使用的唯一语法,因为 Bash 提供了许多其他方便的扩展,这些扩展不太容易替换。)name () compound-command
因此,您应该强烈考虑制作一个 Bash 脚本并使用
at
. 假设您制作了这个在职脚本/opt/pma-helpers/pma_job
。(同样,我没有理由认为这是将它放在您的系统上的合理位置。您应该将它放在对您正在做的事情有意义的地方。)该文件可能包含:标记脚本可执行文件(
chmod u+x /opt/pma-helpers/pma_job
,假设 at 作业将作为脚本的所有者运行)。然后,当您想安排它时,您将创建一个包含运行该脚本的单个命令的 at 作业:(我在调用的命令中使用了here 字符串
at
。)如果您真的不希望,这项工作不必进入专用的脚本文件。
您的 Bash 脚本将能够获取并运行用 Bash 编写的所有 shell 函数。但是,如果出于某种原因您真的不想运行单独的脚本,那么您确实有其他选择。任何确保在 bash shell 中定义和使用依赖于 bash 的 shell 函数就足够了。
例如,您可以使用嵌套的 here 文档:
这有点复杂。拥有那个额外的
pma_job
脚本可能会更好。