Bash 스크립트 오류: 스크립트 자체의 디렉터리를 찾으려고 할 때 예기치 않은 파일 끝이 발생했습니다.

Bash 스크립트 오류: 스크립트 자체의 디렉터리를 찾으려고 할 때 예기치 않은 파일 끝이 발생했습니다.

아낌없이 빌려주세요StackOverflow 답변, 상대 경로를 사용하여 로그인 시 로드할 수 있도록 스크립트가 실행 중인 디렉터리를 찾고 싶습니다.

이제 스크립트는 매우 작습니다.

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
DIR=$( cd -P "$( dirname "$SOURCE" )" && pwd )

하지만 로그인하거나 전화하면 다음과 같은 메시지 source <this_script.sh>가 표시됩니다.

-bash: script.sh: line 4: syntax error: unexpected end of file

커플 질문:

  1. 그것은 무엇에 매달려 있습니까?
  2. 해결책은 무엇입니까?

다음이 실행 중입니다.

-bash-3.2$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

편집 1:

Jill의 솔루션을 사용해 보세요.

parent="$(dirname "$SOURCE")"
echo "PARENT IS $parent"
DIR="$(cd -P "$parent" && pwd)"
echo "DIR IS $DIR"

source로그인을 시도하거나 로그인할 때 다음 메시지가 나타납니다.

Last login: Mon Mar 12 08:07:13 2012 from ....
PARENT IS .
: No such file or directory
DIR IS
: command not found
: command not found
: command not found
: command not found

답변1

마지막 줄 끝에 개행 문자가 누락되었을 수 있습니다.

답변2

소스에서 컴파일된 bash 3.2.25(2)를 사용하여 이 동작을 재현할 수 없습니다.

3.2 시리즈 어딘가에서 $(…)구문 분석 방식이 변경되었습니다 .

우후. Bash는 이제 Posix 규칙에 따라 명령 대체를 구문 분석합니다. $()에 포함된 명령은 닫는 구분 기호로 구문 분석됩니다.

이 경우 재현할 수 없는 이유는 모르겠지만 오래되고 버그가 있는 구문 분석 동작이 발생할 수 있습니다. 명령을 단순화해 보세요.

parent=$(dirname "$SOURCE")
DIR=$(cd -P "$parent" && pwd)

외부 명령 대체에 큰따옴표를 추가하면 도움이 될 것이라고 생각합니다. 큰따옴표는 할당의 값 부분에 사용할 때 차이를 만들지 않지만, 버그가 있는 파서가 있는 쉘 버전이 있다는 것을 기억 foo=$(something)하지만 처리할 수는 있었습니다 foo="$(something)".

관련 정보