$ {BASH_SOURCE [0]} эквивалент в zsh? - PullRequest
47 голосов
/ 28 марта 2012

Название должно сказать все это.Я ищу эквивалент ${BASH_SOURCE[0]} в zsh.

Примечание: Я продолжаю находить "$0 эквивалентно ${BASH_SOURCE[0]}" в Интернете, но, похоже, этобыть ложным: $0 кажется именем исполняемой команды.(Это argv[0], что имеет смысл.) Повторение $ 0 в моем скрипте (.zshrc) дает zsh для $0, что не то же самое, что ${BASH_SOURCE[0]}.Фактически, ${BASH_SOURCE[0]}, кажется, работает в zsh, за исключением внутренних файлов .zshrc.

Что я действительно делаю в своих .zshrc (это не работает):

echo ${BASH_SOURCE[0]}
source `dirname $0`/common-shell-rc.sh

Сбой источника ($0 равен zsh) и echo выводит пустую строку.

Редактировать: по-видимому, для $0 для работы мне нужно установить опцию FUNCTION_ARGZERO.Любой способ проверить, установлено ли это в сценарии?(чтобы я мог его временно установить) По-видимому, он включен, если вы не установили nofunction_argzero, и он включен в моей оболочке.Все равно ничего не получите за $0.(Я думаю, что б / с я не в функции.)

Ответы [ 6 ]

38 голосов
/ 24 апреля 2014

${BASH_SOURCE[0]} эквивалент в zsh равен ${(%):-%N}, НЕ $0 (как сказал OP, последний не удалось в .zshrc)

Здесь % указывает быстрое расширение значения, %N указывает «Имя скрипта, файл источника, или функция оболочки, которую в настоящий момент выполняет zsh,

, что было начато совсем недавно. Если его нет, это эквивалентно параметру $ 0. "(Из man zshmisc)

25 голосов
/ 05 февраля 2015

${(%):-%x} является ближайшим zsh эквивалентом bash '$BASH_SOURCEksh' ${.sh.file}) - не $0 .

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

Возвращает (потенциально относительный) путь вмещающего сценария ,

  • независимо от того, источник или нет.
    • в частности, он также работает внутри файлов инициализации / профилей, таких как ~/.zshrc (в отличие от $0, который необъяснимым образом возвращает путь shell там).
  • независимо от того, была ли вызвана изнутри функция , определенная в скрипте, или нет (в отличие от $0, которая возвращает имя function внутри функции).

Единственное отличие от $BASH_SOURCE, которое я обнаружил, заключается в следующем неясном сценарии - который может даже быть ошибкой (наблюдается в zsh 5.0.5): внутри функции , вложенной в другую функцию в исходном скрипте , ${(%):-%x} не не возвращает путь включающего сценария, когда эта вложенная функция вызывается (снова) позже , после получения (ничего не возвращает или ' ЗШ ').


Справочная информация on ${(%):-%x}:

  • (%):- вместо имени переменной в расширении параметра (переменной) (${...}) делает доступными escape-последовательности, которые обычно используются для представления информации об окружающей среде в prompt строках, например используется в переменной PS1 для определения строки, отображаемой в качестве основного интерактивного приглашения.

    • % является экземпляром флага расширения параметра, все они перечислены в man zshexpn под заголовком Parameter Expansion Flags.
  • %x - это одна из escape-последовательностей, которая может использоваться в строках подсказок, и она функционирует, как описано выше; Есть еще много, например, %d для представления текущего каталога.

    • man zshmisc перечисляет все доступные последовательности под заголовком SIMPLE PROMPT ESCAPES.
10 голосов
/ 21 октября 2014

Если вы делаете символическую ссылку на .zshrc в каталоге dotfiles и хотите сослаться на другие файлы в каталоге, попробуйте следующее:

SOURCE=${(%):-%N}
while [ -h "$SOURCE" ]; do
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DOTFILES_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

(я получил скрипт цикла от здесь .)

10 голосов
/ 29 марта 2012

$0 правильно. В исходном сценарии это имя сценария, так как оно было передано во встроенный . или source (поэтому, если установлена ​​опция path_dirs, вам может потребоваться выполнить поиск $path найти реальное местоположение скрипта).

.zshrc не получен, что объясняет, почему $0 не установлено на .zshrc. Вы все равно знаете имя и местоположение файла: это ${ZDOTDIR-~}/.zshrc.

2 голосов
/ 27 августа 2013

Может быть, вы ищете $_?

# foo.sh
source foo2.sh

и

# foo2.sh
echo $_

выходы

# ./foo.sh
foo2.sh
1 голос
/ 19 февраля 2019

Если вы хотите сделать ваш скрипт совместимым с bash и zsh, вы можете использовать ${BASH_SOURCE[0]:-${(%):-%x}}.Полученное значение будет взято из BASH_SOURCE[0], когда оно определено, и ${(%):-%x}}, если BASH_SOURCE[0] не определено.

...