/tmp/foo/bar.sh
다음과 같은 몇 가지 스크립트가 있습니다 /tmp/foo/baz.sh
.
# /tmp/foo/bar.sh
alias -g __FILE__='${(%):-%x}'
alias -g __DIR__='${${(%):-%x}%/*}'
printf "sourcing %s\n" __FILE__
printf "about to source %s/baz.sh\n" __DIR__
. /tmp/foo/baz.sh
. $( printf "%s/baz.sh" __DIR__ ) # succeeds
. __DIR__"/baz.sh" # fails
# /tmp/foo/baz.sh
printf "sourcing %s\n" __FILE__
첫 번째 스크립트는 /tmp/foo/bar.sh
여러 가지를 정의합니다.글로벌( -g
) 확장되어야 하는 주문으로서의 별칭 (첫 번째 근사치! )를 현재 스크립트의 (호출) 경로에 추가하고 디렉터리를 포함합니다. 그런 다음 이러한 별칭을 printf
여러 명령의 인수로 사용합니다. 마지막으로 /tmp/foo/baz.sh
세 가지 방법으로 두 번째 스크립트를 가져옵니다.
- 두 번째 스크립트의 리터럴 경로를 사용하십시오.
__DIR__
printf
명령 대체를 통해 간접적으로 별칭을 사용합니다.- 별칭을 직접 사용하십시오
__DIR__
.
첫 번째 스크립트를 받았을 때 얻은 내용은 다음과 같습니다.
% (/usr/bin/env -i zsh -fc '. /tmp/foo/bar.sh')
sourcing /tmp/foo/bar.sh
about to source /tmp/foo/baz.sh
sourcing /tmp/foo/baz.sh
sourcing /tmp/foo/baz.sh
/tmp/foo/bar.sh:.:11: no such file or directory: __DIR__/baz.sh
(노래와 춤은 최대한 단순한 설정에서 /usr/bin/env
하려고 노력합니다.)/tmp/foo/bar.sh
__DIR__
즉시 따라가면 /baz.sh
별칭으로 인식되지 않는 것 같으니 말이 됩니다 . 이 형식은 $( printf "%s/baz.sh" __DIR__ )
이 문제를 해결하지만 애초에 별칭을 사용하면 길이와 복잡성이 크게 향상됩니다.
별칭을 사용하여 두 번째 문자열에 대한 경로를 작성하는 더 편리한 방법이 있습니까 __DIR__
?
보다 일반적으로 특정 문자 시퀀스를 별칭으로 처리해야 함을 파서에게 알리는 일반적인 "문법 트릭"이 있습니까? 내 희망은 이와 같은 전역 별칭을 다음과 더 유사하게 만드는 것입니다.단순한(즉, 한 줄, 매개변수 없음 등) C 전처리기 매크로. 마음속에 떠오르는 "구문 트릭"의 예는 다음과 같습니다(둘 다 작동하지 않음).
. {__DIR__}/baz.sh
. __DIR__"/baz.sh"
답변1
하나의 문자열을 단 하나의 추가 문자가 있는 다른 문자열로 바꿀 수 있는 함수가 있습니다:
__FILE__='${(%):-%x}'
__DIR__='${${(%):-%x}%/*}'
. $__DIR__/baz.sh
실제로 변수를 정의하고 싶지 않은 경우 또 다른 접근 방식은 단어 시작 부분의 물결표 문자 뒤에만 확장되는 명명된 디렉터리를 정의하는 것입니다. 이는 귀하의 예에서는 작동하지만 원하는 모든 경우에 일반화되지는 않을 수 있습니다.
hash -d __FILE__='${(%):-%x}'
hash -d __DIR__='${${(%):-%x}%/*}'
. ~__DIR__/baz.sh
답변2
좋아, 아래와 같이 적합한 해결책을 찾았습니다.
# /tmp/foo/bar.sh
alias -g __FILE__='echo "${(%):-%x}"'
alias -g __DIR__='echo "${${(%):-%x}%/*}"'
printf "sourcing %s\n" $(__FILE__)
printf "about to source %s/baz.sh\n" $(__DIR__)
. $(__DIR__)/baz.sh # succeeds