Одно из главных преимуществ терминала в том, что он быстрее чем большинство других интерфейсов. Благодаря библиотеке GNU Readline и встроенному синтаксису таких оболочек как Bash и Zsh, у нас существует сразу несколько способов сделать взаимодействие с командной строкой еще быстрее.
Навигация без клавиш со стрелками
Иногда, в процессе ввода команды в терминал, вы можете упустить какую-то важную часть в начале, или забыть добавить какие-то аргументы в середине/конце. Чаще всего пользователи просто используют клавиши со стрелками Влево/Вправо для перемещения в нужное место строки.
Однако есть способ получше. Вы можете перемещать курсор сразу в начало строки с помощью комбинации CTRL+A, и в конец с помощью CTRL+E.
Для перемещения на более короткие дистанции (в пределах одного слова) можно задействовать клавиши ALT+F для перемещения на одно слово вперёд, и ALT+B на слово назад.
Для перемещения на один символ вперёд – CTRL+F, и для перемещения на один символ назад CTRL+B
Альтернатива для Backspace или Delete
Возможно, вы привыкли использовать клавиши Backspace и Delete для удаления символов в командной строке. Однако совершенно неудобно использовать эти клавиши в тех случаях, когда нам нужно удалить строку от текущего положения курсора, и до начала/конца строки.
В решении этой задачи можно прибегнуть к помощи клавиш CTRL+U для удаления всех символов от курсора до начала строки, и CTRL+K для удаления всего от курсора до конца строки.
Выполнение нескольких команд в одной строке
Иногда удобно выполнить последовательность из несколько команд за один раз. Чтобы пока они отрабатывают, вы могли отойти от компьютера или переключить своё внимание на что-то другое.
Например в случае работы с Git репозиториями часто приходится вводить примерно такую последовательность команд:
$ git add $ git commit -m "message" $ git push origin main
Вместо запуска трёх команд в трёх разных строках, можно уместить их в одну, разделив последовательную запись команд символом ;
$ git add .; git commit -m "message"; git push origin main
Тут есть нюанс. В случае использования разделителя ; команды будут выполняться последовательно независимо ни от чего. То есть в данном случае даже если не удастся создать коммит, в любом случае будет выполнен git push.
Чтобы исключить выполнение последующей команды после предыдущей, в случае её не успешного выполнения, нужно использовать логическое “И” – && вместо ; .
Когда используется логическое “И”, следующая команда не выполняется, если предыдущая закончилась с ошибкой (любой не нулевой код возврата).
$ git add . && git commit -m "message" && git push origin main
Чаще используйте алиасы
Вероятно вам часто приходится запускать длинные команды, или комбинации из нескольких команд с рядом аргументов.
Чтобы избавить себя от необходимости постоянного ввода этих команд (или поиску по истории с помощью CTRL+R) создавайте алиасы.
Например если вы неоднократно в течение дня отправляете локальную ветку git’а на удалённый репозиторий, то для git push origin main можно сделать алиас вида:
alias gpom= "git push origin main"
Его нужно будет записать в .bashrc пользователя, после чего не забыть перезагрузить конфигурацию bash:
$ . ~/.bashrc
Разумеется в случае использования иной оболочки, следует вносить изменения в соответствующий конфиг-файл.
После внесения изменений, в командой строке теперь можно использовать алиас gpom:
$ gpom
Основной проблемой алиасов является то, что они не подхватываются автоматически механизмом авто-дополнения кода. Их написание отличается от тех команд, которые зарегистрированы в системе авто-дополнения, поэтому приходится дополнительно регистрировать алиасы, назначая им соответствующие спецификации авто-дополнения (compspec) через встроенную в bash команду complete
.
В случае с Git над complete
существует обёртка __git_complete
, в которую необходимо передавать предопределённые функции-обёртки, начинающиеся с префикса _git_
и оканчивающиеся названием подкоманды git.
Поиск по истории команд
Большинство пользователей терминала склонны повторно использовать ранее выполненные команды. Если команда, которую вы хотите повторно использовать, находится на несколько строк раньше, вам придется несколько раз нажимать стрелку вверх, что в принципе достаточно терпимо, и не сильно утомительно.
Но если нужная команда была введена пару дней назад, то клавиши со стрелками не то, чтобы совсем не помогут, но сильно замедлят процесс, который можно выполнить намного быстрее.
Для более быстрого поиска и вызова нужной строки, можно воспользоваться командой history, которая выведет на экран нумерованный список всех введеных команд.
Количество строк в списке регулируется переменными HISTSIZE и HISTFILESIZE:
HISTSIZE — количество команд, которые необходимо запоминать в списке истории (по умолчанию — 500);
HISTFILESIZE — максимальное количество строк, содержащееся в файле истории ~/.bash_history (по умолчанию — 500);
После нахождения в списке нужной команды, достаточно будет ввести в терминал !{номер-команды}, чтобы её выполнить.
Например в нашем случае команда history выдала такой список:
43 man bash 44 man fc 45 man bash 46 fc -l -10 47 history 48 ls -a 49 vim .bash_history 50 history 51 man history 52 history 10 53 history
Чтобы выполнить команду
46 fc -l -10
достаточно просто ввести
!46
Возможность дописать команду
Нередко возникают ситуации когда очень длинная команда уже почти введена, и тут мы вспоминаем, что вообще перед её выполнением нужно еще кое что сделать. Тут у нас есть несколько опций. Открыть новое окно терминала, и выполнить нужные действия там. Можно (для особых эстетов) скопировать команду в буфер обмена, удалить в терминале, выполнить нужные действия, и затем вставить её обратно из терминала и т. д.
Тем не менее есть более удобный приём.
Достаточно перейти в начало строки с недописанной командой и проставить символ #. Поскольку в Bash всё, что начинается с символа # и до конца строки считается комментарием, то и ваша строка будет им интерпретирована именно как комментарий.
После простановки символа #, можно спокойно нажать Enter, ввести нужную команду, а затем вернуться к недописанной с помощью CTRL+R, history или клавиш со стрелками.