我在一个名为 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#
答案 0 :(得分:4)
请参阅chat中的讨论。
问题原来是以UTF-8编码的Unicode字节顺序标记(BOM),字节为0xEF 0xBB 0xBF,这是shell不喜欢的。删除它,并确保shell代码与dash
而不是bash
一起使用,使事情正常运行。
诊断的关键步骤是:
dash
而不是bash
。sed
。)sh -x restart_server.sh
查看正在执行的内容。答案 1 :(得分:1)
你需要调用bash才能执行bash脚本,使用
whereis bash
然后你应该把bash脚本的第一行放入给定的路径
即。 #!/bin/bash
有时是#!/bin/sh
这取决于您的发行版