Как Вы указываете формат для входа до настоящего времени?

В zsh функциональный путь поиска ($fpath) определяет ряд каталогов, которые содержат файлы, которые могут быть отмечены, чтобы быть загруженными автоматически, когда функция, которую они содержат, необходима впервые.

Zsh имеет два режима файлов с автозагрузкой: собственный путь Zsh и другой режим, который напоминает автозагрузку ksh. Последний активен, если опция KSH_AUTOLOAD установлена. Режим работы в собственной системе команд Zsh является значением по умолчанию, и я не буду обсуждать другой путь здесь (см. "человека zshmisc" и "человека zshoptions" для получения дополнительной информации об автозагрузке ksh-стиля).

Хорошо. Скажите, что Вы получили каталог '~/.zfunc', и Вы хотите, чтобы он был частью функционального пути поиска, Вы делаете это:

fpath=( ~/.zfunc "${fpath[@]}" )

Это добавляет Ваш частный каталог к передней стороне пути поиска. Это важно, если Вы хотите переопределить функции от установки zsh с Вашим собственным (как, когда Вы хотите использовать обновленную функцию завершения, такую как '_git' из репозитория CVS zsh с более старой установленной версией оболочки).

Это также стоит отметить, что каталоги от '$fpath' не ищутся рекурсивно. Если Вы хотите, чтобы Ваш частный каталог искался рекурсивно, необходимо будет заботиться об этом сами, как это (следующий отрывок требует, чтобы опция 'EXTENDED_GLOB' была установлена):

fpath=(
    ~/.zfuncs
    ~/.zfuncs/**/*~*/(CVS)#(/N)
    "${fpath[@]}"
)

Это может выглядеть загадочным к нетренированному глазу, но это действительно просто добавляет все каталоги ниже '~/.zfunc' к '$fpath' при игнорировании каталогов под названием "CVS" (который полезен, если Вы планируете на контроль целое функциональное дерево от CVS zsh в Ваш частный путь поиска).

Давайте предположим, что Вы получили файл '~/.zfunc/hello', который содержит следующую строку:

printf 'Hello world.\n'

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

autoload -Uz hello

"О чем-Uz?", Вы спрашиваете? Ну, это - просто ряд опций, которые заставят 'автозагрузку' делать правильную вещь, какие опции устанавливаются иначе. 'U' отключает расширение псевдонима, в то время как функция загружается и автозагрузка zsh-стиля сил 'z', даже если 'KSH_AUTOLOAD' установлен по любой причине.

После этого заботился о, можно использовать новое, 'привет' функционируйте:

zsh% hello
Hello world.

Слово об определении источника этих файлов: это просто неправильно. При определении источника этого '~/.zfunc/hello' файл он просто распечатал бы "Привет мир". однажды. Ничто больше. Никакая функция не будет определена. И кроме того, идея состоит в том, чтобы только загрузить код функции, когда это требуется. После вызова 'автозагрузки' не прочитано определение функции. Функция просто отмечена, чтобы быть автоматически загруженной позже по мере необходимости.

И наконец, примечание о $FPATH и $fpath: Zsh поддерживает тех как связанные параметры. Параметр нижнего регистра является массивом. Прописная версия является строковым скаляром, который содержит записи от связанного массива, к которому присоединяются двоеточия, промежуточные записи. Это сделано, потому что обработка списка скаляров является путем более естественные массивы использования, также поддерживая назад совместимость для кода, который использует скалярный параметр. Если Вы принимаете решение использовать $FPATH (скалярный), необходимо быть осторожными:

FPATH=~/.zfunc:$FPATH

будет работать, в то время как следующее не будет:

FPATH="~/.zfunc:$FPATH"

Причина состоит в том, что расширение тильды не выполняется в двойных кавычках. Это вероятно источник Ваших проблем. Если echo $FPATH печатает тильду, и не разобранный контур затем она не будет работать. Для сейфа я использовал бы $HOME вместо тильды как это:

FPATH="$HOME/.zfunc:$FPATH"

Однако я очень использовал бы параметр массива как, я сделал наверху этого объяснения.

Вы также не должны экспортировать параметр $FPATH. Это только необходимо текущему процессу оболочки а не любому из его детей.

Обновление

