2

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

$ type -a subl

subl is an alias for /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl
subl is /Users/brandon/bin/subl

Я хочу знать , где определено, что псевдоним, а не то, что она определяется как, или где он указывает. Другими словами: если я хочу изменить его, на какой файл и номер строки перейти. Я искал мой .zshrc и каталоги, в которых я храню файлы, которые он получает, и ничего не нашел 1. Как я могу найти это без необходимости искать вручную?


1. В конце концов я нашел его, запустив zsh -v и выполнив поиск subl , а затем читая вверх, пока не нашел строку, начинающуюся с source . Тем не менее, я хотел бы не ручной способ сделать это в будущем.

1 ответ1

6

Решение

Это должно сделать трюк:

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]="...")

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .