나는 읽으면서 쉘 스크립팅을 배우려고 노력하고 있습니다.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
. 쉘은 기능을 사용하기 전에 기능을 이해해야 합니다. 이는 일반적으로 프로그래밍에 적용됩니다.