Программисты часто пользуются терминалом. Они вводят команды Git, запускают скрипты сборки и автоматизации. Практически все операционные системы с графическими пользовательскими интерфейсами имеют встроенные приложения-терминалы, дающие пользователям возможность выполнять задачи в интерфейсе командной строки.
Каждый такой терминал для получения результата обычно посылает введенные пользователем команды в интерпретатор командной строки.
Например, когда вы вводите mkdir
для создания новой директории, терминал выполняет процесс /usr/bin/mkdir
с аргументами ввода через интерпретатор командной строки вроде Bash. Затем двоичный файл mkdir
создает новый каталог при помощи системного вызова mkdir
и направляет вывод обратно на терминал.
В терминале можно запускать множество команд для выполнения самых разных задач. В Unix-подобных системах, таких как GNU/Linux и macOS, эти команды практически одинаковы.
Большинство разработчиков в ходе сессий программирования предпочитают взаимодействовать с ОС через терминал. Это позволяет выполнять многие задачи гораздо быстрее.
В этой статье я дам несколько советов по использованию Unix-терминала. Следование этим советам позволит вам ускорить разработку.
Используйте фоновые задачи эффективно
Чаще всего мы вводим в терминале быстро выполняющиеся команды. Например, введя git status
, мы немедленно получаем на экран текущее состояние репозитория, после чего команда прекращает работу.
Но порой нам случается запускать команды, работающие длительное время. Например, мы можем открыть при помощи терминала текстовый редактор с графическим интерфейсом, чтобы отредактировать какой-то файл. Можем запустить установку нового пакета или клонирование репозитория из интернета.
В подобных случаях многие программисты просто открывают несколько экземпляров оболочки (несколько вкладок в терминале). Но практически все интерпретаторы командной строки предлагают специальный функционал для управления несколькими задачами, запущенными в одном экземпляре оболочки.
В Unix-подобных операционных системах есть разные режимы для фоновых задач. Самый простой и наиболее ходовой вид запуска задачи в фоне — с добавлением символа &
. Я часто им пользуюсь, чтобы открыть текстовый файл в приложении gedit:
gedit myFile.py &
Открытие текстового редактора при этом не блокирует текущую оболочку. Я могу продолжить вводить другие команды в том же окне терминала, не закрывая при этом gedit.
Но этот подход не применим для долгоиграющих задач, выводящих что-то в консоль: при выводе текста оболочка блокируется. В подобных случаях мы можем воспользоваться следующей командой с перенаправлением потоков вывода и ошибок:
./download.sh &> /dev/null &
Если этот синтаксис кажется вам слишком длинным, всегда можно создать специальную функцию в файле .bashrc. Пример:
function bgt() { "$@" &> /dev/null & } …. …. bgt ./download.sh # даст тот же результат!
Просмотреть статус фоновых задач можно при помощи встроенной команды jobs
. Если вам нужно, чтобы команда продолжала работать даже после закрытия окна терминала, породите процесс с использованием команды nohup
.
user@host:~$ nohup команда [аргументы]
Учимся быстрее находить и вводить команды
Опытные программисты вводят нужные команды быстрее неопытных не потому, что умеют быстрее печатать. Каждое терминальное приложение предлагает набор сочетаний клавиш (шорткатов), с помощью которых вы можете вводить команды гораздо эффективнее.
Все разработчики знают, что чтобы воспользоваться одной из предыдущих команд, их можно перебрать клавишами со стрелками, а клавиша tab служит для автодополнения. Но знаете ли вы, что при редактировании команды можно быстро перемещать курсор? Ctrl + A
и Ctrl + E
перемещают курсор в начало и конец команды соответственно.
Порой нам нужно найти команду, которую мы вводили некоторое время назад. Если искать команду «стрелкой» слишком долго, к вашим услугам два других способа поиска. Вы можете скомбинировать команду grep с командой history
:
history | grep git
В результате выполнения этого конвейера будут выведены все git-команды, которые вы вводили ранее. Вам останется только скопировать и запустить нужную.
Если вы не любите пользоваться мышью, можно задействовать реверсивный поиск. Нажмите Ctrl + R
и введите часть команды. Затем нажимайте Ctrl + R
, пока не найдете нужную команду.
Попробуйте осуществлять все операции с файлами в терминале
Занимаясь разработкой, нам часто приходится создавать, удалять и копировать файлы и директории. Для осуществления операций с файлами вам не нужно покидать ваш терминал.
Несмотря на то, что менеджер файлов с графическим интерфейсом дает лучшее визуальное представление о файлах, он снижает продуктивность операций с ними, ведь нам приходится делать много кликов и движений мышью. В вашем любимом редакторе кода тоже могут быть специальные функции для работы с файлами, но это все равно GUI.
Учитесь пользоваться командами touch
, cp
, mv
, rm
и mkdir
вместо менеджера файлов. Но будьте осторожны с командами типа rm
, потому что при использовании опции -force
у вас не будет запрашиваться подтверждение удаления.
Также в терминале можно куда быстрее искать текстовые паттерны. Например, следующая команда покажет все места, где вы включили header-файл unistd.h:
grep -rn "#include <unistd.h>"
Если эти команды кажутся вам длинными, всегда можно определить их в качестве функций в файле .bashrc, как показано ниже:
function sp() { grep -rn "$@" } …. …. sp "#include " # даст тот же результат!
Но порой все же необходимо использовать менеджер файлов с графическим интерфейсом. Его тоже можно вызвать из терминала:
xdg-open ~/folder # Linux или open ~/folder # macOS
От редакции Techrocks. Предлагаем также почитать статьи «Поиск в Unix: команда grep» и «16 опций grep, которые помогут вам в реальном мире».
Для написания скриптов автоматизации используйте JavaScript или Python
Когда приходится ежедневно вводить в терминале один и тот же набор команд, мы обычно помещаем их в скрипт. Большинство программистов для написания скриптов автоматизации используют Bash.
Bash хорош для shell-скриптов, но не для всех скриптов автоматизации. Что, если вам нужно создать файл с многострочным шаблоном? Bash — язык команд. Он не предлагает ни синтаксиса, дружественного к разработчику, ни специальных функций.
Попробуйте выбрать другой язык для написания скриптов автоматизации. JavaScript и Python прекрасно подойдут.
Каждая Unix-подобная операционная система поставляется с предустановленной версией Python. Также у многих программистов установлен Nodejs. Так что вы сможете писать портируемые скрипты автоматизации, аналогичные Bash-скриптам, и на Python, и на JavaScript. На этих языках вы также сможете писать скрипты автоматизации для CI/CD серверов.
Чтобы сделать JavaScript-скрипты похожими на Bash, можно воспользоваться zx или shelljs. Аналог для Python — shellpy.
Обращайте внимание на доступные опции команд и возможные их комбинации
Обычно команда, введенная в терминале, выполняет какое-то одно действие. Например, команда tac выводит на экран строки указанного файла в обратном порядке. Некоторые внешние команды имеют подкоманды. Практически все команды имеют по несколько опций для управления внутренним поведением. И порой эти опции помогают ускорить нашу работу, поскольку с их помощью можно избежать использования дополнительных команд.
Например, с помощью одной команды mkdir с опцией -p можно создать несколько вложенных директорий одновременно:
mkdir -p ./src/core/filesystem
Интерпретаторы поддерживают два способа запуска последовательных команд:
- команды можно писать в одну строчку и разделять точкой с запятой или двумя амперсандами (
&&
) - можно использовать конвейеры.
Вместо того чтобы вводить несколько команд по одной, мы можем создавать «однострочники». Это повышает продуктивность. Следующий однострочник создает набор вложенных директорий и делает последнюю созданную директорию текущей (т. е. мы переходим в нее):
mkdir -p ./src/core/filesystem && cd $_
Иногда можно ускорить работу, используя вывод одной команды в качестве аргументов другой. Это не то же самое, что конвейер, где вывод одной команды направляется на вход другой. В следующем примере мы удаляем все контейнеры Docker одновременно:
docker rm -f $(docker ps -a -q)
Больше того: мы можем создавать массивы и мгновенно использовать их в качестве аргументов. Следующий однострочник создает пять скриптов Python с последовательными именами:
touch script_{1..5}.py
Попробуйте начать создавать собственные комбинации команд для выполнения нескольких задач сразу, а не вводить по одной команде за раз.
Перевод статьи «5 Unix Terminal Tips To Boost Your Coding Speed».
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]