与shell脚本文件有关的奇怪问题

时间:2015-02-07 18:03:18

标签: linux bash shell unix sh

我在一个名为 restart_server.sh 的文件中有这个shell脚本:

echo "KILLING SERVER SESSION"
kill $(cat serverlastpid.txt)
sleep 20
echo "STARTING SERVER..."
java -jar eu.greensmartcampus-0.0.1-SNAPSHOT-jar-with-dependencies.jar </dev/null>/dev/null 2>&1 &
echo $! > serverlastpid.txt
echo "SERVER STARTED! PID:" $(cat serverlastpid.txt)

如果我单独执行每一行,我会得到:

root@production:/opt/AppServer# echo "KILLING SERVER SESSION"
KILLING SERVER SESSION
root@production:/opt/AppServer# kill $(cat serverlastpid.txt)
root@production:/opt/AppServer# sleep 20
root@production:/opt/AppServer# echo "STARTING SERVER..."
STARTING SERVER...
root@production:/opt/AppServer# java -jar eu.greensmartcampus-0.0.1-SNAPSHOT-jar-with-dependencies.jar </dev/null>/dev/null 2>&1 &
[1] 14620
root@production:/opt/AppServer# echo $! > serverlastpid.txt
root@production:/opt/AppServer# echo "SERVER STARTED! PID:" $(cat serverlastpid.txt)
SERVER STARTED! PID: 14620
root@production:/opt/AppServer#

现在,如果我只是在shell脚本文件中运行所有这些行,我会改为输出:

root@production:/opt/AppServer# sh restart_server.sh
restart_server.sh: 1: restart_server.sh: echo: not found
STARTING SERVER...
SERVER STARTED! PID: 14777
[1]+  Exit 143                java -jar eu.greensmartcampus-0.0.1-SNAPSHOT-jar-with-dependencies.jar < /dev/null > /dev/null 2>&1
root@production:/opt/AppServer#

一些 echo 消息丢失,屏幕上出现一些错误。

为什么会这样?与单独运行每行还是在.sh文件中运行有何不同?

编辑:添加#!/ bin / bash作为第一行输出:

root@production:/opt/AppServer# sh restart_server.sh
restart_server.sh: 1: restart_server.sh: #!/bin/bash: not found
KILLING SERVER SESSION
STARTING SERVER...
SERVER STARTED! PID: 15366
root@production:/opt/AppServer#

2 个答案:

答案 0 :(得分:4)

请参阅chat中的讨论。

问题原来是以UTF-8编码的Unicode字节顺序标记(BOM),字节为0xEF 0xBB 0xBF,这是shell不喜欢的。删除它,并确保shell代码与dash而不是bash一起使用,使事情正常运行。

诊断的关键步骤是:

  • 确定shell为dash而不是bash
  • 使用十六进制转储工具检查文件的前几行,以便BOM可见。
  • 知道如何摆脱BOM(后面有换行符,因此可以轻松使用sed。)
  • 使用sh -x restart_server.sh查看正在执行的内容。

答案 1 :(得分:1)

你需要调用bash才能执行bash脚本,使用

whereis bash

然后你应该把bash脚本的第一行放入给定的路径

即。 #!/bin/bash

有时是#!/bin/sh

这取决于您的发行版