Bash
Shell 腳本錯誤資訊
我正在嘗試通過閱讀linuxcommand.org來學習 shell 腳本。出於某種原因,我不斷收到錯誤“未找到”,即使它執行了所有命令。
我得到的錯誤程式碼是:
minecraft_backup.sh: 21: run_backup: not found minecraft_backup.sh: 23: function: not found
這是腳本:
#!/bin/bash #MineCraft backup script by #Variables APP=MineCraft SERVICE=Minecraft_Mod.jar APPDIR=/opt/MineCraft_Server/bin BACKUPDIR1=/opt/MineCraft_Server/backup1 BACKUPDIR2=/opt/MineCraft_Server/backup2 #First i want to check if minecraft server is running. if(ps ax | grep -v grep | grep $SERVICE > /dev/null) then echo "$APP is running" $(run_backup) else echo "$APP is not running" exit 1 fi function run_backup { echo "Starting back up" #create backup dirs of they do not exit if [ ! -d "$BACKUPDIR1" ] then mkdir $BACKUPDIR1 fi if [ ! -d "$BACKUPDIR2" ] then mkdir $BACKUPDIR2 echo "test" fi #backup save1 to save2 rsync -av --delete "$BACKUPDIR1/" "$BACKUPDIR2" #backup running app to save 1 rsync -av --delete "$APPDIR/" "$BACKUPDIR1" }
定義函式的標準結構是
run_backup () { … }
在 ksh、bash 和 zsh 中,但在 dash 等其他 shell 中,您可以定義一個函式
function run_backup { … }
當您使用 dash 執行腳本時發生的情況是:
- shell 執行了該
$(run_backup)
行,自然會導致第一條錯誤消息,因為沒有呼叫命令run_backup
。- shell 稍後執行
function run_backup
,自然導致第二條錯誤消息,因為沒有呼叫命令function
。- 然後 shell 執行了括號塊,這本身就是有效的 shell 語法。
請注意,正如 xenoterracide 的評論所表明的那樣,既然你有,如果你沒有做錯什麼
#!/bin/bash
,腳本就會被執行。bash
即使您使用正確的 shell 執行腳本,或者(我的建議)更改
function
為標準語法(我沒有看到任何其他非標準構造),您仍然需要將函式定義移至使用之前。另一個有用的提示:當你調試一個 shell 腳本時,執行
bash -x /path/to/script
(或sh -x /path/to/script
,等等)。這將列印每個執行行的跟踪。如果您只想跟踪腳本的一部分,您可以使用**set -x
**啟用和set +x
禁用跟踪。Zsh 比其他的有更好的跟踪,但它的語法不兼容;您可以使用命令告訴 zsh 期待 sh 語法emulate sh 2>/dev/null
(這在其他 shell 中無效)。