AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 867287
Accepted
user423047
user423047
Asked: 2017-01-03 18:05:17 +0800 CST2017-01-03 18:05:17 +0800 CST 2017-01-03 18:05:17 +0800 CST

如何使用“At”实用程序运行函数?

  • 772

假设我有这个脚本文件名为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实用程序安排功能?

timeout
  • 1 1 个回答
  • 78 Views

1 个回答

  • Voted
  1. Best Answer
    Eliah Kagan
    2017-01-03T20:23:24+08:002017-01-03T20:23:24+08:00

    如果可以,请将函数定义移动到单独的“库”文件中。

    如果可以接受编辑脚本,那么最好的解决方案可能是将脚本中的函数定义移到单独的文件中。该文件包含函数定义,然后将由脚本获取(以及从脚本中删除函数,您必须向执行此操作的脚本添加命令),以及您的任何其他脚本或命令正在运行at。

    例如,现在你pma.sh看起来像:

    !#/bin/bash
    
    apt-get install phpmyadmin -y
    
    function uninstpma {
        apt-get purge phpmyadmin -y
    }
    
    uninstpma
    

    (您的原始脚本的格式不同,并且uninstpma ()最后一行也有。在 Bourne 样式的 shell 中,参数列表,无论是否为空,都没有括在括号中。而且,至少在我系统上的 bash 4.3.46 中,这是不被接受的作为替代语法。所以我认为这()是一个错误并将其删除。)

    您可以创建一个名为的新文件pma_funcs.sh——你可以随意命名它——它包含:

    function uninstpma {
        apt-get purge phpmyadmin -y
    }
    

    它还可以包含其他函数定义。

    它没有#!/bin/bashhashbang 行,也不需要标记为可执行文件,因为它不会作为自包含脚本执行。相反,它实际上将用作其他脚本的库。

    所有调用者将首先使用函数定义获取文件。

    假设您放入pma.sh一个/opt/pma-helpers目录。(我不是说你应该把它放在哪里——它很可能不是最好的地方——我只需要选择一些东西。)然后你会修改pma.sh:

    !#/bin/bash
    
    . /opt/pma-helpers/pma_funcs.sh
    
    apt-get install phpmyadmin -y
    
    uninstpma
    

    内置的.源你的脚本,也就是说,它使 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。(同样,我没有理由认为这是将它放在您的系统上的合理位置。您应该将它放在对您正在做的事情有意义的地方。)该文件可能包含:

    #!/bin/bash
    # any commands here must not use the functions; they're not sourced yet
    . /opt/pma-helpers/pma_funcs.sh
    # you can put commands here if you want
    uninstpma
    # you can put commands here, too, if you want
    

    标记脚本可执行文件(chmod u+x /opt/pma-helpers/pma_job,假设 at 作业将作为脚本的所有者运行)。然后,当您想安排它时,您将创建一个包含运行该脚本的单个命令的 at 作业:

    at 'now + 2 minutes' <<<'/home/ek/source/pma_job'
    

    (我在调用的命令中使用了here 字符串at。)

    如果您真的不希望,这项工作不必进入专用的脚本文件。

    您的 Bash 脚本将能够获取并运行用 Bash 编写的所有 shell 函数。但是,如果出于某种原因您真的不想运行单独的脚本,那么您确实有其他选择。任何确保在 bash shell 中定义和使用依赖于 bash 的 shell 函数就足够了。

    例如,您可以使用嵌套的 here 文档:

    at now <<'EOF'
    bash - <<'EOF_BASH'
    # any commands here must not use the functions; they're not sourced yet
    . /opt/pma-helpers/pma_funcs.sh
    # you can put commands here if you want
    uninstpma
    # you can put commands here, too, if you want
    EOF_BASH
    EOF
    

    这有点复杂。拥有那个额外的pma_job脚本可能会更好。

    • 0

相关问题

  • 如何更改 Nautilus“键入时查找文件名”功能的“超时”持续时间?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve