스크립트에 BASH_SOURCE[0]이 있을 때 bash 스크립트를 zsh로 변환하는 방법은 무엇입니까?

스크립트에 BASH_SOURCE[0]이 있을 때 bash 스크립트를 zsh로 변환하는 방법은 무엇입니까?

나는 원래 내 동료가 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_contextfile이 단어는 파일에서 직접 코드를 읽을 때(예: 내장 함수를 사용할 때) 포함됩니다 source.


${(M)zsh_eval_context:#file}$zsh_eval_context단어가 포함되어 있지 않으면 길이가 0인 문자열로 평가됩니다 file.


print -u2표준 오류로 인쇄합니다.


$0소스 스크립트의 파일 이름입니다. :A("절대"를 나타냄) 파일 이름을 절대 경로로 변환한 다음 결과 realpath(사용 가능한 경우)를 전달하여 기호 링크를 확인합니다. :h("head"의 경우)는 와 동일한 작업을 수행 dirname하지만 이 외부 명령은 실제로 필요하지 않습니다.

관련 정보