Трюки в терминале, которые реально экономят время (и нервы)

Обложка: Трюки в терминале, которые реально экономят время (и нервы)

Есть особый вид боли — наблюдать, как талантливый инженер зажимает Backspace на шесть секунд, чтобы исправить опечатку в начале строки.

Мы все там были. Выучили ls, cd и grep — и на этом остановились. Терминал стал местом, где мы живём, но обустроить его мы так и не удосужились. Мы миримся с тем, что какие-то действия требуют 40 нажатий, хотя авторы шелла решили нашу проблему ещё в 1989 году.

Вот подборка приёмов, которые не то чтобы секретные — но которым почему-то не учат. Разделим их на две группы: универсальные (работают почти в любом POSIX-шелле) и для Bash/Zsh (интерактивные фишки).

TL;DR: Ctrl+W удаляет слово, Ctrl+U — строку до курсора, Ctrl+R ищет по истории, !! повторяет предыдущую команду (незаменимо для sudo !!), а cd - возвращает в предыдущую директорию. Начните хотя бы с этих пяти.

Универсальные: работают (почти) везде

Эти приёмы опираются на стандартные привязки клавиш Emacs-стиля через Readline. Даже если вы подключились по SSH к роутеру 2009 года выпуска или минимальному Alpine-контейнеру — они будут работать.

Замена Backspace

  • Ctrl+W — удалить слово перед курсором. Набрали /var/log/nginx/, а нужно было /var/log/apache2/? Одно нажатие вместо 7 Backspace
  • Ctrl+U — вырезать всё от курсора до начала строки. Набрали длинную команду rsync, но сначала нужно проверить директорию? Ctrl+U вырезает, а Ctrl+Y вставляет обратно
  • Ctrl+K — то же самое, но вырезает от курсора до конца строки
  • Ctrl+A и Ctrl+E — прыжок в начало и конец строки. Забудьте про Home и End — они далеко от домашнего ряда
  • Alt+B и Alt+F — перемещение по словам назад и вперёд. Быстрый аналог стрелок (на Mac нужно настроить Option как Meta в терминале)

Терминал показывает иероглифы?

Случайно сделали cat на бинарник — и терминал превратился в месиво символов? Наберите вслепую reset и нажмите Enter. Терминал восстановится. Альтернатива — stty sane.

Экстренные выходы

  • Ctrl+C — отменить текущую команду. Ваш аварийный выход, когда что-то зависло
  • Ctrl+D — отправить EOF. Если командная строка пуста — разлогинит из шелла. Осторожнее!
  • Ctrl+L — очистить экран, не прерывая набор текущей команды. Удобнее, чем clear

Прыгаем между директориями

cd - — переключение между двумя последними директориями. Вы в /usr/local/etc/postfix, перешли в /var/log посмотреть логи — cd - вернёт обратно. Как кнопка «последний канал» на пульте.

pushd и popd — если cd - это переключатель, то pushd это стек. pushd /etc перейдёт в /etc, запомнив предыдущую директорию. popd снимет её со стека и вернёт вас.

Мгновенная очистка файла и последний аргумент

> file.txt — очищает файл, сохраняя права и не прерывая процессы. $_ — последний аргумент предыдущей команды:

			mkdir -p /some/ridiculously/long/path/newdir && cd "$_"
		

Страховка для скриптов

			set -euo pipefail
		
  • -e — останов при ошибке (нюансы с if и пайпами)
  • -u — ошибка при несуществующей переменной. Спасёт от rm -rf /usr/local/${OPECHATKA}/*
  • -o pipefail — ошибка в любом звене пайпа = ошибка всей цепочки

Bash и Zsh: зона комфорта

Поиск по истории и «sudo !!»

Ctrl+R — обратный поиск по истории. Начните вводить часть команды — шелл найдёт её. !! — повторить предыдущую команду. Классика: получили «Permission denied» — sudo !!.

Редактор, brace expansion и процессы

Ctrl+X, Ctrl+E — открывает текущую команду в $EDITOR. fc — то же для предыдущей команды. Esc+. — вставляет последний аргумент прямо на месте курсора. Брейс-экспаншн для быстрых операций:

			cp pf.conf{,.bak}       # → cp pf.conf pf.conf.bak
mv filename.{txt,md}    # → mv filename.txt filename.md
mkdir -p project/{src,tests,docs}

# Сравнить отсортированные файлы без временных
diff <(sort file1.txt) <(sort file2.txt)

# Рекурсивный glob (shopt -s globstar в Bash)
ls **/*.js
		

Спасти процесс от обрыва SSH

			# 1. Приостановить: Ctrl+Z
# 2. Возобновить в фоне:
bg
# 3. Отвязать от шелла:
disown

# Логирование stdout+stderr:
command |& tee file.log
		

Терминал — это набор инструментов, а не полоса препятствий. Возьмите один приём, используйте его неделю — и переходите к следующему.

Источник: Shell Tricks That Actually Make Life Easier — Hofstede Blog