아낌없이 빌려주세요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
커플 질문:
- 그것은 무엇에 매달려 있습니까?
- 해결책은 무엇입니까?
다음이 실행 중입니다.
-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)"
.