단어의 일부 내에서 전역 별칭을 강제로 확장합니다.

단어의 일부 내에서 전역 별칭을 강제로 확장합니다.

/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세 가지 방법으로 두 번째 스크립트를 가져옵니다.

  1. 두 번째 스크립트의 리터럴 경로를 사용하십시오.
  2. __DIR__printf명령 대체를 통해 간접적으로 별칭을 사용합니다.
  3. 별칭을 직접 사용하십시오 __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

관련 정보