zsh 쉘에서 BASH_SOURCE가 포함된 bash 스크립트를 얻는 방법은 무엇입니까?

zsh 쉘에서 BASH_SOURCE가 포함된 bash 스크립트를 얻는 방법은 무엇입니까?

다음과 같은 bash 스크립트가 있습니다.

...
SOME_VARIABLE=$(readlink -f $(dirname ${BASH_SOURCE[0]}))
export SOME_VARIABLE
...

정의된 모든 환경 변수가 필요하기 때문에 zsh 셸에서 가져와야 합니다.

문제는 BASH_SOURCE로 인해 발생합니다. 다음 오류 메시지가 나타납니다.

dirname: missing operand
Try 'dirname --help' for more information.
readlink: missing operand
Try 'readlink --help' for more information.
Invalid location:

제한: 스크립트를 수정할 수 없습니다.

질문: zsh에서 BASH_SOURCE가 포함된 bash 스크립트를 얻을 수 있나요?

답변1

. /path/to/that/script.bash대신 다음을 수행하지 마십시오 .

BASH_SOURCE=/path/to/that/script.bash emulate ksh -c '. "$BASH_SOURCE"'

emulate ksh -c '...'시뮬레이션에서 코드를 실행하고 ksh(예: 배열 인덱싱은 bash와 마찬가지로 0에서 시작함) 여기에 정의된 모든 함수가 시뮬레이션 모드를 상속하는지 확인하세요.

$BASH_SOURCEin은 bash가져오는 파일을 참조하므로 해당 변수를 스크립트 경로로 미리 채웁니다.

zsh이 코드에 해당하는 것은 다음과 같습니다 bash.

export SOME_VARIABLE=$0:h:P

( :h주어진머리csh와 같습니다( 와 동일 dirname) . :PGNU 와 동일 readlink -f.

아무튼 그

SOME_VARIABLE=$(readlink -f $(디렉터리 이름${BASH_SOURCE[0]}))

bash필요한 코드가 올바르지 않습니다.

SOME_VARIABLE=$(
  readlink -f -- "$(dirname -- "$BASH_SOURCE")"
)

그럼에도 불구하고 $BASH_SOURCEdirname 앞이나 뒤에 개행 문자가 오면 작동하지 않습니다 readlink -f.

답변2

좋습니다. 저도 비슷한 문제가 있었습니다. 많은 생각 끝에 다른 방법으로 해결했습니다. 하지만 이 질문은 실제로 매우 흥미롭습니다. 그리고 그 해결책은 매우 우아합니다.

주요/실제 문제(AFAIU)는 다음과 같습니다.

정의된 모든 환경 변수가 필요하기 때문에 zsh 셸에서 가져와야 합니다.

, 어디그것Bash 스크립트입니다.

스크립트가 사용된다는 사실은 BASH_SOURCE실제로는 부차적인 것입니다.배쉬, 기간. 우리는 이를 "블랙박스"라고 생각할 수 있으며 우리가 원하는 것은 그 안에 어떤 변수가 정의(또는 수정)되어 있는지 알아내는 것뿐입니다.

  • 스크립트에는 소스가 있어야 합니다.존재하다세게 때리다.

즉, 우리가 하고 싶은 것은 (Bash 인터프리터 내에서)

  1. 버퍼 초기 상태환경,
  2. 원천스크립트,
  3. 버퍼링 후 상태환경,
  4. 차이점완충기.

귀하/우리는 새로운/수정된 변수를 인쇄해야 합니다.

제안된해결책-- 위 단계는 -- 다음과 같습니다.

% bash -c 'buf1=$(env|sort) && source bashrc && buf2=$(env|sort) && diff <(echo "$buf1") <(echo "$buf2")'

, bashrc가정된 스크립트의 이름은 어디에 있습니까?

이것은 실제로 작동합니다.어느Bash가 설치되어 있고 버전이 스크립트와 호환되는 경우 쉘(zsh, csh, ksh 등)을 사용할 수 있습니다(가능성이 높지만 주목할 가치가 있음).

로서, 여기에 다음 스크립트가 있습니다. 이를 호출합니다 bashrc.

#!/bin/bash
HERE=$(cd `dirname $BASH_SOURCE`; pwd)
PATH="${HERE}/bin:$PATH"
export HERE
export PATH

, 새 변수를 정의 $HERE하고 기존 변수를 수정합니다 $PATH. 이 스크립트를 내 디렉토리에 넣었습니다 /tmp. 위 명령은 다음을 제공합니다.

6a7
> HERE=/tmp
15c16
< PATH=/Users/chbrandt/bin/links:/Users/chbrandt/bin/links:/Users/chbrandt/bin/links:/opt/miniconda3/bin:/opt/miniconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
---
> PATH=/tmp/bin:/Users/chbrandt/bin/links:/Users/chbrandt/bin/links:/Users/chbrandt/bin/links:/opt/miniconda3/bin:/opt/miniconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

아주 달콤하지 않나요? ...이제 기호와 다른 모든 것을 처리하기 위해 후처리(예: zsh에서)를 수행합니다. 그게 전부입니다.

관련 정보