Ctrl + R и fc позволяют за считанные секунды находить, вызывать и редактировать любую команду из истории bash, и вот как с помощью истории bash и уже имеющихся у вас сочетаний клавиш в терминале избавиться от необходимости заново вводить одни и те же длинные команды.
Большинство пользователей Linux знают, что их оболочка сохраняет историю команд, но то, как они ее используют, не очень эффективно. Вы вводите длинную команду, запоминаете флаги, повторно вводите пути к файлам, а иногда забываете мелкие детали, такие как косая черта в конце, после чего приходится исправлять ошибку и пробовать снова.
Когда вы хотите повторно использовать команду, вы нажимаете стрелку вверх, пока не найдете ее. Это работает, если команда была недавно, но быстро становится раздражающим, если она была запущена несколько часов назад.
К счастью, Bash предоставляет два встроенных инструмента, которые значительно упрощают эту задачу. Как только вы начнете их использовать, вам не придется бесконечно нажимать стрелку вверх только для того, чтобы найти и повторно использовать старые команды.
В этом руководстве мы объясним, как работает Ctrl + R обратный поиск, как использовать fc для редактирования команд в редакторе и как избавиться от необходимости перепечатывать длинные команды в Linux.
Используйте Ctrl+R для быстрого поиска команд в Bash
Сочетание клавиш Ctrl + R запускает то, что Bash называет обратным инкрементным поиском, то есть поиск ведётся в обратном порядке по вашей истории по мере ввода, сужая результаты с каждым символом. Вам не нужно запоминать полную команду, достаточно запомнить её характерный фрагмент, и Bash мгновенно найдёт самое последнее совпадение.
Нажмите Ctrl + R в терминале, и вы увидите, как изменится приглашение:
(reverse-i-search)`':
Начните вводить любую часть нужной команды, например rsync:
(reverse-i-search)`rsync': rsync -avz --progress /var/backups/ user@192.168.1.10:/mnt/backup/
Bash показывает самую последнюю команду, содержащую эту строку, поэтому нажмите Enter, чтобы запустить её сразу, или нажмите клавишу со стрелкой вправо, чтобы перенести её в активную строку командного интерпретатора, где вы сможете отредактировать её перед запуском. Если первое совпадение не то, что вам нужно, нажмите Ctrl + R ещё раз, чтобы пролистать назад по более старым совпадениям.
Чтобы выйти из поиска, не запуская ничего, нажмите Ctrl + G или Ctrl + C.
Совет: Если вы случайно пропустили нужную команду, нажмите Ctrl + S, чтобы снова выполнить поиск вперед. В некоторых системах Ctrl + S вместо этого приводит к зависанию терминала. Если это произошло, запустите stty -ixon в текущем сеансе или добавьте его в ~/.bashrc, чтобы сделать его постоянным.
echo "stty -ixon" >> ~/.bashrc && source ~/.bashrc
Если это избавило вас от необходимости вводить команду в пятый раз за эту неделю, поделитесь этим с кем-нибудь из вашей команды, кто до сих пор использует стрелку вверх.
Почему Ctrl+R не находит все команды в Bash
Команда Ctrl + R ищет в вашем файле ~/.bash_history, и у этого файла есть ограничения, о которых стоит знать. По умолчанию Bash хранит 500 команд в памяти во время сеанса и записывает 500 строк в ~/.bash_history по окончании сеанса, перезаписывая самые старые записи.
Если вы работаете в нескольких окнах терминала, каждое из них записывает свою собственную историю при выходе, и они могут перезаписывать друг друга.
Вы можете проверить текущие ограничения с помощью:
echo "HISTSIZE=$HISTSIZE, HISTFILESIZE=$HISTFILESIZE"
Вывод:
HISTSIZE=1000, HISTFILESIZE=2000
Число HISTSIZE показывает, сколько команд Bash хранит в памяти во время сеанса и в файле истории на диске, поэтому для увеличения лимита выполните:
echo 'HISTSIZE=10000' >> ~/.bashrc echo 'HISTFILESIZE=20000' >> ~/.bashrc source ~/.bashrc
Bash также по умолчанию пропускает дубликаты команд на некоторых системах, и вы можете управлять этим с помощью HISTCONTROL. Если вы хотите избежать повторного сохранения одной и той же команды:
echo 'HISTCONTROL=ignoredups:erasedups' >> ~/.bashrc source ~/.bashrc
Позвольте объяснить, как работает эта команда:
ignoredupsпропускает сохранение команды, если она идентична той, что была непосредственно перед ней.erasedupsудаляет все предыдущие дубликаты команды из истории при каждом её повторном запуске.
Если вы видите, что (reverse-i-search) не возвращает ничего для команды, которую вы точно запускали, наиболее вероятная причина заключается в том, что она выпала из конца вашего файла истории или была запущена в другом сеансе оболочки, который перезаписал её.
Какая самая длинная команда вам когда-либо приходилось перепечатывать по памяти из-за того, что история закончилась? Напишите об этом в комментариях.
Как редактировать предыдущие команды с помощью fc в Linux
fc — это встроенная команда оболочки, означающая «исправить команду», которая извлекает команду из вашей истории и открывает её в вашем текстовом редакторе по умолчанию, чтобы вы могли внести изменения перед её запуском.
Это подходящий инструмент, когда Ctrl + R находит вашу команду, но необходимые изменения занимают больше нескольких символов, поскольку редактировать длинную команду прямо в командной строке терминала очень неудобно.
Запустите fc без аргументов, и она откроет последнюю команду в вашем редакторе:
fc
Откроется ваш редактор, обычно vi, если вы не настроили $EDITOR. Внесите изменения, сохраните и закройте. Отредактированная команда запустится сразу после выхода.
Чтобы открыть конкретную команду по номеру в истории, сначала проверьте историю:
history | tail -20
Вывод:
487 rsync -avz /var/backups/ user@192.168.1.10:/mnt/backup/ 488 df -h 489 journalctl -u nginx --since "2024-01-01" --until "2024-01-31" -o short-precise 490 systemctl restart nginx 491 history | tail -20
Чтобы снова открыть команду 489 в редакторе:
fc 489
Ваш редактор откроется с полной командой journalctl. Измените диапазон дат, сохраните, закройте, и команда запустится.
Совет: Укажите предпочитаемый редактор в ~/.bashrc, чтобы fc использовал его вместо vi или vim, micro, code по умолчанию, или того, что вы на самом деле используете..
export EDITOR=nano
Если вы с ужасом относитесь к редактированию длинных однострочных команд, поделитесь этим с коллегой, который все еще ругается на Терминал.
Как использовать fc для запуска диапазона команд
fc также может последовательно запускать диапазон записей истории, что встречается реже, но полезно, когда вы запускали серию команд настройки и вам нужно повторно выполнить их на другом сервере.
fc 487 490
Результат:
rsync -avz /var/backups/ user@192.168.1.10:/mnt/backup/ df -h journalctl -u nginx --since "2024-01-01" --until "2024-01-31" -o short-precise systemctl restart nginx
Bash открывает все 4 команды в вашем редакторе, так что вы можете изменить их порядок, удалить ненужные строки или изменить аргументы перед запуском, а когда вы сохраните и выйдете, Bash запустит каждую строку.
Как совместить <Ctrl+R и fc
Эти два инструмента лучше всего работают в паре. Используйте Ctrl + R для быстрого поиска команды, затем, если редактирование занимает больше одного-двух слов, нажмите Esc или стрелку вправо, чтобы переместить ее в командную строку, а затем введите fc в следующей строке, чтобы открыть предыдущую команду в редакторе.
Или используйте сочетание клавиш напрямую: после того как Ctrl + R найдет нужную команду, нажмите Ctrl + R, чтобы подтвердить совпадение, не запуская команду, а затем сразу же нажмите fc, чтобы отредактировать её.
Рабочий процесс выглядит следующим образом:
- Ctrl + R — поиск команды.
- Стрелка вправо — перемещение команды в командную строку (без запуска).
- Ctrl + C — отмена без запуска.
fcв следующей строке — открытие предыдущей строки в редакторе.
Эта комбинация покрывает 90% ситуаций типа «Мне снова нужна та длинная команда, но немного в другом варианте».
Заключение
Вы узнали, как Ctrl + R открывает обратный инкрементный поиск по истории Bash, чтобы вы могли найти любую команду, введя ее фрагмент, как повторное нажатие Ctrl + R переключает вас между более старыми совпадениями, и как клавиша со стрелкой вправо помещает совпадение в командную строку для редактирования перед запуском.
Вы также узнали, как fc переносит любую запись истории в ваш текстовый редактор для полного редактирования, как fc -s old=new выполняет быструю встроенную замену без открытия редактора, и как запуск fc с диапазоном повторно выполняет блок предыдущих команд сразу.
Выберите самое простое из этой статьи и сделайте это прямо сейчас: нажмите Ctrl + R в текущем терминале, введите название команды, которую вы запускали сегодня, и посмотрите, как она появится. Затем нажмите стрелку вправо, внесите небольшое изменение и запустите её. Это 10-секундное упражнение закрепит навык в мышечной памяти быстрее, чем чтение об этом.






Комментарии (0)