LinuxRuLinux без лишней теории
Работа в терминале

Горячие клавиши терминала Linux и приёмы работы в bash

Редакция LinuxRu7 мин чтенияИнструкции

Горячие клавиши терминала Linux в bash дают редактировать строку без мыши: Ctrl+A и Ctrl+E переносят курсор в начало и конец, Ctrl+U и Ctrl+K вырезают, Ctrl+R ищет по истории команд. Ниже сочетания, настройка истории и автодополнения, перенаправление вывода и конвейеры.

Горячие клавиши терминала Linux и приёмы работы в bash
Фото: Colin, CC BY-SA 4.0, Wikimedia Commons
Содержание
  1. Кто обрабатывает клавиши
  2. Горячие клавиши
  3. Фон и задания
  4. История команд
  5. Автодополнение
  6. Перенаправление
  7. Конвейеры
  8. Полезные приёмы
  9. Частые вопросы

Кто обрабатывает сочетания: эмулятор, оболочка, readline

В терминале клавиши ловят сразу три слоя, и от этого зависит, почему одно сочетание работает, а другое нет. Эмулятор терминала (Konsole, GNOME Terminal или Ptyxis, Alacritty, kitty) отвечает за окно: вкладки, масштаб, копирование. Поэтому копирование и вставка там идут через Ctrl+Shift+C и Ctrl+Shift+V: обычный Ctrl+C занят. Оболочка bash редактирует строку через библиотеку readline, и почти все сочетания ниже относятся к ней. Наконец, драйвер терминала в ядре превращает Ctrl+C и Ctrl+Z в сигналы для запущенной программы.

Сочетания readline по умолчанию работают в режиме emacs. В zsh они почти такие же, в fish большинство тоже совпадает. Если вы предпочитаете клавиши vim, включите set -o vi в ~/.bashrc, но дальше в статье везде режим по умолчанию.

Горячие клавиши терминала Linux для редактирования строки

Набор, который окупается за первый же день. Alt в некоторых эмуляторах занят меню, тогда вместо него нажмите и отпустите Esc, а потом букву.

СочетаниеЧто делает
Ctrl+A / Ctrl+EВ начало или в конец строки
Alt+B / Alt+FНа слово назад или вперёд
Ctrl+UВырезать всё от курсора до начала строки
Ctrl+KВырезать от курсора до конца строки
Ctrl+W / Alt+DВырезать слово перед курсором или после него
Ctrl+YВставить последнее вырезанное
Ctrl+_Отменить последнее изменение в строке
Alt+.Вставить последний аргумент предыдущей команды, повторное нажатие листает дальше
Ctrl+RПоиск по истории
Ctrl+LОчистить экран, текущая строка остаётся
Ctrl+X Ctrl+EОткрыть строку в редакторе из $EDITOR, после сохранения команда выполнится
Ctrl+CПрервать программу или сбросить набранную строку
Ctrl+DКонец ввода, на пустой строке закрывает оболочку

Вырезанное через Ctrl+U, Ctrl+K и Ctrl+W попадает в собственный буфер readline, а не в системный буфер обмена. Типичный приём: начали набирать длинную команду, поняли, что сначала нужна другая. Нажмите Ctrl+U, выполните нужную, затем Ctrl+Y вернёт отложенную строку.

Ctrl+Z, фоновые задания и зависший терминал

Ctrl+Z не закрывает программу, а приостанавливает её. Это удобно: открыли файл в редакторе, понадобилось что-то проверить в оболочке, нажали Ctrl+Z, проверили, вернулись командой fg.

jobs            # список заданий текущей оболочки
fg %1           # вернуть задание 1 на передний план
bg %1           # продолжить задание 1 в фоне
long-task &     # сразу запустить в фоне
disown %1       # отвязать от оболочки, переживёт закрытие окна
nohup ./build.sh > build.log 2>&1 &

Если терминал вдруг перестал реагировать на ввод, вы, скорее всего, нажали Ctrl+S: это старая команда остановки вывода. Освобождает его Ctrl+Q. Отключить ловушку навсегда можно строкой stty -ixon в ~/.bashrc, тогда Ctrl+S заработает как поиск вперёд по истории. Если после вывода бинарного файла экран заполнился мусором, наберите вслепую reset и Enter.

История команд bash: поиск, повтор и настройка

Bash помнит команды и сохраняет их в ~/.bash_history при выходе из оболочки. Самые полезные способы до них добраться:

history | tail -20   # последние 20 команд с номерами
!!                   # повторить предыдущую команду
sudo !!              # повторить её с sudo
!512                 # выполнить команду номер 512
!ssh                 # последнюю команду, начинавшуюся с ssh
!$                   # последний аргумент прошлой команды
^ngnix^nginx         # повторить прошлую команду с исправленной опечаткой

Поиск по Ctrl+R работает инкрементально: набирайте кусок команды, повторные Ctrl+R листают совпадения дальше в прошлое, Enter выполняет, стрелка вправо оставляет строку для правки, Ctrl+G отменяет поиск.

Настройка истории

Значения по умолчанию скромные, а при нескольких открытых окнах история последнего закрытого окна затирает остальные. Добавьте в ~/.bashrc:

HISTSIZE=50000
HISTFILESIZE=100000
HISTCONTROL=ignoreboth:erasedups
HISTTIMEFORMAT='%F %T '
shopt -s histappend
PROMPT_COMMAND="history -a${PROMPT_COMMAND:+; $PROMPT_COMMAND}"

ignoreboth не сохраняет дубликаты подряд и команды, начинающиеся с пробела. Последнее полезно: если нужно ввести команду с паролем или токеном, поставьте перед ней пробел, и она не попадёт в историю. Случайно сохранённую строку удаляет history -d номер, затем history -w перезапишет файл.

