Решение
Это должно сделать трюк:
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]="...")