2023-04-27 09:11:33
Для просмотра истории консольных команд в Linux есть соответствующая утилита
history. Помимо неё есть ещё одна —
fc. Я не знаю, кто и зачем её придумал. Функционал у неё довольно скромный и нет ничего такого, чего бы не умела history. Например, смотрим 5 последних команд:
# fc -l -5
# history 5
На самой fc я не буду подробно останавливаться, так как цель этой заметки не в ней. Я увидел эту команду и думаю, что это вообще такое. Захожу в Debian, пробую:
# man fc
No manual entry for fc
Пусто, нет информации. Ищу бинарник:
# which fc
Опять пусто. Думаю, наверное это алиас в виде обёртки над history.
# alias | grep fc
И тут тоже пусто. Соображаю, что это вообще такое. Начинаю вспоминать, как распознать тип команды в оболочке. И вспомнил:
# type fc
fc is a shell builtin
Всё встало на свои места. Утилита fc входит в состав оболочки bash, наряду с pwd, cd, и, кстати, той же history и type. Так что, если хотите быстро понять, с чем имеете дело, используйте утилиту type. Она помогает увидеть, чем является конкретная команда — алиасом, частью оболочки или отдельным бинарником.
И важное дополнение по теме, раз уж зашла речь о типах команд. Если у вас дублируется алиас, бинарник и встроенная в оболочку команда, то проверка на исполнение будет выполняться в следующем порядке.
Сначала проверяются алиасы.
Потом проверяются встроенные в оболочку команды.
И только потом ищутся бинарники, определённые в $PATH, причем не абы как, а по порядку следования этих директорий в переменной слева направо.
Последнее особенно важно, так как иногда не очень понятно, почему при наличии разных версий python или php, по умолчанию выполняется какая-то конкретная версия, хотя ты явно не указывал использовать именно её. Просто она первая попалась в $PATH.
Зная последовательность проверки команд, можно временно сломать какую-то команду. Например, сделать алиас history и назначить ему какое-то другое действие:
# alias history='echo "Здесь истории нет"'
# history
Здесь истории нет
Пока не удалишь созданный алиас, утилита history запускаться не будет, потому что алиас первый в списке на исполнение. А проверить всё это можно с помощью ключа -a:
# type -a history
history is aliased to `echo "Здесь истории нет"'
history is a shell builtin
#bash #terminal
5.5K views06:11