*.zwc
Z-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