Синтаксис расширения Zsh

Я обманывал свою конфигурацию zsh и смущен на пару точек с синтаксисом расширения zsh. Многие из них основаны на вещах, которые я нашел на следующих ресурсах:

  • http://zsh.sourceforge.net/Doc/Release/Expansion.html
  • http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html
  • https://git.madduck.net/etc/zsh.git
  • https://github.com/aspiers/shell-env/
  • https://stackoverflow.com/questions/9901210/bash-source0-equivalent-in-zsh

конфигурация

Моя текущая конфигурация zsh выглядит так:

~/.config/zsh/rcsentry ~/.zshenv symlink -> ~/.config/zsh/rcsentry ~/.config/zsh/.zshenv symlink -> ~/.config/zsh/rcsentry ~/.config/zsh/.zshrc symlink -> ~/.config/zsh/rcsentry ~/.config/zsh/.zlogin symlink -> ~/.config/zsh/rcsentry ~/.config/zsh/.zprofile symlink -> ~/.config/zsh/rcsentry 

Мой rcsentry в настоящее время разделен до минимального состояния, в то время как я пытаюсь понять, как это работает. В настоящее время он содержит:

 if [[ -o rcs ]]; then rcs_fn="${(%):-%1N}" rcs_fp="${(%):-%N}" echo "rcs_fn: $rcs_fn" echo "rcs_fp: $rcs_fp" if [[ "$rcs_fn" == ".zshenv" ]]; then echo "initializing XDG environment variables ..." export XDG_CACHE_HOME="${XDG_CACHE_HOME:=$HOME/.cache}" export XDG_CONFIG_HOME="${XDG_CONFIG:=$HOME/.config}" export XDG_DATA_HOME="${XDG_DATA_HOME:=$HOME/.local/share}" echo "initializing ZSH environment variables ..." export ZDOTDIR="${ZDOTDIR:=$XDG_CONFIG_HOME/zsh}" fi unset rcs_fn unset rcs_fp fi 

При выполнении новой оболочки я получаю вывод, который я ожидал бы:

 rcs_fn: .zshenv rcs_fp: /Users/me/.zshenv initializing XDG environment variables ... initializing ZSH environment variables ... rcs_fn: .zshrc rcs_fp: /Users/me/.config/zsh/.zshrc rcs_fn: .zlogin rcs_fp: /Users/me/.config/zsh/.zlogin 

Документация и интерпретация

У меня есть пара вещей, в которых я смущен, но сейчас я пытаюсь ограничить это явным пониманием следующего:

Я начинаю с следующего синтаксиса:

 rcs_fn="${(%):-%1N}" 

Первоначально я не понимал, что это значит. Даже попытка ссылаться на документы, чтобы понять это, является сложной задачей. Я знаю, что он делает, но я пытаюсь понять, как понимать синтаксис. Итак, начиная с документов, я нашел следующее:

 If the opening brace is directly followed by an opening parenthesis, the string up to the matching closing parenthesis will be taken as a list of flags. -- `man zshexpn` -> PARAMETER EXPANSION -> Parameter Expansion Flags 

Я считаю, что это означает, что (%) – это список флагов, используемых в заявлении о расширении пареметра.

 % Expand all % escapes in the resulting words in the same way as in prompts (see EXPANSION OF PROMPT SEQUENCES in zshmisc(1)). If this flag is given twice, full prompt expansion is done on the resulting words, depending on the setting of the PROMPT_PERCENT, PROMPT_SUBST and PROMPT_BANG options. -- `man zshexpn` -> PARAMETER EXPANSION -> Parameter Expansion Flags 

Я считаю, что это означает, что (%) на самом деле является флажком расширения параметров, говорящим zsh, что весь оператор должен иметь все знаки%, расширенные, как обычно, в строке приглашения.

 %N The name of the script, sourced file, or shell function that zsh is currently executing, whichever was started most recently. If there is none, this is equivalent to the parameter $0. An integer may follow the `%' to specify a number of trailing path components to show; zero means the full path. A negative integer specifies leading components. -- `man zshmisc` -> SIMPLE PROMPT ESCAPES 

Учитывая предыдущие предположения, я считаю, что это означает, что %1N – это быстрое расширение, которое расширяется до имени файла, содержащего код, который в настоящее время выполняется zsh.

 ${name:-word} If name is set, or in the second form is non-null, then substitute its value; otherwise substitute word. In the second form name may be omitted, in which case word is always substituted. -- `man zshexpn` -> PARAMETER EXPANSION 

Я считаю, что это может указывать на то, что общий синтаксис выражения – это замена слова. Если это так, то я считаю, что значение имени пуст (единственное, что было раньше : были бы флаги расширения), и поэтому вторая часть %1N автоматически вставлена. Это кажется мне действительно странным, хотя я как-то интерпретирую синтаксис.

 7. Modifiers Any modifiers, as specified by a trailing `#', `%', `/' (possibly doubled) or by a set of modifiers of the form `:...' (see the section `Modifiers' in the section `History Expansion'), are applied to the words of the value at this level. -- `man zshexpn` -> PARAMETER EXPANSION -> Parameter Expansion Flags -> Rules After the optional word designator, you can add a sequence of one or more of the following modifiers, each pre ceded by a `:'. These modifiers also work on the result of filename generation and parameter expansion, except where noted. -- `man zshexpn` -> HISTORY EXPANSION -> Modifiers 

