나는 원래 내 동료가 bash 쉘용으로 작성한 이 스크립트를 작동시키려고 노력 중입니다. 계획은 zsh 쉘에서 가져오는 것입니다. 내가 이해한 바로는 이 스크립트를 사용하면 터미널을 통해 해당 디렉토리에 저장된 도우미 스크립트에 액세스할 수 있습니다. 그런데 이 단계를 수행하면 계속해서 오류 메시지가 나타납니다.
다음 ${BASH_SOURCE[0]}
과 같은 질문에 답변하여 다음 솔루션을 시도했습니다.${(%):-%N
${(%):-%x}
여기에서.
PATHNAME="$_";
if [[ "$PATHNAME" != "$0" ]]; then
export EXAMPLE_DIR=$(dirname $(dirname $(realpath ${BASH_SOURCE[0]})));
else
>&2 echo "This script should be sourced, not executed in a subshell";
fi
왜 계속 오류가 발생하는지 이해할 수 없으며 문제가 무엇인지 알고 싶습니다. 어떤 도움이나 독서 링크라도 대단히 감사하겠습니다!
답변1
$_
Bash와 Zsh가 다르기 때문에 오류가 발생합니다 .
$_
(밑줄) 쉘이 시작될 때 절대 경로 이름으로 설정하며, 실행 중인 쉘이나 환경 또는 인수 목록에 전달된 쉘 스크립트를 호출하는 데 사용됩니다. 이어서 확장 후 포그라운드에서 실행된 이전 단순 명령의 마지막 인수로 확장됩니다. 또한 실행된 각 명령을 호출하고 해당 명령으로 내보낸 환경에 배치하는 데 사용되는 전체 경로 이름으로 설정됩니다. 메일을 확인할 때 이 매개변수는 메일 파일의 이름을 보유합니다.
다음과 같이 블록을 다시 작성해야 합니다.
if [[ -z ${(M)zsh_eval_context:#file} ]]; then
print -u2 $0:A should be sourced, not executed in a subshell.
return 1
fi
export EXAMPLE_DIR=$0:A:h:h
$zsh_eval_context
file
이 단어는 파일에서 직접 코드를 읽을 때(예: 내장 함수를 사용할 때) 포함됩니다 source
.
${(M)zsh_eval_context:#file}
$zsh_eval_context
단어가 포함되어 있지 않으면 길이가 0인 문자열로 평가됩니다 file
.
print -u2
표준 오류로 인쇄합니다.
$0
소스 스크립트의 파일 이름입니다. :A
("절대"를 나타냄) 파일 이름을 절대 경로로 변환한 다음 결과 realpath
(사용 가능한 경우)를 전달하여 기호 링크를 확인합니다. :h
("head"의 경우)는 와 동일한 작업을 수행 dirname
하지만 이 외부 명령은 실제로 필요하지 않습니다.