"소스" 파일의 ".zwc" 버전을 자동으로 사용합니다.

"소스" 파일의 ".zwc" 버전을 자동으로 사용합니다.

*.zwcZ-shell Word 코드 파일이거나 컴파일된 스크립트라고 생각되는 파일을 발견했습니다 zsh.

임의의 파일을 -ing할 때 source다음과 같은 방법이 있습니까 zsh?

  • .zwc파일이 존재하고 파일보다 최신인 경우 해당 파일을 사용하십시오.
  • 그렇지 않으면 파일을 Z-shell Word Code로 컴파일한 source다음

함수만 포함된 파일이 있으면 대답이 다릅니까?

Z-shell Word Code에 대한 튜토리얼은 많지 않은 것 같으니, 자유롭게 알려주세요.

답변1

최소한 파일을 사용하기 위해 .zwc아무것도 할 필요가 없습니다. ~처럼.명령에 대한 Zsh 맨페이지상태:

[...] 파일 이름이 '문서.zwc'가 발견되었는데,문서, 컴파일된 형식입니다( zcompile내장을 사용하여 생성됨).문서, 대신 해당 파일에서 명령을 읽습니다.문서.

source검색순서를 제외하면 와 동일하기 때문에 마찬가지이다 ..


래퍼 함수를 ​​생성하여 모든 소스 스크립트의 자동 컴파일을 수행할 수 있습니다. 예를 들어:

source () {
    [[ ! "$1.zwc" -nt $1 ]] || zcompile $1
    builtin source $@
}

. () {
    [[ ! "$1.zwc" -nt $1 ]] || zcompile $1
    builtin . $@
}

물론 이러한 래퍼는 매우 간단하기 때문에 추가 실패 저장이 필요할 수 있습니다. 예를 들어, 가져오려는 파일이 있는 디렉터리에 쓰기가 불가능한 경우입니다. 또한 소스 파일에 구문 오류가 없더라도 컴파일이 실패할 수 있습니다.

답변2

기반으로아다폰의 답변source, 나는 및 에 대한 완전한 대체물을 작성했습니다 ..

$@인수가 제공되지 않으면 전달 동작이 내장되어 있기 때문에 이는 쉽지 않습니다 .

필수 별칭은 주석에 있습니다.

compile-source-file:

# This file needs to be `sourced` to ensure a drop-in behaviour for `source` or `.`
# The shell passess "$@" to source if no arguments are given after the file to be sourced.

# Works in bash.

# Required aliases are:
# alias source='builtin source compile-source-file source "$#" "$@"'
# alias      .='builtin .      compile-source-file .      "$#" "$@"'

# zsh: compile functions before sourcing
# This function expects to be called with:
# $1 builtin to use, either `.` or `source`.
# $2 file to source
# $3... arguments to pass to sourced file
function compile_then_source () {
  local method=$1 file=$2; shift 2; local args=("$@")

  # ${var@Q} gives value of var quoted in a format that can be reused as input
  [[ $BASH_VERSION ]] && { eval builtin "$method" "$file" "${args@Q}"; return $?; }

  if [[ ! $file.zwc -nt $file ]]; then
    # Use canonical pathname for zrecompile's happiness
    if [[ -r $file && -w ${file:h} ]]; then zcompile "${file:P}"; fi
  fi

  eval builtin "$method" "$file" "${(q)args[@]}"
}

function main () {
  local use_builtin=$1  # '.' or 'source'
  local num_args=$2     # Number of elements in calling shell's $@, which follow
  shift 2;
  local wrapper_args=("$@")
  wrapper_args=("${wrapper_args[@]:0:$num_args}")
  shift "$num_args"
  local file=$1; shift;

  # Now $@ is the arguments passed after the file to be soured
  if [[ $# -ge 1 ]]; then # arguments were passed
    use_args=("$@")
  else  # use $@ from the wrapper args
    use_args=("${wrapper_args[@]}")
  fi
  compile_then_source "$use_builtin" "$file" "${use_args[@]}"
}

main "$@"

unset -f main compile_then_source

관련 정보