Зачем bash – разработчику

Desc: Why developers need to know bash, зачем разработчику знать bash
Lang: ru
PubTime: December 4, 2019
Tags: bash, bash is usefull

Всем привет!
Сегодня в нашу редакцию поступил вопрос:

А нужен ли bash фронтенд-разработчику и если нужен, то зачем и на каком уровне?

И на этот вопрос, как обычно бывает, невозможно дать однозначного ответа. В общем случае ответ – нет, не нужен. Скорее всего вас никогда не заставят написать ни строчки на bash. Вас даже не заставят читать bash-скрипты.
Но, в то же время, возможно вы сами захотите пользоваться bash.

История

Со мной было так: у нас, в HeadHunter принято все ветки в git, именовать по номеру задачи, из внутренней треккер-системы. Аналогично принято добавлять номер задачи в начало каждого commit-сообщения. И, на самом деле, написание commit-сообщения – это довольно тривиальная операция, но ее приходится выполнять по несколько десятков раз за день.

!- Articles/Зачем bash – разработчику/Untitled.png

В какой-то из дней меня достало выполнение одних и тех же операций:
выделить номер ветки, который указан в shell prompt, скопировать его, вставить в начало commit-сообщения.
И я заинтересовался – можно ли как-то автоматизировать эту операцию, ведь вот оно, название ветки, к нему можно получить доступ, вот оно сообщение коммита, и мне повезло, я знал о существовании такой вещи, как git-hooks (подробнее можно прочитать тут).

Оказалось, что если воспользоваться хуком prepare-commit-msg, который выполняет указанный bash-скрипт, ровно за момент до того, как сообщение о коммите запишется в систему, то можно добавить к этому сообщению любую информацию, в том числе и номер ветки.
Получился вот такой скрипт:

# Automatically add branch name to every commit message except merge commit.

COMMIT_EDITMSG=$1 # тут изначальный текст сообщения

# запишем в переменную имя текущей ветки
NAME=$(git rev-parse --abbrev-ref HEAD)

# проверим, что это не merge-commit, так как для него номер ветки добавлять не нужно
MERGE=$(cat $COMMIT_EDITMSG|grep -i 'merge'|wc -l) 

# проверим, что номера ветки в названии еще нет (на случай, если мы редактируем
# предыдущий commit-message, в котором уже указана ветка)
DUPLICATE=$(cat $COMMIT_EDITMSG|grep -i $NAME|wc -l)

# наконец, в случае, если это не merge-commit, в тексте коммита нет номера ветки
# и название ветки не HEAD (может быть в некоторых случаях)
if [ $MERGE -eq 0 -a $DUPLICATE -eq 0 -a $NAME != "HEAD" ] ; then

		# то мы просто выводим оригинальный текст сообщения, добавив в начало,
		# название ветки
    echo "$NAME $(cat $COMMIT_EDITMSG)" > $COMMIT_EDITMSG
fi

Примерно так выглядел мой первый опыт написания bash-скриптов. Это было немного больно, долго и потребовало активного использования google, но результат превзошёл ожидания – больше мне не приходилось делать рутинных операций, я больше не могу «забыть указать номер ветки» и не могу в нём ошибиться.

Ответ

Не важно frontent-разработчик вы или backend – рано или поздно вам, в вашей работе встретится операция, которую вам будет выполнять очень лень, но она будет полезной, и очень нужной. В этом случае, я надеюсь, вы сами вспомните о том, что существует bash и попробуете ее автоматизировать или, хотя бы, облегчить.
А по-поводу необходимого уровня – он может быть любым, но вам важно научиться формулировать свою проблему, чтобы найти решение в поисковике. Все популярные, сложные и не очень, вопросы, уже давно отвечены на каком-нибудь stackoverflow.

Важное альтернативное мнение

На самом деле совсем не обязательно пользоваться именно bash, его основное преимущество в том, что его интерпретатор есть почти в любой операционной системе на базе *unix, в отличие от того же nodejs.
Но вот python почти так же распространён, особенно, если мы говорим о пользовательских системах, поэтому если bash вам не нравится, то просто напишите свою программу на питоне, а на bash напишите одну строку, которая вызовет вашу программу. Или еще проще, используйте «шебанг» #! /bin/python , который скажет операционной системе, что текущий файл нужно интерпретировать не при помощи bash, а при помощи python