Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$ [ a < b ]
равносильно$ test a < b
отсюда и ошибка b: No such file or directoryНе совсем так, а чаще всего не так:
ubuntu@stage:~$ type [ [ is a shell builtin ubuntu@stage:~$ type [[ [[ is a shell keyword ubuntu@stage:~$ type test test is a shell builtin ubuntu@stage:~$ which test /usr/bin/test ubuntu@stage:~$ which [ /usr/bin/[
Чаще всего при вызове [ ] вызывается shell builtin
set -o errexit
не работает внутри функций, поэтому по-осторожнее с заворачиванием всего и вся в функции при использовании этого.#!/bin/bash
в шебанге, но не будут с #!/bin/sh
.$ (false | true) && echo true || echo false
true
$ set -o pipefail
$ (false | true) && echo true || echo false
false
Параметры -v и -x можно задать в коде, это может быть полезно если ваш скрипт работает на одной машине а журналирование ведется на другой:
Для вас важна скорость/производительность.
$(
. Не придавайте этому значения — если вам придётся работать с UNIX'ами, где есть настолько старый shell, вы об этом так или иначе вскоре узнаете сами. POSIX рекомендует синтаксис $(
, бэктик `
провозглашён legacy — так что не мучайтесь понапрасну.$(
, но там вообще ни о какой совместимости речи не идёт.Нужно помнить что некоторые команды не возвращают код аварийного завершения например “mkdir -p” и “rm -f”.
$ grep "q" <<< "qweqweqwe"
qweqweqwe
Признаки того, что вы не должны использовать shell скрипты:
Ваш скрипт содержит более нескольких сотен строк.
Вам нужны структуры данных сложнее обычных массивов.
Вас задолбало заниматься непотребствами с кавычками и экранированием.
Вам необходимо обрабатывать/изменять много строковых переменных.
У вас нет необходимости вызывать сторонние програмы и нет необходимости в пайпах.
Для вас важна скорость/производительность.
в программировании на шелле самое главное — читаемость и при этом неперегруженность кода.
Как вчерашний студент, который придет после вас, будет с этим всем работать?Как вчерашний студент будет разбираться с шелл-скриптами, которые в 80% случаев работают одним способом, а в 20% — по-другому. Подумаешь, там в начале стоял какой-то set чего-то там, это же не может так влиять. Вы же не будете комментировать каждый чих в скрипте? А если будете, то тут вообще пофиг, что это — шелл или не шелл, комментарий же есть :)
В случае других языков чаще всего придется выдумывать какие-то дополнительные ключи, параметры командной строки, добавлять дополнительную логику для их обработки, писать к этому хозяйству доки (как установить, как использовать).Т.е. шелл-скрипты вы не документируете? Ключи/параметры не используете, все hardcoded? И какая разница вызвать функцию в шелл-скрипте или php?
в вашей компании нет выделенного админа и их задачи выполняют между делом по мере надобности программистыИмхо, если в компании есть выделенные программисты и админ, то какие-то сложные задачи как раз нужно отдавать программистам, т.к. это их хлеб — писать программы.
Как вчерашний студент будет разбираться с шелл-скриптами, которые в 80% случаев работают одним способом, а в 20% — по-другому.
set
я использую только -e
, т.к. остальные плохо соответствуют принципу «least surprise».Т.е. шелл-скрипты вы не документируете? Ключи/параметры не используете, все hardcoded? И какая разница вызвать функцию в шелл-скрипте или php?
Имхо, если в компании есть выделенные программисты и админ, то какие-то сложные задачи как раз нужно отдавать программистам, т.к. это их хлеб — писать программы.
В каком смысле?Это я как раз про неприметные set'ы :)
задача управления системой, каким бы оно ни было сложным (или простым) — задача специально выделенного на это человека.Управление — это одно, а создание инструмента для управления — совершенно другое. Вы же используете grep, а не пишете его сами. Имхо, админ не обязан быть программистом. Если задача довольно сложная, то, опять же имхо, лучше подготовить для программиста адекватное техзадание, чем пытаться залезть туда, где ты не очень силен.
а в случае других скриптовых языков будет один большой скрипт с десятком параметров, которые нужно выдумать, описать, реализовать их обработку.Какая разница, на чем писать эти скрипты — на шелле или на чем-то другом? Вы что, не можете в этих 3 скриптах один написать на шелле, другой на php, третий на перле? Почему обязательно если шелл — то 3 простых скрипта, а если другой язык — одна большая программа?
Управление — это одно, а создание инструмента для управления — совершенно другое. Вы же используете grep, а не пишете его сами. Имхо, админ не обязан быть программистом. Если задача довольно сложная, то, опять же имхо, лучше подготовить для программиста адекватное техзадание, чем пытаться залезть туда, где ты не очень силен.
Какая разница, на чем писать эти скрипты — на шелле или на чем-то другом? Вы что, не можете в этих 3 скриптах один написать на шелле, другой на php, третий на перле?
Почему обязательно если шелл — то 3 простых скрипта, а если другой язык — одна большая программа?
И кстати, вы тут говорите про «маленькие скрипты», в какой-то мере подтверждая мое «нужно вовремя остановиться» :)
Моя первоначальная посылка — каждой задаче свой инструмент. Я же не говорю «не используйте шелл вообще». Я говорю — если у вас получается нагромождение обходных путей, то возможно пора уже посмотреть на другой инструмент.
Разница в том, что на шелле у нас 3, допустим, маленьких скрипта, которые принимают 1-2 параметра и документируют сами себя через имена параметров (запускаем без параметров и получаем usage), а в случае других скриптовых языков будет один большой скрипт с десятком параметров, которые нужно выдумать, описать, реализовать их обработку.Я обычно использую --help для usage (если неохота писать полноценную документацию: тогда --help будет и не для usage) и принцип garbage in — garbage out для запуска без параметров (т.е. если нет --help то скрипт может отработать как угодно, если ему требуются параметры (и как надо, если не требуются)).
cp --help
и dd --help
оба кажут справку, тогда как только cp
показывает справку без --help
. То же самое относится к редакторам, интерпретаторам (кроме стандартных sed и awk), различным GUI программам — все они показывают справку с --help и запускаются без аргументов. Есть и исключения, но их мало: намного меньше, чем программ с --help, но без справки при отсутствии параметров.-h
или --help
, посмотрю насколько это красиво будет. Спасибо за совет!Если ваш проект соответствует пунктам из этого списка, рассмотрите для него языки языки Python или Ruby.
Интересные приемы программирования на Bash