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