Как протестировать на возможные конфликты при использовании псевдонима в bashrc?

Это должно быть подходящей заменой:

grep -l foo * | sed -e 's/[^/0-9A-Z_a-z]/\\&/g' | xargs sed -i 's/foo/bar/g'

12
18.10.2012, 09:45
5 ответов

Для обнаружения, какие команды маскируются псевдонимами сделайте что-то вроде этого:

alias | sed 's/^[^ ]* *\|=.*$//g' | while read a; do
  printf "%20.20s : %s\n" $a "$(type -ta $a | tr '\n' ' ')"
done | awk -F: '$2 ~ /file/'

Объяснение

alias один списки определили псевдонимы и sed извлекает их имя. Выполнения цикла с условием продолжения type -ta на каждом из них и awk печатает строки, что и содержите псевдоним и файл.

8
27.01.2020, 19:54

Можно использовать type узнать, как команда была бы интерпретирована ударом.

15
27.01.2020, 19:54
  • 1
    Например, type ls печать ls is aliased to `ls --color=auto' здесь. –  l0b0 18.10.2012, 12:08
  • 2
    То же действительно работает с which, но я не делаю теперь, если оба (тип, который) окружают builtins, то же. –  math 17.12.2012, 09:16
  • 3
    @math: type which говорит Вам which is /usr/bin/which, таким образом, это не встроенное. Поэтому это не может сказать Вам, является ли что-то встроенным или не (например. which echo по сравнению с type echo). –  choroba 17.12.2012, 10:21
  • 4
    я предполагаю это, зависит от оболочки, которую Вы используете: type which which is a shell builtin Я использую zsh. –  math 17.12.2012, 10:38
  • 5
    @math: исходный вопрос отмечен удар/. –  choroba 18.12.2012, 14:58

Как Ваш первый вопрос, нет никакого способа перечислить конфликты, начиная с использования удара хеш-таблица внутренне, это только записывает последнее переопределение.

Чтобы узнать, является ли команда псевдонимом, использовать alias ls в Вашем случае, если это говорит Вам что-то как "не найденный" затем, это не псевдоним, иначе это.

Для запуска исходной функции, игнорируя псевдоним снабдите префиксом наклонную черту, например, \ls запустится реальное хешировало ls, проигнорируйте псевдоним.

Править

Если Вы хотите знать быстро, если команда является псевдонимом, Вы могли бы включить режим отладки set -x, теперь, если Вы выполняетесь ls:

enter image description here

Вы будете видеть вывод отладки реальной выполняемой команды

Для сбрасывания режима отладки использовать set -

7
27.01.2020, 19:54
  • 1
    Спасибо. Но не добирался alias часть. Что, если пользователь не знает, что там существует команда (например. ls)? Только вещь он, кажется, знает после выполнения alias ls то, что является отображенным на и не, с чем это было первоначально отображено. Я предполагаю, что нужно будет выполнить все команды с и без \для нахождения конфликтов. –  user13107 18.10.2012, 09:31
  • 2
    @user13107 обновил ответ –  daisy 18.10.2012, 09:47
  • 3
    Спасибо. Как я сбрасываю трассировку? –  user13107 18.10.2012, 09:53
  • 4
    @user13107 обновляется снова;-P –  daisy 18.10.2012, 09:57
  • 5
    "нет никакого способа перечислить конфликты" - Вы являетесь просто не достаточно образными. –  camh 18.10.2012, 13:17

Можно использовать встроенный удар compgen получить список всей команды и всего использования псевдонимов compgen -ac. Любая команда, которая является также псевдонимом, будет дублирована в этом списке, таким образом, простое наивное решение будет состоять в том, чтобы искать дубликаты в выводе compgen -ac.

Однако дубликаты могут также появиться, если команда находится на пути дважды. Например, я имею /bin/which и /usr/bin/which так compgen -ac перечислит which дважды даже при том, что это не псевдоним.

Таким образом, то, что необходимо, должно получить все дубликаты от compgen -ac и сравните это со списком псевдонимов. Только дубликаты, которые являются также псевдонимами, являются теми псевдонимами, которые скрывают команды. Мы можем сделать это с comm(1) команда и с ударом обрабатывает замену.

comm -12 <(compgen -a | sort) <(compgen -ac | sort | uniq -d) 

compgen -a | sort список всех псевдонимов (отсортированный для comm). compgen -ac | sort | uniq -d список всех дубликатов из списка команд и псевдонимов. comm -12 выводы только те строки, которые характерны для обоих.

6
27.01.2020, 19:54

Можно использовать функцию отладки оболочки для наблюдения точно, что происходит, когда удар вызывает интерактивную оболочку. Следующее должно показать Вам всем псевдонимы, которые присвоены, когда интерактивная оболочка порождена от оболочки входа в систему:

bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
  • -x -> позволяют отладить
  • -l -> входят в оболочку
  • -i -> интерактивная оболочка
  • -c -> команда

Выполнение выхода команды требуется так, чтобы оболочка возвратилась. -i требуется в этом случае, потому что удар не настроил бы интерактивную среду для выполнения команды иначе.

Вот пример от моей системы:

$ bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
++ alias 'ls=ls --color=auto'
$ alias -p
alias ls='ls --color=auto'

Для наблюдения, какой файл был в последний раз получен, когда псевдониму присвоили определить файл, он произошел, можно расширить grep:

bash -x -l -i -c 'exit' 2>&1 | grep -E ' (alias|[.]|source) '

Это может возвратить ложные положительные стороны, но должно быть прекрасным при ручном осмотре возвращенного данные. Количество '+' символы перед выполняемой командой указывает на глубину.

+ . /home/jordan/.bashrc
++ alias 'ls=ls --color=auto'
++ . /home/jordan/.foo
+++ alias t=test
++ alias t=test2

В этом демонстрационном выводе это показывает, что .bashrc устанавливает псевдоним для ls. псевдонимы нечто t, и затем .bashrc переопределяет предыдущий псевдоним t.

5
27.01.2020, 19:54
  • 1
    Спасибо. Это, конечно, полезно, но не в состоянии видеть, как это находит псевдонимы создания конфликта. –  user13107 18.10.2012, 09:55
  • 2
    @user13107 я добавил еще некоторые детали, которые должны быть полезными. Установка псевдонима к новому значению не является "конфликтующим" псевдонимом. Это - нормальное зарегистрированное поведение, которое является, почему необходим окольный путь. –  jordanm 18.10.2012, 09:57

Теги

Похожие вопросы