36

Зачем разработчику нужен Linux вообще и терминал в частности

Вклинюсь в бунт полезной темой. Тема "Windows vs Linux" является частой причиной холиваров. Спорить бессмысленно, так как для каждой задачи требуется свой инструмент. Позвольте заинтересовать вас чудесным миром Linux и теми бонусами, которые вы можете получить от использования терминала в повседневной деятельности. Всё разберём на примерах реального использования.

Легко поставить софт

При получении в мессенджере оригиналов фотографий из iPhone мы получаем непонятный .HEIC-файл, а хочется привычных JPG/PNG. Для Linux с помощью менеджера пакетов можно поставить программу-конвертер и применить её

sudo apt update && sudo apt install libheif-examples heif-convert 1.HEIC 1.jpg

Причём в терминале можно активно пользоваться кнопкой tab, чтобы не набирать команду целиком. Это выглядит примерно так: пишем "heif-c", нажимаем tab и получаем полную команду. Работает с командами, именами файлов и даже с настроенными подкомандами: sudo apt i<tab> дополнят команду до install.

Легко автоматизировать процессы

Мы справились с одной фотографией. А как поступить с десятком фотографий? Как быть, когда фотографий сотни? Когда у вас готово решение для конкретного случая, то в терминале его легко можно автоматизировать. Сила автоматизации в том, что можно легко масштабировать решение, например, для всех файлов с заданным расширением

for file in *.HEIC; do heif-convert "$file" "${file%.*}.jpg"; done

Да, тут немало нюансов. Ладно, синтаксис do-done и нюансы расстановки точек с запятой можно принять как данность. Применение перебора по маске уже достаточно непростая тема. Обязательные двойные кавычки вокруг переменных вызывают вопросы. Самое неприятное, что всё будет работать и без кавычек, если в названиях нет пробелов. А с пробелами нужны кавычки, но в примере из интернета об этом не скажут. Нюансы удаления расширения у файлов с использованием %.* вообще могут свести с ума, документация на этот счёт огромная и довольно сложная.

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

Неудобством является высокий порог входа относительно программы с кнопкой "сделать хорошо", но и подход оказывается более универсальным – изученный однажды способ автоматизации навсегда остаётся с вами.

Легко вспомнить

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

И совсем крутой является возможность искать по истории команд. Нажатием сочетания ctrl+R мы переводим терминал в режим обратного поиска по заданной подстроке. Я ввожу ctrl-R, набираю HEIC и получаю нужную команду из истории.

