Можно ли проверить, где был определен псевдоним?

24

Псевдоним, такой как llопределен aliasкомандой.

Я могу проверить команду с такими вещами, как, например, type llпечать

ll is aliased to `ls -l --color=auto'

или command -v llкакие отпечатки

alias ll='ls -l --color=auto'

или alias llкоторый также печатает

alias ll='ls -l --color=auto'

но я не могу найти, где был определен псевдоним, то есть файл, например .bashrc, или, возможно, вручную в работающей оболочке. На данный момент я не уверен, возможно ли это вообще.

Должен ли я просто просмотреть все файлы, которые загружены bashи проверить каждый из них?

Полемон
источник
Я бы сказал, беги от bash -xl
руки

Ответы:

21

Ручное определение будет трудно определить (возможно, журналы истории), хотя попросить оболочку показать, что он делает, и затем grepдолжно помочь найти те, которые установлены в файле rc:

bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...

Если оболочка точно не захватывает необходимые параметры одним из приведенных выше вызовов (которые в интерактивном режиме запускают команду null), то script:

script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep

Другой вариант - использовать что-то вроде straceили sysdigнайти все файлы, к которым прикасается оболочка, а затем перейти на grepних вручную (удобно, если у оболочки или программы нет -xфлага); стандартных RC-файлов недостаточно для ручной проверки имени файла, если что-то вроде oh-my-zsh или конфигураций, специфичных для конкретного сайта, извлекает код из того, кто знает, где (или также могут быть переменные окружения, как указывает sorontar в своем ответе) ,

thrig
источник
Благодарность! Несмотря на то, что выходные данные немного сложно проанализировать, но я нашел файл, который определил псевдоним, который я искал. Когда псевдоним отсутствует в этом списке, можно ли предположить, что псевдоним был определен вручную?
Полемон
@polemon довольно безопасно; это может быть (или было) определено в файле, который не читается из-за того, кто знает, что является причиной или было удалено (особенно, если есть какая-то оболочка, добавляющая сложность, которую пользователь не делает Понимаю).
августа
1
Чтобы было легче найти точку, в которой определен псевдоним, вы можете использовать PS4, который добавляется перед каждой строкой в ​​трассировке:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Марк Плотник,
5

Вот где я нахожу grep -rlочень полезным:

grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc

скажет вам, в каком файле слово aliasиспользуется.

Вероятно, в ~/.bashrcи, безусловно, в том, ~/.bash_aliasesесли он существует.


Однако невозможно быть абсолютно уверенным, что это охватывает все варианты. Эти файлы могут также вызывать или загружать любые другие файлы. Переменная окружения, такая как ENV или $BASH_ENVможет направлять bash для загрузки некоторых других файлов.

ищет переменную BASH_ENV в среде, расширяет ее значение, если оно там появляется, и использует расширенное значение в качестве имени файла для чтения и выполнения.

И псевдонимы могут быть даже определены путем установки переменной (выделено мое):

BASH_ALIASES Переменная
ассоциативного массива, члены которой соответствуют внутреннему списку псевдонимов, который поддерживается встроенным псевдонимом. Элементы, добавленные в этот массив, отображаются в списке псевдонимов.

sorontar
источник
grep -rl alias ~/.bash*может ошибочно соответствовать файлам истории, но +1 за указание на массив BASH_ALIASES!
Джефф Шаллер
2

Я не знаю, как на самом деле перечислить источник ваших псевдонимов, но так как похоже, что вы используете bash, я думаю, что это возможные исходные файлы:

/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc

Вы должны быть в состоянии пройти через них, чтобы найти псевдоним, например grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.

edaemon
источник
Или файлы, включенные оттуда ...
Джефф Шаллер
@JeffSchaller - Точно, для этого вам понадобится что-то более сложное bash -x, как вы упомянули. Я полагал, что вышеприведенное было достаточно просто для быстрого запуска, и если он не находит псевдоним, вы можете прочитать шаги выполнения.
edaemon
1

Комбинируя ответ thrig в с @ предложением MarkPlotnick в , вы можете проверить , является ли BASH_ALIASES[ll]установлен сужать его вниз. BASH_SOURCEМассив и LINENOпеременные здесь особенно полезны. К сожалению, проверка того BASH_ALIASES[ll], установлен ли параметр, будет успешной только после того, как псевдоним был установлен, и поэтому первая такая строка может быть в другом файле.

PS4='${BASH_ALIASES["ll"]+"The ll alias has been defined before"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |&
  grep 'll alias' -m1 -B1

Давать вывод как:

   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
TThe ll alias has been defined before /home/muru/.bashrc:116 alias 'ping=ping -c5'

Вы даже можете завершить оболочку, используя эту проверку:

$ PS4='${BASH_ALIASES["ll"]+"$(kill -9 $$)"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |& tail -n1
   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
Мур
источник
0

Я имел успех, просто используя which.

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py
Чарльз Клейтон
источник
1
whichможет обрабатывать псевдонимы в tcsh (и, возможно, в более ранних версиях csh) и zsh, где он является встроенным, и в bash, используя профиль по умолчанию в семействе RedHat, в котором есть kludge для запуска (внешней) программы GNU, но передают данные псевдонима оболочки, в противном случае нет , Более важно то, что он говорит только о том, какой псевдоним установлен, а не о том, где он был установлен, как это было здесь.
dave_thompson_085
-1

Проверьте ~ / .profile, если его нет в ~ / .bashrc

Майкл Татум
источник
Или файлы, включенные оттуда ...
Джефф Шаллер
-1

Наконец, я нашел llопределение псевдонима для нашего веб-сервера (CentOS) в двух сценариях оболочки /etc/profile.d/:

  • /etc/profile.d/colorls.csh
  • /etc/profile.d/colorls.sh

Я нашел его первым обучение из комментариев выше , где общесистемного профиль был: /etc/profile. В этом файле говорится, что псевдонимы для всей системы определены /etc/bashrc, и в этом файле я увидел, что он просматривает несколько сценариев оболочки /etc/profile.d/, поэтому я использовал grepэтот каталог и, наконец, нашел определения. Я также обнаружил, что есть l.псевдоним, в котором перечислены все файлы точек:

От colorls.sh:

alias ll='ls -l --color=auto' 2>/dev/null
alias l.='ls -d .* --color=auto' 2>/dev/null
alias ls='ls --color=auto' 2>/dev/null

(Есть эквивалентные псевдонимы в colorls.csh.)

Джордан Брэдфорд
источник
-1

Сначала используйте следующие команды

Список всех функций

functions 

Список всех псевдонимов

alias 

Если вы не можете найти псевдоним или функцию, используйте более агрессивный метод поиска.

Bash версия

bash -ixlc : 2>&1 | grep thingToSearchHere

Zsh версия

zsh -ixc : 2>&1 | grep thingToSearchHere

Краткое объяснение опций

-i     Force shell to be interactive.

-c     Take the first argument as a command to execute

-x      -- equivalent to --xtrace

-l      Make bash act as if invoked as a login shell
jasonleonhard
источник