Решение
Это должно сделать трюк:
PS4='+%x:%I>' zsh -i -x -c '' |& grep subl
Это должно напечатать что-то вроде
+/Users/brandon/.zshrc.d/aliases.zsh:32>alias 'subl=/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl'
Это означает, что в файле /Users/brandon/.zshrc.d/aliases.zsh
(только для примера) в строке 32 псевдоним команды alias 'subl=/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl'
был выполнен. Обратите внимание, что показанная командная строка является результатом синтаксического анализа команды, записанной в файле, так как они могут не быть идентичными.
объяснение
Конфигурация zsh - это, по сути, список команд оболочки. Информация о том, откуда была выполнена команда, обычно доступна только в тот момент, когда она действительно выполняется. После завершения команды любые изменения в среде или настройках оболочки могут остаться, но информация о том, как произошли эти изменения, исчезла. Поэтому поиск файлов конфигурации или отслеживание информации во время выполнения - единственные варианты.
Поиск файлов конфигурации - как вы заметили - подвержен ошибкам, так как некоторые файлы конфигурации легко пропустить; zsh напрямую загружает до восьми различных файлов конфигурации при запуске интерактивной оболочки, и оттуда может быть получено любое количество дополнительных файлов.
Это где ЗШ в XTRACE
-x
вступает в игру. Аналогично VERBOSE
(-v
) XTRACE
печатает выполненные командные строки, но перед каждой строкой также выводится приглашение PS4
. PS4
может быть настроен для отображения файла и номера строки, выполняемой в данный момент (По умолчанию PS4
показывает имя файла функции или скрипта и номер текущей исполняемой строки. Таким образом, если строка кода находится внутри функции, она не сразу покажет, где она определена.).
Подробно вышеприведенная команда выполняет следующие действия:
Задайте для переменной среды PS4
значение +%x:%I>
(только для этой команды). %x
заменяется именем файла, содержащего исходный код, выполняемый в данный момент. %I
- номер строки этого кода в файле. +
и >
являются украшением, чтобы отличить вывод XTRACE
от любого вывода, который может генерировать скрипт
Примечание. Это может работать некорректно, если для PS4
задано другое значение в конфигурации. Если выходные данные не имеют желаемого формата, может потребоваться сначала удалить / закомментировать настройки PS4
или PROMPT4
.
zsh
начинает зш
- с включенным интерактивным режимом (
-i
)
- с включенным
XTRACE
(-x
)
- и просто запускает пустую командную строку (
-c ''
), немедленно выходя после этого.
Это означает, что запускаются только файлы инициализации для интерактивного режима, и нет помех от генерации приглашений или команд подключения.
|&
- это сокращение от 2>&1 |
, который соединяет стандартный вывод и стандартную ошибку одной команды со стандартным вводом следующей.
grep subl
ищет "subl". Я предлагаю искать только имя псевдонима, поскольку точная командная строка не может быть alias subl="..."
из-за синтаксического анализа. (В zsh вы даже можете определить псевдоним, не используя команду alias
, назначив пары ключ-значение в aliases
ассоциативного массива: aliases[subl]="..."
)