(reverse-i-search)`HEIC': for file in *.HEIC; do heif-convert "$file" "${file%.*}.jpg"; done

Если нужной команды нет, я могу дописать подстроку или нажать ctrl+R повторно для демонстрации предыдущего подходящего значения.

Легко настроить под себя

По умолчанию сохраняется только тысяча последних команд, и эта тысяча достаточно быстро заканчивается. Посмотрел у себя – дефолтную тысячу команд я использовал за 3 недели. Чтобы сделать историю команд почти бесконечной, надо залезть в конфиг. В файле ~/.bashrc для переменных HISTSIZE и HISTFILESIZE поставьте значение в миллион или вроде того.

# в вашем ~/.bashrc

HISTSIZE=1000000

HISTFILESIZE=1000000

Почти у каждой программы есть текстовый конфигурационный файл, с помощью которого можно поменять её поведение. И у текстовой конфигурации много плюсов – её можно посмотреть глазами, её можно сохранить в git и отслеживать изменения, её можно легко нагуглить в интернете. Графический интерфейс программы может меняться, объяснения "нажми сюда, потом туда" неудобны и быстро устаревают.

При этом можно пойти дальше, добавив алиасы для ещё большей скорости работы в терминале. В дополнение к стрелочкам, ctrl+R и tab у нас есть автозамены, они же alias. Писать git status слишком долго, проще написать gs. Вот фрагмент моих алиасов для работы с git

alias gs='git status'

alias gd='git diff'

alias gitc='git commit -m'

alias gl="git log --graph --pretty=format:'%C(yellow)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=short "

У git log флаги обеспечивают такое визуальное представление:

Зачем разработчику нужен Linux вообще и терминал в частности Программирование, IT, Разработка, Обучение, Linux, Telegram, Длиннопост

Из секции "прочее" я использую такие интересности

alias ll='ls -alF'

alias la='ls -A'

alias ..="cd .."

alias ...="cd ../.."

alias ....="cd ../../.."

alias h="history | tail -30"

# хрен запомнишь

alias TAR='tar -zcvf' # dest source

alias UNTAR='tar -zxvf' # source

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

Статистика среди разработчиков

Посмотрим, что происходит в индустрии. Stackoverflow проводит ежегодные опросы разработчиков для отслеживания текущих трендов в программировании. В 2022 году в опросе участвовало 70 тысяч разработчиков. Посмотрим отдельные вопросы и ответы на них.

В какой операционной системе вы в основном работаете? (What is the primary operating system in which you work?)

Зачем разработчику нужен Linux вообще и терминал в частности Программирование, IT, Разработка, Обучение, Linux, Telegram, Длиннопост

Как видно из результатов, Linux среди разработчиков занимает очень весомые позиции.

Как вы пользуетесь Git? В вопросе системы контроля версий в общем виде, но 97% используют git. (How do you interact with your version control system? Select all that apply.)

Зачем разработчику нужен Linux вообще и терминал в частности Программирование, IT, Разработка, Обучение, Linux, Telegram, Длиннопост

Интересно, что 84% разработчиков используют интерфейс командной строки. Не удивительно, так как при поиске ответа на сложный вопрос вы попадёте на Stackoverflow, где вам предложат именно консольную команду. Консоль является универсальным языком взаимодействия разработчиков.

Терминал важен для разработчиков

Попробуем запустить веб-сервер на питоне. Штатный результат выглядит так:

python3.10 -m http.server

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

Однако вы можете получить вот такой неприятный вывод

python3.10 -m http.server

Traceback (most recent call last)

...

OSError: [Errno 98] Address already in use

Эта ошибка означает, что порт по умолчанию 8000 занят другим приложением. Для починки ситуации можно найти и завершить процесс, который занимает этот порт. Но что это за приложение и где его найти?

В терминале с помощью netstat выведем процессы и занимаемые ими порты, а в выводе с помощью grep найдём строку 8000, отвечающую за нужным нам порт

sudo netstat -nltp | grep 8000

tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 16240/python3.10

Вертикальная черта обозначает конвейер, связывающий вывод левой команды с выводом правой. Теперь можно завершить процесс с идентификатором 16240 с помощью kill

kill 16240

В примере выше, кстати, очень хорошо видна философия Unix – программа должна делать что-то одно, и делать это хорошо. Задача операционной системы – предоставить гибкий клей для объединения различных программ. Мощь кроется в интеграции между программами и умении декомпозировать задачу на кусочки. Сложная задача рассматривается как комплекс более простых, а терминал становится единым языком общения для разработчиков.

Причём можно докрутить конвейер до получения результата в одну строку. Выведем все процессы, найдём порт 8000, выделим 7 столбец, где указан номер процесса, и в нём возьмём первую часть от слеша. Результат подадим в kill в виде аргумента, для этого воспользуемся xargs

sudo netstat -nltp | grep 8000 | awk '{print $7}' | awk -F/ '{print $1}' | xargs kill

Такие однострочники неустойчивы к ошибкам в процессе, если требуется надёжное решение – надо аккуратно писать скрипт. Записал на этот счёт 20-минутное видео Идеальный скрипт на bash, где последовательно показываю процесс создания красивого скрипта с документацией и учётом bash-идиом. В процессе показываю консольный git и интересные фишки терминала. Когда вы овладеете CLI, терминал станет для вас удобной и привычной средой обитания. Для возникшей задачи ваши пальчики сами будут выдавать однострочник, решающий проблему. И выходить из терминала вам больше не захочется.

Вместо netstat можно использовать ss, lsof или fuser, путей решения проблемы всегда более одного. С опытом пополняется пул известных разработчику команд, что позволяет сразу решать проблему или быстро воспринимать нагугленное решение.

Изучается один раз

Из предыдущего пункта вытекает следующий. Графический интерфейс (GUI) учится под каждую программу. Интерфейс командной строки (CLI) учится один раз, дальше только необходимо пополнять пул известных команд за счёт поиска. Причём отдельный инструмент может внести огромный вклад – например, понимание регулярных выражений сразу делает доступным sed, awk и другие инструменты, которые завязаны на регулярках.

Docker для DevOps

Уже достаточно давно технология контейнерной виртуализации Docker стала популярным способом деплоя приложений, который применяется разработчиками. Даже небольшое современное приложение требует фронтенд, бекенд, базу данных, nginx для балансировки и другой магии, автообновление сертификатов. Это 3+ сервиса, объединённые в одно целое с помощью docker compose. GUI для docker существует, но большая часть гайдов и примеров приводятся для терминала. Чем эффективнее вы умеете работать в терминале, тем эффективнее вы сможете работать с докером – решать возникающие проблемы, модифицировать готовое решение под ваши реалии и так далее.

Можно для команды на сервере поднять кучу инструментов – gitlab для разработки, mattermost для коммуникации, систему мониторинга, локальное хранилище и прочее. Для DevOps всё ещё сильнее завязано на bash. CI/CD-пайплайны, "инфраструктура как код" и прочее требуют Linux вообще и bash в частности.

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

Ускоряем работу на примере

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

В качестве поля для экспериментов возьмём утечку rockyou, в которой 139 мегабайт (14 млн) утекших в 2009 году паролей. Замерять время будем с помощью time, смотрим на время real. Решение в лоб состоит в сортировке с флагом --unique или -u и последующем подсчёте строк с помощью команды wc

time cat rockyou.txt | sort --unique | wc -l # 47s у меня

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

Неожиданно, но замена одной команды sort -u на две отдельные команды sort и uniq даёт выигрыш в скорости. Подозреваю, что дело в возможности распараллелить их работу.

time cat rockyou.txt | sort | uniq | wc -l # 43s

Дальше умудрённый опытом пользователь терминала обратит внимание, что команда cat в начале не нужна. Команда sort сама умеет работать с файлом. Убираем лишний cat и получаем ещё бонус в скорости.

time sort rockyou.txt | uniq | wc -l # 33s

А следующее изменение максимально нетрививальное. Команда sort сортирует в текущей кодировке пользователя, сейчас обычно это utf-8. А можно заставить sort работать в однобайтовой кодировке, что может сэкономить время, и, как выясняется, очень существенное.

time LC_ALL=C sort rockyou.txt | uniq | wc -l # 5s

В результате наших действий мы в десять раз сократили время получения уникальных строк в файле. Напоминает про часто поднимаемую тему 10x-разработчиков про десятикратную разницу между крутыми и посредственными разработчиками.

Заключение

На разных примерах мы продемонстрировали, как быстро решать самые разнообразные задачи, имея в своем арсенале навык работы с командной строкой. Некоторые заголовки и тезисы провокационны и с ними можно поспорить. Но можем сказать абсолютно точно – освоенный навык работы с терминалом становится базовым инструментом для решения многих повседневных задач. Терминал позволит материализовать ваши мысли: открыл терминал, похимичил и задача решена.

В канале DevFM мы делимся опытом разработки на python, проектирования систем, работой с базами данных и полезными тулзами. Присоединяйтесь!

Лига программистов

2K постов11.8K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

1
DELETED
Автор поста оценил этот комментарий
А я хочу добавить что средне между windows и Linux это Mac OS. Где то же есть каноничный терминал и brew as lost package manager for Mac OS. Ну и вот..
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

MacOS взяло в себя лучшее из двух миров, судя по отзывам. У меня опыта нет, но многие разработчики там и очень довольны

2
Автор поста оценил этот комментарий
Незнаю насчёт всего софта, но мой джентельнский набор в виде: VS, VSCode, mssql, dbeaver, postman, gitkraken, git, bitwarden, qbittorrent, gimp, ff ну и ещё какой-то мелочевки все есть:)
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Спасибо за опыт. Раньше приходилось десяток exe тыкать для установки нужного софта, рад, что сейчас стало лучше

показать ответы
1
DELETED
Автор поста оценил этот комментарий

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

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

Тут как с вимом, когда начал использовать, понял, что больше не хочу трогать мышь, но и настраивать его до уровня ИДЕ не хотел, хорошо что он есть плагином в моем любимом редакторе.

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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


Я поделился своим опытом, что именно я считаю крутым и удобным

0
Автор поста оценил этот комментарий

есть еще wsl

и у винды есть повершел  - тож свой шел

фар - лучшая надстройка над шеллом - но его нет в юниксе, или уже появился?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

У powershell есть как плюсы, так и минусы. Но я говорю со своей колокольни про то, что хорошо знаю)


вы про FAR Manager? есть, конечно

0
Автор поста оценил этот комментарий

А вирус для Linux, запущенный, не из под root - сможет зашифровать ваши данные?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Конечно. Будут зашифрованы те данные, которые доступны пользователю

0
DELETED
Автор поста оценил этот комментарий

Каким боком тут линукс?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Потому что человек работает на линуксе)

показать ответы
DELETED
Автор поста оценил этот комментарий

А можно пкм на файле и открыть с помощью. То же можно сделать и ярлыком, в который прописать нужную команду. Я не понимаю, при чём тут линукс

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Человек не хочет искать свежий файл. Даже открывать проводник не хочет. Он хочет команду, чтобы оно всё за него делало, быстро и удобно

показать ответы
0
Автор поста оценил этот комментарий

...а чтобы такие "мануалы" стали не нужны, берешь макось и работаешь как в виндах, плюс пользуешься всеми плюшками никсов.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Для автоматизации будешь вынужден к подобным скриптам спускаться, разве нет? Я слышал про автоматизацию в alfred, но опыта не имею

DELETED
Автор поста оценил этот комментарий

Потому что зачем, когда есть специальный ярлык

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Потому что это позволяет автоматизацию делать. Например, на хабре пришёл товарищ с вопросом, а как бы мне запустить в дефолтном приложении самый свежий файл из загрузок? То есть use case - я скачал pdf, хочу его открыть. Или скачал docx, или jpg. В итоге он сделал себе alias с открытием последнего файла и пользуется

показать ответы
Автор поста оценил этот комментарий

Консоль это не круто… вас обманули и заставили в это поверить…

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Уже лет 15 как я пожинаю плоды этого обмана и бед не знаю)

показать ответы
2
Автор поста оценил этот комментарий

Во-первых, не надо путать теплое с мягким, Ansible и K8s не заменяют, а дополняют друг друга.

Во-вторых, вы не распарсили мысль про питон, равно как и другой яп и на эту тему на хабре вам все популярно объяснили.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Лет 5 назад ansible активно юзали, чтобы настраивать сервера. Сейчас в среднем пришли к тому, что ansible избыточен, если достаточно небольшого скрипта установки - вернулись к тому, что ansible пытался убрать)


Естественно, на питоне писать куда приятнее. Но у каждого инструмента своя область применения, и bash вот уже 30 лет стоит на своих позициях и достаточно слабо сдвигается. У меня был опыт разработки системы в 2к+ строк на bash, никому такого не пожелаю


И bash позволяет по щелчку пальцев решать многие задачи, где для других ЯП нужно садиться и писать код. По скорости получения результата конвейер на баше значительно обгоняет прочие альтернативы


На хабре весьма продуктивная дискуссия прошла. Там можно почитать обе стороны, как любителей bash, так и нелюбителей. Здорово же

2
Автор поста оценил этот комментарий

Пахнуло красноглазым фанатизмом 20-летней давности. Все это есть c winget, msi, powershell, python. Кстати о последнем, не задумывались почему взлетел ansible? Да потому что шелл-скрипты и cli-утилиты работают по-разному не только в Linux/BSD, но даже в debian/redhat-based дистрах. Линукс давно уже всратый зоопарк тухлого неподдерживаемого говна и не сдох только из-за докера.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ansible как взлетел, так и угасает. Сейчас все стремятся к тонким хостам, где всё в докере

показать ответы
1
Автор поста оценил этот комментарий

msi появился всего на год позже apt, но синдром утенка такой синдром))

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Так большинство софта распространялось в виде exe, слабо готового к установке с помощью автоматизации. Где-то были quiet ключи, но далеко не везде

4
Автор поста оценил этот комментарий
Легко установит софт так же актуально и на windows. Есть команда winget
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

В apt почти весь софт мира. Да, что-то не совсем актуальное, типа virtualbox или докер - но это решается добавлением стороннего репозитория софта, а дальше работа снова через apt. В windows мире так? Я несколько отстал от текущих реалий винды, например, Microsoft Store вообще не использовал и оценить удобство не могу


Но в целом статья про удобство терминала и CLI вообще, а линукс в частности

показать ответы
DELETED
Автор поста оценил этот комментарий

Терминал может всё, потому что все утилиты предустановлены. То же самое делается и в винде без каких-либо проблем. А запустить браузер из терминала - это как пить кофе через трубочку

раскрыть ветку (1)
Автор поста оценил этот комментарий

Я про запуск любого GUI-приложения из терминала. Почему, собственно, нет?

показать ответы
1
DELETED
Автор поста оценил этот комментарий
На винду есть mingw, активно им пользовался до перехода на мак.
раскрыть ветку (1)
Автор поста оценил этот комментарий

У меня был опыт с Cygwin. Это попытка принести кусок линукса в винду. Не очень удобно, на мой взгляд, но лучше, чем ничего. Сейчас эту задачу с лихвой решает WSL

2
DELETED
Автор поста оценил этот комментарий

Если в винде терминалом не пользуются, значит он не нужен, и всё легко делается мышью

раскрыть ветку (1)
Автор поста оценил этот комментарий

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


Я не утверждаю, что путь через терминал - единственно верный. Делюсь своим опытом, где мне терминал помогает ежедневно и почему я им активно пользуюсь

показать ответы
1
DELETED
Автор поста оценил этот комментарий

В линуксе просто изначально он есть. Для винды нужно его просто установить. Не вижу разницы между системами для разработчика

раскрыть ветку (1)
Автор поста оценил этот комментарий

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

показать ответы
0
DELETED
Автор поста оценил этот комментарий

И при чём тут линукс?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Потому что в линуксе дефолтный шелл уже достаточно хорош для решения этих задач

показать ответы
2
DELETED
Автор поста оценил этот комментарий

Это не удобство линукса, а удобство терминала. Каждая используемая команда - отдельная утилита, которая так же легко ставится на винде. Про линукс тут вообще ни слова

раскрыть ветку (1)
Автор поста оценил этот комментарий

И глобально - это философия Unix, где каждая команда делает что-то одно, и делает это хорошо. А ОС предоставляет клей для объединения этих команд в единый технологический тракт


Много ли разработчиков в Windows активно юзают терминал? Насколько мне известно, нет. А в Linux терминалом увлекаются очень многие. На мой вкус, это хороший аргумент в сторону "в линуксе удобный терминал", не находите?


Про "поставить на винде" не совсем понял. Если вы про WSL, то это эмуляция линукса. А без WSL такую красоту не получить. Да, можно получить что-то своё, например, PowerShell с его объектной системой местами неплох

показать ответы