Bash脚本在重新启动时给我一个不同的结果?
我在最后一天左右编写了一个Bash脚本,并直接在shell上运行和调试它。Bash脚本在重新启动时给我一个不同的结果?,bash,ubuntu,reboot,Bash,Ubuntu,Reboot,我在最后一天左右编写了一个Bash脚本,并直接在shell上运行和调试它。 最后的脚本将在Ubuntu服务器重新启动时执行 我已经开始测试这个,但是我的脚本给了我一个不同于预期的结果。 我已将其缩小为“或条件”,并重写了一个更简单的脚本来测试此异常: 已在/etc/rc.local中调用此脚本,并将输出重定向到日志文件(log/reboot.log) 我的脚本中有以下内容(作为测试): 在shell中执行我得到的“是相等的”(正确答案)。在日志中重新启动后,我得到“不相等”。 有人能告诉我为什么
最后的脚本将在Ubuntu服务器重新启动时执行
我已经开始测试这个,但是我的脚本给了我一个不同于预期的结果。 我已将其缩小为“或条件”,并重写了一个更简单的脚本来测试此异常: 已在/etc/rc.local中调用此脚本,并将输出重定向到日志文件(log/reboot.log) 我的脚本中有以下内容(作为测试): 在shell中执行我得到的“是相等的”(正确答案)。在日志中重新启动后,我得到“不相等”。
有人能告诉我为什么吗?
我在这里猜 但是你意识到你的
/bin/sh
不是你的外壳吗。
在UBUNTU和Debian中,/bin/sh
是DASH,您的登录shell是BASH。
因此,它可能与BASH的[[]]
语法有关
你在剧本的顶部写对了吗:
#!/bin/sh
或
[[
[[builtin]是一种巴什主义,具有更好的语义定义
比[(又称测试)。然而,使用它仍然是相当合理的[
相反,和可移植脚本必须这样做
不完全相同;如上所述,使用=而不是==
请看这里:
在这里做事的正确方法
最好的解决办法是把你的脚本放在<代码> /ETC/init .d/c>中,并将它链接到运行级别6。这是重新启动时执行的运行级别。当你有空闲时间时,你应该考虑阅读<代码> man 8 init < />代码。这将有助于你理解系统是如何启动和关闭的。ng行。你确定是
bash
运行了输出不正确的脚本吗?rc.local
不是由sh
执行的吗?尝试将bash
中的所有内容包装为:bash-c'beday=20131103;SYS_DATE=20131104;如果[$LAST_START=$beday | LAST_START=$SYS_DATE]];那么echo“是相等的”;否则echo是相等的“不平等";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)。。感谢您的帮助,Oz123,忘了在我指定的脚本顶部提到#!/bin/bash@Alain,我为你添加了shebang。你确定你是作为BASH运行的吗?观察得很好。但是,是的,我刚刚再次检查了它。你能详细说明一下“the/bin/sh不是你的SHELL”吗?system shell和login shell之间有什么区别?@Alain,很简单。打开终端时使用的shell就是登录shell。在Debian及其衍生产品中,决定由DASH执行init脚本。一个原因是它更快。第二个原因是它的语法更简单。
#!/bin/sh
#!/bin/bash