Intereting Posts
Занятое устройство на Umount Могу ли я сделать pacman осведомленным о пакетах, установленных вручную? / proc / PID / fd / X номер ссылки Как установить X11 в мою собственную систему Linux Buildroot? Удаляет ли rsync файлы в месте назначения, которые были удалены со стороны отправки? opendir и readdir кодирующие строки за моей спиной? mutt: как классифицировать входящие письма Зачем мне нужна двойная тире до того, как аргумент передан sh на xargs -I, чтобы он работал правильно? Почему rm * (1) * удаляет все файлы в каталоге? Рекурсивно найти и заменить содержимое одного файла, используя ключ из другого файла По умолчанию fedora 15 install, как вы можете подключиться к сетевому диску после входа в систему? Prepackage Arch Linux (ARM) с пакетами перед установкой Alias ​​команда, которая находится за SSH jumpbox i3wm: как заставить несколько мониторов переключаться между рабочими областями в одной привязке Проверьте последний использованный файл .sh.

Автоматически использовать `.zwc` версию` source`d файла

Я сталкивался с файлами *.zwc , которые я считаю файлами Word-кода Z-оболочки или скомпилированным скриптом zsh .

Когда source произвольного файла, есть ли способ получить zsh :

  • Используйте файл .zwc если он существует и новее, чем файл
  • Иначе, скомпилируйте файл в Z-shell Word Code, а затем source его

Если у меня есть файл, содержащий только функции, отличается ли ответ?

Похоже, не так много учебников по Z-shell Word Code, так что не стесняйтесь указывать мне на них.

По крайней мере, для использования файлов .zwc вам не нужно ничего делать. Как раздел на . команда в справочной странице Zsh гласит:

[…] Если найден файл с именем ‘ file .zwc ‘, он новее, чем файл , и является скомпилированной формой (созданной с zcompile встроенного в zcompile ) файла , то команды считываются из этого файла, а не из файла .

То же самое верно для source , так же, как и . кроме порядка поиска.


Автоматическая компиляция любых исходных скриптов может быть выполнена путем создания функций-оболочек. Например:

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

Конечно, поскольку эти обертки очень просты и могут нуждаться в некотором дополнительном сбое. Например, если каталог, в котором находится исходный файл, недоступен для записи. Кроме того, компиляция может завершиться неудачей, даже если в исходном файле нет синтаксических ошибок.

Основываясь на ответе Адафона , я написал полную замену как source и 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