Интерфейс командной строки

CLI

Что это такое

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

Почему это важно

Графический инструмент показывает одну компоновку за раз, а командная строка позволяет задавать вопросы: сколько, какие именно, отсортированные по чему, изменённые за последнюю неделю. В графическом инструменте такой информации может не быть вовсе, а приходит она в форме, пригодной для скрипта или для вставки в сообщение. Есть и вторая половина — воспроизводимость. Команда служит записью того, что вы сделали, поэтому коллега, который спрашивает, как получился список, получает одну строку, а не описание кликов.

Ключевые идеи

Команды компонуются, а диалоговые окна — нет

Интерфейс единообразен: всё читает текст, пишет текст и сообщает код возврата. Именно поэтому инструменты, написанные разными людьми с разницей в десятилетия, можно соединять друг с другом. Вывод графического инструмента живёт внутри него, и чтобы перенести данные между двумя такими инструментами, нужен формат экспорта и диалоговое окно. Когда задача затрагивает несколько инструментов или повторяемое преобразование, побеждает терминал.

git log --oneline | grep -i "fix" | wc -l

Беглость — это в основном редактирование и история

Удобного пользователя от беглого отличает редко знание большего числа команд. Отличает его скорость правки текущей строки и поиска того, что запускали час назад: перемещение по словам, удаление до конца строки, поиск назад по истории. Именно такие мелкие движения повторяются сотни раз в день.

Ctrl+R       поиск назад по истории
Ctrl+A / E   переход в начало или конец строки
Alt+B / F    перемещение по одному слову
Tab          дополнение пути или имени команды

Инструмент документирует себя

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

tar --help | head -20
man find | less

Автоматизируйте на второй раз

Длинная команда, набранная впервые, остаётся разовой; на второй раз она становится скриптом. Если команда короткая, хватит псевдонима; если она принимает аргументы или принимает решение, нужен небольшой скрипт с именем и комментарием. Так растёт личный инструментарий, и поэтому же окружение беглого пользователя смещается к задачам, которые он действительно повторяет.

alias ll='ls -alh'
# именованный скрипт лучше вызова в сорок символов, который набирают ежедневно

Читайте вывод как данные и проверяйте, что собираетесь сделать

Вывод — текст, поэтому полезно сначала посмотреть, а потом действовать: перечислить, что совпадает с шаблоном, посчитать файлы до удаления, напечатать то, что сделал бы скрипт, вместо его запуска. Так класс необратимых случайностей превращается в задержку на минуту. Заодно команда становится переиспользуемой: форма её вывода уже известна.

grep -rl "TODO" src/          # сначала посмотреть список
rm $(grep -rl "TODO" src/)    # потом решить

Знайте, когда уходить из терминала

Визуальный конфликт слияния, правку изображения, дашборд или diff большого рефакторинга часто быстрее сделать в графическом инструменте. Однако использовать терминал для всего не нужно: навык в том, чтобы чувствовать себя дома в обоих и выбирать осознанно. Беглость означает, что терминал — вариант, который вы оцениваете, а не верность, которую защищаете.

Практика

Найдите собственную историю

Найдите команду, которую запускали раньше, поиском назад по истории — не перепечатыванием и не прокруткой. Повторите пять раз.

Готово, когда: вы достали пять прежних команд без прокрутки и без повторного набора ни одной из них.

Превратите повторяемую команду в скрипт

Найдите команду, которую набирали три или больше раз за эту неделю. Превратите её в псевдоним или в именованный скрипт с комментарием и пользуйтесь им дальше.

Готово, когда: именованная версия запускается из любого каталога, а длинную форму вы с тех пор не набирали.

Частые ошибки

  • Копирование разрушительной команды из результатов поиска — она написана для другого инструмента, версии или пути; исправить: прочитайте справку для своего инструмента и перечислите совпадения до действия.
  • Повторный набор команды часовой давности — медленно и с ошибками; исправить: ищите по истории и правьте прежний вызов.
  • Попытка собрать огромный однострочник — нечитаемо и непроверяемо; исправить: всё, где есть цикл или условие, выносите в скрипт с именем.
  • Игнорирование кода возврата — отказ даёт пустой вывод, который выглядит как корректный пустой результат; исправить: проверьте код возврата или соедините команды условием.
  • Использование терминала для действительно графической работы — разбирать запутанное слияние визуально быстрее; исправить: выбирайте инструмент под задачу, а не по привычке.

Что читать дальше

  • Командная оболочка Unix (01-cs-fundamentals/13-unix-shell) — инструментарий, на котором строится эта привычка, поэтому прочтите сначала о потоках, конвейерах и правах.
  • Git (система контроля версий) (01-cs-fundamentals/12-git) — инструмент, где беглый пользователь терминала экономит больше всего времени.
  • Отладка (01-cs-fundamentals/11-debugging) — та же дисциплина «сначала прочитай вывод», но применённая к неисправности, а не к задаче.