【问题标题】:Why is the following bash script not working when called with nohup?为什么以下 bash 脚本在使用 nohup 调用时不起作用?
【发布时间】:2014-07-24 21:35:16
【问题描述】:

如下脚本:

#!/bin/bash

function hello {

        echo "Hello World"

}

hello

可以正常工作,但是当我用 nohup 调用它时

nohup ./myScript.sh 

脚本不再起作用,并打印以下内容:

./myScript.sh: 5: ./myScript.sh: function: not found
Hello World
./myScript.sh: 9: ./myScript.sh: Syntax error: "}" unexpected

我知道对这个脚本使用nohup 是没有意义的,因为它运行得相当快,但是我还有另一个脚本需要几个小时才能运行,并且我在其中使用了该函数语法。有没有办法解决这个问题?

【问题讨论】:

  • 在这里工作;你在什么系统上?
  • 那些行号与那个脚本不对应;那是您正在运行的确切脚本吗?
  • @BrianCampbell 抱歉,我在运行脚本后删除了一些空行。脚本的文本是一样的。
  • 尝试用简单的hello() { 代替function hello { - function 是 bash 主义。也许你的 /bin/bash 不是 bash.. ;)

标签: bash shell nohup


【解决方案1】:

注意declare a function in POSIX standard shell,你只需写函数名,后跟一对空括号,然后用大括号括起来:

#!/bin/bash

hello() {
    echo "Hello World"
}

hello

一些 shell,如 bash,也接受 function 关键字来声明函数,但根据您的错误消息,您使用的 shell 似乎不接受它。为了可移植性,最好使用 POSIX 标准声明样式。

您看到直接运行脚本和在nohup 下运行脚本的区别的原因在于文件开头的空白行。 #! 必须是文件的前两个字符 才能指定解释器,否则这只是一个注释。看起来当从 Bash shell 中执行时,脚本被 Bash 解释并且它识别 Bash 扩展。但是当从nohup 运行时,它会被sh 解释,在某些系统上它是一个更简单的shell,比如dash,它只支持上面的POSIX 语法。

【讨论】:

  • +1;很好的猜测错误消息:这正是您使用dash 运行该脚本时所​​得到的(与问题中的shebang 行相矛盾)。但是,我不会太担心 可移植性,因为我会担心确保它确实是 bash 执行脚本。
  • @mklement0 根据他上面的评论扩展了我的答案,即他在脚本开头有空行。这可以解释为什么它没有被 bash 执行; shebang 必须是文件中的前两个字符。
  • 快速测试告诉我:bashksh 运行没有 [有效] shebang 行的可执行脚本文件 - 当单独调用时 - 它们自己,而 @ 987654337@ 和 dash 默认为 shnohup 也是如此) - 我不清楚 bashksh 究竟是如何做到的。
  • 确实,错误在于 shebang 不是文件的前两个字符。使用 nohup 运行该脚本现在可以正常工作。
  • @mklement0 Bash 会解释没有#! 本身的脚本,因为它调用了execve,并检查它是否因为缺少#! 而失败,如果是,则自行执行(source)。另一方面,nohup 调用 execvp,其行为默认返回为使用 /bin/sh (source) 解释脚本。
猜你喜欢
  • 1970-01-01
  • 2014-09-18
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2021-04-20
相关资源
最近更新 更多