Автодополнение по Tab и файл .inputrc

Одно нажатие Tab дополняет имя команды, файла или каталога, если вариант единственный. Двойное показывает все варианты. Дополнение ключей команд, имён пакетов, служб systemd и веток git обеспечивает пакет bash-completion. В Ubuntu и Fedora он обычно стоит, в минимальных установках Debian и в Arch его ставят отдельно:

sudo apt install bash-completion
sudo dnf install bash-completion
sudo pacman -S bash-completion

После установки откройте новый терминал. Теперь systemctl restart ss плюс Tab дополнит имя службы, а apt install firef плюс Tab имя пакета.

Поведение readline настраивается в ~/.inputrc. Четыре строки, которые делают жизнь заметно проще:

$include /etc/inputrc
set completion-ignore-case on
set show-all-if-ambiguous on
"\e[A": history-search-backward
"\e[B": history-search-forward

Первая сохраняет системные настройки, вторая игнорирует регистр при дополнении, третья показывает варианты с первого Tab. Последние две превращают стрелки вверх и вниз в поиск по началу строки: набрали git, нажали стрелку вверх, и листаются только команды git. Применяется в новом терминале или сразу по bind -f ~/.inputrc.

Перенаправление вывода в Linux: >, >>, 2> и /dev/null

У каждой программы три стандартных потока: ввод (0, stdin), вывод (1, stdout) и ошибки (2, stderr). Перенаправление отправляет их в файл или берёт из файла:

ls -l > list.txt            # вывод в файл, файл перезаписывается
ls -l >> list.txt           # дописать в конец файла
find / -name '*.conf' 2> /dev/null   # спрятать ошибки
make > build.log 2>&1       # вывод и ошибки в один файл
make &> build.log           # то же короче, работает в bash
sort < names.txt            # взять ввод из файла
grep -c error <<< "$text"   # строка как ввод

Порядок в 2>&1 важен. Запись команда > файл 2>&1 отправит в файл оба потока, а команда 2>&1 > файл отправит ошибки на экран: на момент копирования второй поток указывал на терминал.

Многострочный текст удобно подавать конструкцией here-document. Так, например, создают конфиг одной командой:

cat > ~/notes.txt <<'EOF'
Первая строка
Переменные вроде $HOME здесь не раскрываются
EOF

Одна лишняя угловая скобка в > вместо >> молча стирает файл. Включите защиту командой set -o noclobber в ~/.bashrc: оболочка откажется перезаписывать существующий файл через >, а когда это действительно нужно, пишите >|.

Конвейеры, tee и xargs

Вертикальная черта передаёт вывод одной команды на ввод следующей. Из маленьких утилит так собираются полноценные отчёты:

# десять самых частых IP в журнале nginx
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
# ошибки текущей загрузки с поиском по слову
journalctl -b -p err | grep -i usb
# смотреть вывод и одновременно писать в файл
sudo apt full-upgrade 2>&1 | tee upgrade.log
# передать список файлов как аргументы
find . -name '*.tmp' -print0 | xargs -0 rm -v

tee нужен и для записи в системные файлы: echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.conf. Конструкция sudo echo ... > файл не сработает, потому что перенаправление делает ваша оболочка без прав root. Пара -print0 и -0 защищает от пробелов в именах файлов. Больше приёмов поиска в материале поиск файлов: find и grep.

В скриптах добавляйте set -o pipefail: без него код возврата конвейера равен коду последней команды, и падение в середине цепочки пройдёт незамеченным.

Мелкие приёмы, которые экономят время

  • cd - возвращает в предыдущий каталог, cd без аргументов ведёт домой.
  • Фигурные скобки размножают аргументы: mkdir -p project/{src,docs,tests} создаст три каталога, cp nginx.conf{,.bak} сделает резервную копию файла.
  • команда1 && команда2 выполнит вторую только при успехе первой, команда1 || команда2 только при ошибке.
  • $(команда) подставляет вывод одной команды в другую: echo "Ядро: $(uname -r)".
  • fc открывает последнюю команду в редакторе. Удобно, если она длинная и в ней ошибка в середине.
  • Ctrl+Shift+T в большинстве эмуляторов открывает новую вкладку, а Ctrl+Shift+F ищет по выводу в окне.

Часто повторяемые длинные команды стоит превратить в короткие имена, как это сделать, рассказано в статье aliases в Linux. Если вы только начинаете, сначала пригодится список основных команд Linux, а для работы на удалённых машинах инструкция как подключиться по SSH. Полный список привязок readline есть в разделе Bindable Readline Commands руководства GNU Bash, а свои текущие привязки показывает bind -P.

Частые вопросы

Как скопировать и вставить текст в терминале Linux?

В большинстве эмуляторов через Ctrl+Shift+C и Ctrl+Shift+V. Обычный Ctrl+C прерывает запущенную программу.

Как найти команду в истории bash?

Нажмите Ctrl+R и начните набирать часть команды. Повторный Ctrl+R показывает более ранние совпадения, Enter выполняет найденное.

Почему терминал завис и не реагирует на клавиши?

Скорее всего, нажат Ctrl+S, который останавливает вывод. Нажмите Ctrl+Q. Отключить поведение можно командой stty -ixon.

Как записать в файл и вывод, и ошибки?

Используйте команда > файл 2>&1 или короче команда &> файл. Порядок 2>&1 после имени файла важен.

Как не сохранять команду с паролем в истории?

При HISTCONTROL=ignoreboth или ignorespace поставьте пробел перед командой. Уже сохранённую строку удалит history -d номер.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.