2015-02-07 45 views
1

我有一個文件裏面這個shell腳本調用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) 

如果我單獨執行的每一行,我得到這樣的:

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

現在,如果我只是在shell腳本文件中運行所有這些行,我會得到這個輸出:

[email protected]:/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 
[email protected]:/opt/AppServer# 

部分回聲消息丟失,屏幕上出現一些錯誤。

爲什麼會發生這種情況?與單獨運行每個行或運行在.sh文件中有什麼不同?

編輯:添加#/斌/ bash作爲第一行輸出:

[email protected]:/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 
[email protected]:/opt/AppServer# 
+1

腳本的第一行是什麼?你在用什麼外殼? – tink 2015-02-07 18:05:58

+0

bash我想。第一行是* echo「KILLING SERVER SESSION」* – PedroD 2015-02-07 18:07:37

+0

考慮製作第一行**#!/ bin/bash ** ... – tink 2015-02-07 18:09:34

回答

4

看到chat討論。

問題原來是用UTF-8編碼的Unicode字節順序標記(BOM),字節爲0xEF 0xBB 0xBF,而shell不喜歡。刪除它,並確保shell代碼將與dash而不是bash一起使用,得到的東西正常工作。在診斷

主要步驟是:

  • 建立了殼dashbash
  • 使用十六進制轉儲工具檢查文件的前幾行,以使BOM可見。
  • 知道如何擺脫物料清單(後面跟着一個換行符,方便使用sed)。
  • 使用sh -x restart_server.sh來查看正在執行的內容。
1

你需要調用的bash,以執行bash腳本,要做到這一點使用

whereis bash 

那麼你應該把第一行的bash腳本給定路徑

#!/bin/bash

有時是#!/bin/sh

這取決於你的發行版