Я действительно не совсем уверен, как это интерпретировать, или если это вообще актуально. Похоже, что это указывает на то, что : указывает, что предыдущий (@) является модификатором слова и что трейлинг -%1N является либо синтаксисом генерации имени файла (для меня это не имеет смысла), либо синтаксисом расширения параметра (но опять-таки не " я имею в виду, я не вижу% N, указанного в разделе расширения параметров, только в разделе расширения подсказок).

Резюме

Основываясь на том, что я читал в документах, я думаю, что это ломается следующим образом:

 :- indicates a word expansion, with word section empty and substitution `%1N` (%) parameter expansion flag, indicating the expression should be expanded as if it were in prompt expansion %1N a prompt escape, which expands to the name of the file ${..} explicit parameter expansion, required for parameter expansion flag 

тестирование

Играя с этим, я думаю, что я как бы понял синтаксис. Мой обновленный файл rcsentry содержит следующее:

 if [[ -o rcs ]]; then # The name of the file containing currently code that is currently executing. rcs_fn="${(%):-%1N}" # The path of the file containing currently code that is currently executing. rcs_fp="${(%):-%N}" # The resolved path of the file containing currently code that is currently executing. rcs_x1="${${(%):-%N}:A}" # The resolved path of the parent directory of the file containing currently # code that is currently executing. rcs_x2="${${${(%):-%N}:A}:h}" if [[ "$rcs_fn" == ".zshenv" ]]; then # echo "initializing XDG environment variables ..." export XDG_CACHE_HOME="${XDG_CACHE_HOME:=$HOME/.cache}" export XDG_CONFIG_HOME="${XDG_CONFIG:=$HOME/.config}" export XDG_DATA_HOME="${XDG_DATA_HOME:=$HOME/.local/share}" # echo "initializing ZSH environment variables ..." export ZDOTDIR="${ZDOTDIR:=$XDG_CONFIG_HOME/zsh}" fi echo "rcs_fn: $rcs_fn" echo "rcs_fp: $rcs_fp" echo "rcs_x1: $rcs_x1" echo "rcs_x2: $rcs_x2" unset rcs_fn unset rcs_fp fi 

Ожидается выход:

 rcs_fn: .zshenv rcs_fp: /Users/me/.zshenv rcs_x1: /Users/me/.config/zsh/rcsentry rcs_x2: /Users/me/.config/zsh rcs_fn: .zshrc rcs_fp: /Users/me/.config/zsh/.zshrc rcs_x1: /Users/me/.config/zsh/rcsentry rcs_x2: /Users/me/.config/zsh rcs_fn: .zlogin rcs_fp: /Users/me/.config/zsh/.zlogin rcs_x1: /Users/me/.config/zsh/rcsentry rcs_x2: /Users/me/.config/zsh 

Итак, основываясь на этом, насколько я ошибаюсь?

One Solution collect form web for “Синтаксис расширения Zsh”

Да, ваша интерпретация верна (от снятия длинного вопроса).

Флаги расширения параметров применяются к разложениям параметров. Если вы хотите, чтобы он был применен к любой произвольной строке, вам нужно либо сохранить эту строку в переменной, как в:

 var=%1N filename=${(%)var} 

Или (как взломать) вы можете использовать расширение параметра ${var:-string} и оставить пустую часть var : ${(%):-%1N} . Это общий трюк (см., Например, 1 2 3 4 5 6 7 8 9 10 11 12 13 ), хотя это и делает довольно неразборчивый код. В качестве альтернативы вы можете использовать синтаксис ${param+string} и использовать параметр, который всегда задан как $- или $0 или $# ( ${(%)-+%1N} ). Тем не менее, это ни короче, ни разборчиво.

Здесь вы также можете использовать print -P %1N

  • stty: недопустимый целочисленный аргумент: «CCPP»
  • Отдельный путь для файлов .zcompdump
  • .zshrc и функция конфигурации
  • Что делает% \ / do (расширение командной строки zsh)?
  • Как отслеживать разбор и расширение параметров?
  • Есть ли встроенный (или, по крайней мере, простой) способ проверить наличие функции, доступной через $ FPATH?
  • Как это расширение параметра zsh работает?
  • В zsh, как я могу сбросить всю конфигурацию?
  • Что вызывает это поведение при определении функции с именем ':'
  • Как я могу использовать bindkey для запуска скрипта?
  • Zsh вложенная команда args $ SHLVL ошибка?
  • Linux и Unix - лучшая ОС в мире.