쉘 스크립트 오류 메시지

쉘 스크립트 오류 메시지

나는 읽으면서 쉘 스크립팅을 배우려고 노력하고 있습니다.linuxcommand.org. 어떤 이유로 모든 명령을 실행하더라도 "찾을 수 없음" 오류가 계속 발생합니다.

내가받는 오류 코드는 다음과 같습니다.

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"

}

답변1

함수를 정의하는 표준 구조는 다음과 같습니다.

run_backup () { … }

ksh, bash 및 zsh에서는 대시와 같은 다른 셸에서는 사용할 수 없지만 다음을 사용하여 함수를 정의할 수 있습니다.

function run_backup { … }

대시를 사용하여 스크립트를 실행하면 다음과 같은 일이 발생합니다.

  • 셸은 $(run_backup)라는 명령이 없기 때문에 자연스럽게 첫 번째 오류 메시지를 생성하는 행을 실행합니다 run_backup.
  • 그런 다음 쉘은 명령을 실행하고 function run_backup명령이 호출되지 않았기 때문에 자연스럽게 두 번째 오류 메시지가 나타납니다 function.
  • 그런 다음 쉘은 유효한 쉘 구문인 중괄호 블록을 실행합니다.

xenoterracide의 설명에서 알 수 있듯이 이제 스크립트를 실행했으므로 #!/bin/bash아무 잘못도 하지 않으면 스크립트가 실행됩니다.bash

올바른 셸을 사용하여 스크립트를 실행하거나 (내 제안) function표준 구문으로 변경하더라도(다른 비표준 구문은 표시되지 않음) 사용하기 전에 함수 정의를 이동해야 합니다.

더 유용한 팁: 쉘 스크립트를 디버그할 때 실행 bash -x /path/to/script(또는 sh -x /path/to/script대기)하십시오. 그러면 각 실행 행에 대한 추적이 인쇄됩니다. 스크립트의 일부만 추적하려면 다음을 사용할 수 있습니다.set -x추적을 활성화 및 set +x비활성화합니다. Zsh는 다른 것보다 더 나은 추적 기능을 가지고 있지만 호환되지 않는 구문이 있습니다. 이 명령을 사용하면 zsh가 sh 구문을 기대하도록 지시할 수 있습니다 emulate sh 2>/dev/null(다른 쉘에서는 효과가 없습니다).

답변2

사용하기 전에 함수를 정의해야 합니다.

답변3

나는 그것을 스스로 알아 낸 것 같아요. Ubuntu가 기본값으로 사용된다는 사실에 갇힌 것 같습니다 . "sigh" dash명령을 사용하여 스크립트를 실행하고 있습니다 .sh

답변4

몇 가지 추측을 해볼 텐데요... vim마음에 들지 않으니 if(한번 시도해 보세요. if (하지만 그냥 재미있는 일이 될 수도 있습니다.

내 생각에 당신의 진짜 문제는 당신이 run_backup그것을 만들기 전에 전화를 한다는 것입니다. function당신의 블록 앞에 당신의 것을 넣으십시오 if then else. 쉘은 기능을 사용하기 전에 기능을 이해해야 합니다. 이는 일반적으로 프로그래밍에 적용됩니다.

관련 정보