Относительно содержания файлов в '$fpath':

С автозагрузкой zsh-стиля содержание файла является телом функции, которую это определяет. Таким образом файл, названный "привет" содержащий строку echo "Hello world." полностью определяет функцию, вызванную "привет". Вы свободны поместить hello () { ... } вокруг кода, но это было бы лишним.

Заявление, что один файл может только содержать одну функцию, не совсем корректно, все же.

Особенно при рассмотрении некоторых функций от основанной на функции системы завершения (compsys), Вы быстро поймете, что это - неправильное представление. Вы свободны определить дополнительные функции в функциональном файле. Вы также свободны сделать любой вид инициализации, которую Вы, возможно, должны сделать в первый раз, когда функция вызвана. Однако, когда Вы делаете Вы будете всегда определять функцию, которую называют как файл в файле, и вызовите ту функцию в конце файла, таким образом, это выполняется в первый раз, когда на функцию ссылаются.

Если бы - с подфункциями - Вы не определили функцию, названную как файл в файле, то Вы закончили бы с той функцией, имеющей функциональные определения в нем (а именно, те из подфункций в файле). Вы эффективно определили бы все свои подфункции каждый раз, когда Вы вызываете функцию, которую называют как файл. Обычно, это не то, что Вы хотите, таким образом, Вы переопределили бы функцию, это называют как файл в файле.

Я буду включать короткий скелет, который даст Вам общее представление о том, как это работает:

# Let's again assume that these are the contents of a file called "hello".

# You may run arbitrary code in here, that will run the first time the
# function is referenced. Commonly, that is initialisation code. For example
# the `_tmux' completion function does exactly that.
echo initialising...

# You may also define additional functions in here. Note, that these
# functions are visible in global scope, so it is paramount to take
# care when you're naming these so you do not shadow existing commands or
# redefine existing functions.
hello_helper_one () {
    printf 'Hello'
}

hello_helper_two () {
    printf 'world.'
}

# Now you should redefine the "hello" function (which currently contains
# all the code from the file) to something that covers its actual
# functionality. After that, the two helper functions along with the core
# function will be defined and visible in global scope.
hello () {
    printf '%s %s\n' "$(hello_helper_one)" "$(hello_helper_two)"
}

# Finally run the redefined function with the same arguments as the current
# run. If this is left out, the functionality implemented by the newly
# defined "hello" function is not executed upon its first call. So:
hello "$@"

При выполнении этого глупого примера первый показ был бы похож на это:

zsh% hello
initialising...
Hello world.

И последующие вызовы будут похожи на это:

zsh% hello
Hello World.

Я надеюсь, что это разрешает вещи.

(Одним из более сложных реальных примеров, который использует все те приемы, является уже упомянутая функция '_tmux' от основанной на функции системы завершения zsh.)

19
27.11.2012, 00:08
2 ответа

Ни POSIX, ни дата GNU не имеют --magic-option. FreeBSD называет его -f (с синтаксисом, подобным dateспецификаторы выходного формата, не тот Вы делаете предложение).

Ваша дата очень близко к тому, чтобы быть распознанным датой GNU: все это, взятия заменяют двоеточие, которое разделяет дату со времени пространством.

date -d "$(echo "09SEP2012:23:58:46" | sed 's/:/ /')"
10
27.01.2020, 19:45
  • 1
    и с пользовательскими форматами? Только способом пойти являются регулярные выражения? это - ужасный :-( –  phil294 22.12.2017, 21:39
  • 2
    Вы не можете проанализировать даты, не зная что-то о формате, они находятся в, классическое пример быть 01/02/03. –  Gilles 'SO- stop being evil' 22.12.2017, 21:50

Я записал набор инструментов (dateutils) что соглашение с датами и временем более благоприятным для сценария способом. Ваша волшебная опция там --input-format|-i, например:

dconv -i '%d%b%Y:%H:%M:%S' "09SEP2012:23:58:46"
=>
  2012-09-09T23:58:46

В то время как dconv непосредственно не поддерживает dateвыходной формат (это не совещается TZ или что-либо в среде), существует инструмент strptime в dateutils, который действительно поддерживает %Z спецификатор формата.

5
27.01.2020, 19:45

Теги

Похожие вопросы