【问题标题】:Bash script giving me a different result on reboot?Bash 脚本在重新启动时给了我不同的结果?
【发布时间】:2013-11-05 10:04:30
【问题描述】:

我在最后一天左右编写了一个 Bash 脚本,并直接在 shell 上运行和调试它。
最终脚本将在 Ubuntu 服务器重新启动时执行。
我已经开始对此进行测试,但是我的脚本给了我与预期不同的结果。 我已将其缩小为“或条件”,并重写了一个更简单的脚本来测试这个异常:

已在 /etc/rc.local 中调用此脚本,并将输出重定向到日志文件 (log/reboot.log)。

我的脚本中有这个(作为测试):

 #!/bin/bash 
YESTERDAY=20131103
SYS_DATE=20131104
LAST_START=20131104

if [[ $LAST_START = $YESTERDAY || $LAST_START = $SYS_DATE ]];
then
    echo "is equal"
else
   echo "is not equal"
fi

在 shell 中执行我得到“相等”(正确答案)。在日志中重新启动后,我得到“不等于”。

谁能告诉我为什么?

【问题讨论】:

  • 我没有看到任何 shebang 行。你确定是bash 运行了输出错误的脚本吗?
  • rc.local不是由sh执行的吗?尝试将 bash 中的所有内容包装为:bash -c 'YESTERDAY=20131103; SYS_DATE=20131104; if [[ $LAST_START = $YESTERDAY || $LAST_START = $SYS_DATE ]]; then echo "is equal"; else echo "is not equal"; fi',它应该可以工作。
  • 什么工作迫使脚本在 bash 中运行。所以我在 /etc/rc.local 中的脚本调用看起来像: bash /mnt/ETLModule2/scripts/rs-reboot.sh /mnt/ETLModule2/ > /mnt/ETLModule2/log/reboot-date +'%s'.log我应该继续在 Bash 中开发还是使用更标准的 POSIX 脚本编写方式?感谢您的帮助
  • 对于这样一件微不足道的事情,将自己限制在 POSIX 曲目中并不是一个严重的限制。如果你发现自己渴望数组等,也许考虑改用 Bash(或 Python 等脚本语言)。

标签: bash ubuntu reboot


【解决方案1】:

我猜这里,

但是您是否意识到您的/bin/sh 不是您的SHELL。 在 UBUNTU 和 Debian 中,/bin/sh 是 DASH,您的登录 shell 是 BASH。 所以它可能与你的 [[ ]] 语法有关,即 BASH。

你是不是在脚本的顶部:

#!/bin/sh

#!/bin/bash

[[

[[ 内置是一个 bashism,并且具有更好定义的语义 比 [ (又名测试)。但是,使用 [ 相反,可移植脚本必须这样做。注意参数处理 不太一样;如上所述,使用 = 而不是 ==。

看这里:

https://wiki.ubuntu.com/DashAsBinSh

在这里做事的正确方法

最好的解决方案实际上是将您的脚本放入/etc/init.d 并将其链接到运行级别6。这是重新启动时执行的运行级别。当您有空闲时间时,您应该考虑阅读man 8 init。它将帮助您了解您的系统是如何启动和关闭的。

【讨论】:

  • 感谢您的帮助 Oz123,忘记在我指定的脚本顶部提及 #!/bin/bash
  • @Alain,我为你添加了 shebang。你确定你是以 ​​BASH 身份运行的吗?
  • 观察力不错。但是是的,我刚刚又检查了一遍。
  • 您能否详细说明“/bin/sh 不是您的 SHELL”?系统shell和登录shell有什么区别?
  • @Alain,很简单。打开终端时使用的 shell 就是登录 shell。在 Debian 及其衍生产品中,决定初始化脚本将由 DASH 执行。原因之一是它更快。第二个原因,它的语法更简单。
猜你喜欢
  • 2017-08-31
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 2010-10-16
  • 2021-08-15
相关资源
最近更新 更多