Чи можна перевірити, де визначено псевдонім?


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 у своїй відповіді) .


Спасибі! Незважаючи на те, що вихід трохи важко проаналізувати, але я знайшов файл, який визначав псевдонім, який я шукав. Якщо псевдонім ніде у цьому списку немає, чи можна було б припустити, що псевдонім визначений вручну?
полем

@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 Змінна
асоціативна масива, члени якої відповідають внутрішньому списку псевдонімів, що підтримується вбудованим псевдонімом. Елементи, додані до цього масиву, відображаються у списку псевдонімів


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.


Або файли, включені звідти…
Jeff Schaller

@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, який має шанс запускати (зовнішню) програму GNU, але подавати дані про псевдонім оболонки, інакше не . Більш важливо, що він говорить лише про те, для чого встановлений псевдонім, а не там, де він був встановлений, яким був Q.
dave_thompson_085


-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.