다음과 같은 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_SOURCE
in은 bash
가져오는 파일을 참조하므로 해당 변수를 스크립트 경로로 미리 채웁니다.
zsh
이 코드에 해당하는 것은 다음과 같습니다 bash
.
export SOME_VARIABLE=$0:h:P
( :h
주어진머리csh와 같습니다( 와 동일 dirname
) . :P
GNU 와 동일 readlink -f
.
아무튼 그
SOME_VARIABLE=$(readlink -f $(디렉터리 이름${BASH_SOURCE[0]}))
bash
필요한 코드가 올바르지 않습니다.
SOME_VARIABLE=$(
readlink -f -- "$(dirname -- "$BASH_SOURCE")"
)
그럼에도 불구하고 $BASH_SOURCE
dirname 앞이나 뒤에 개행 문자가 오면 작동하지 않습니다 readlink -f
.
답변2
좋습니다. 저도 비슷한 문제가 있었습니다. 많은 생각 끝에 다른 방법으로 해결했습니다. 하지만 이 질문은 실제로 매우 흥미롭습니다. 그리고 그 해결책은 매우 우아합니다.
주요/실제 문제(AFAIU)는 다음과 같습니다.
정의된 모든 환경 변수가 필요하기 때문에 zsh 셸에서 가져와야 합니다.
, 어디그것Bash 스크립트입니다.
스크립트가 사용된다는 사실은 BASH_SOURCE
실제로는 부차적인 것입니다.예배쉬, 기간. 우리는 이를 "블랙박스"라고 생각할 수 있으며 우리가 원하는 것은 그 안에 어떤 변수가 정의(또는 수정)되어 있는지 알아내는 것뿐입니다.
- 스크립트에는 소스가 있어야 합니다.존재하다세게 때리다.
즉, 우리가 하고 싶은 것은 (Bash 인터프리터 내에서)
- 버퍼 초기 상태환경,
- 원천스크립트,
- 버퍼링 후 상태환경,
- 차이점완충기.
귀하/우리는 새로운/수정된 변수를 인쇄해야 합니다.
제안된해결책-- 위 단계는 -- 다음과 같습니다.
% 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에서)를 수행합니다. 그게 전부입니다.