Есть ли простой способ перечислить все конфликты команд, которые произошли в системе из-за обновления bashrc с использованием команд псевдонимов?
Например, кто-то пишет alias ls=/path/to/user-generated/executable
в bashrc. Как узнать, что это маскирует действительную команду ( ls
). Один из способов, по-видимому, состоит в том, чтобы запустить все псевдонимы до и после получения bashrc и отразить вывод. Есть ли лучшие способы?
Я использую Ubuntu 12.04.
Баш - версия
GNU bash, версия 4.2.24 (1) -релиз (i686-pc-linux-gnu)
Ответы:
Чтобы узнать, какие команды маскируются псевдонимами, сделайте что-то вроде этого:
объяснение
alias
в одиночку перечисляются определенные псевдонимы иsed
извлекается их имя. Цикл while выполняетсяtype -ta
для каждого из них иawk
печатает строки, которые содержат псевдоним и файл.источник
Вы можете использовать,
type
чтобы узнать, как команда будет интерпретироваться bash.источник
type ls
печатаетls is aliased to `ls --color=auto'
здесь.which
, но я не теперь, если обе (тип, который) встроенные оболочки одинаковы.type which
говорит вамwhich is /usr/bin/which
, так что это не встроенный. Следовательно, он не может сказать вам, является ли что-то встроенным или нет (например,which echo
противtype echo
).type which
which is a shell builtin
я использую zsh.В качестве первого вопроса нет способа перечислить конфликты, поскольку bash использует внутреннюю хеш-таблицу, она записывает только последнее переопределение.
Чтобы выяснить, является ли команда псевдонимом, используйте
alias ls
в вашем случае, если она говорит что-то вроде «not found», то это не псевдоним, в противном случае это так.Чтобы запустить исходную функцию без учета псевдонима, добавьте префикс косой черты, например
\ls
, запустите реальный хэшированный ls, игнорируйте псевдоним.РЕДАКТИРОВАТЬ
Если вы хотите быстро узнать, является ли команда псевдонимом, вы можете включить режим отладки
set -x
, теперь, если вы выполнитеls
:Вы увидите отладочный вывод выполняемой команды
Чтобы отключить режим отладки, используйте
set -
источник
alias
роль. Что если пользователь не знает, что существует команда (напримерls
)? Единственное, что он, кажется, знает после запуска,alias ls
это то, на что он сопоставлен, а не то, с чем он был изначально сопоставлен. Я думаю, что нужно будет выполнить все команды с и без \, чтобы найти конфликты.Вы можете использовать встроенную команду bash,
compgen
чтобы получить список всех используемых команд и псевдонимовcompgen -ac
. Любая команда, которая также является псевдонимом, будет дублирована в этом списке, поэтому простым наивным решением является поиск дубликатов в выходных данныхcompgen -ac
.Однако дубликаты также могут появляться, если команда находится в пути дважды. Например, я
/bin/which
и/usr/bin/which
такcompgen -ac
буду перечислятьwhich
дважды, хотя это не псевдоним.Поэтому необходимо получить все дубликаты
compgen -ac
и сравнить их со списком псевдонимов. Только дубликаты, которые также являются псевдонимами, являются теми псевдонимами, которые скрывают команды. Мы можем сделать это с помощьюcomm(1)
команды и подстановки процесса bash.compgen -a | sort
список всех псевдонимов (отсортировано поcomm
)compgen -ac | sort | uniq -d
список всех дубликатов из списка команд и псевдонимов.comm -12
выводит только те строки, которые являются общими для обоих.источник
Вы можете использовать функцию отладки оболочки, чтобы точно видеть, что происходит, когда bash вызывает интерактивную оболочку. Следующее должно показать вам все псевдонимы, которые назначаются при создании интерактивной оболочки из оболочки входа в систему:
-x
-> включить отладку-l
-> оболочка входа-i
-> интерактивная оболочка-c
-> командаВыполнение команды exit необходимо для возврата оболочки. В
-i
этом случае требуется, потому что bash не установил бы интерактивную среду для запуска команды в противном случае.Вот пример из моей системы:
Чтобы увидеть, какой файл был получен в последний раз, когда псевдоним был назначен для определения файла, в котором он возник, вы можете расширить grep:
Это может вернуть ложные срабатывания, но должно быть хорошо, если вы вручную проверяете возвращенные данные. Количество символов «+» перед выполненной командой указывает глубину.
В этом примере вывода показано, что .bashrc устанавливает псевдоним для
ls
.foo aliast
, а затем .bashrc переопределяет предыдущий псевдонимt
.источник