Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$ ./test.sh qwertyА если первую строку исправить, то вот это:
/bin/bash: #указываем где у нас хранится bash-интерпретатор: No such file or directory
$ ./test.sh qwerty
Вы запустили скрипт с именем ./test.sh и параметром qwerty\n
Вы запустили скрипт с именем $script_name и параметром $parametr1
2)
/usr/bin/vi # если $doing содержит 2, то запустить nano
;;
3)
/usr/bin/emacs # если $doing содержит 3, то запустить nano
Но, так или иначе, [ — это симлинк на testА если вы используете busybox, то у вас вообще все утилиты будут symlink'ом на один файл. Теперь будете говорить что ls, cp и rm — это одно и то же?
Просто некоторые считают [ ] конструкцией оболочки, в то время как это обычный запускаемый бинарник.Нет, это не «обычный запускаемый бинарник». Сравните:
$ touch test.txtПоведение встроенное команды и внешней отличается. Более того: внешняя команда живёт в /usr/bin и, соответственно, не может быть использована в rc-скриптах! В более старых shell'ах это был «обычный запускаемый бинарник», в bash — это конструкция оболочки. Совместимая на 99%, но, как вы говорите, «это всё уже тонкости»…
$ if [ -N "test.txt" ]; then echo "test.txt is modified"; else echo "test.txt is not modified"; fi
test.txt is modified
$ if /usr/bin/[ -N "test.txt" ]; then echo "test.txt is modified"; else echo "test.txt is not modified"; fi
/usr/bin/[: extra argument `-N'
test.txt is not modified
25 if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || (bprm->sh_bang))Куда там пробел вставлять?
26 return -ENOEXEC;
$ while IFS=':' read I J K r; do if ((K>1000)); then echo "$I"; fi; done < /etc/passwd | sort -rsort — это часть coreutils без которых bash использовать заруднительно. Работает? Да. Коротко? Несомнено. Сам чёрт ногу в этом сломает? Разумеется.
В моем выражении черт ногу не сломит, а в Вашем — да.В вашем понять что-либо ничуть не легче, поверьте. Особенно человеку не очень хорошо знающему awk. Тот факт что я с первой попытки написал работающую версию, а вы со второй — тоже говорит о многом.
Полагаю Вы согласитесь с тем, что «черт ногу сломит» зависит только от того, кто пишет.Не только. Важно ещё кто читает. Для меня версия с ипользованием bash'а без awk читается проще, к тому же она расширяется легче.
>зарегистрированных через /etc/passwd (а это, понятно, не все пользователи)Ну вот, например, с машины на которой я сейчас сижу:
приведите пример
$ cat /etc/passwd | awk -F ':' ' $3 >1000 {print $1}' | sort -rПричём всё же очевидно (мне даже в голову не пришло что про подобный вариант «развития событий» нужно говорить явно):
nobody
$ id -u
13197
$ cat /etc/pam.d/common-authИ после этого вы ещё рассуждаете о больших системах? Смешно.
auth sufficient pam_unix.so
auth sufficient pam_krb5.so retain_after_close forwardable refresh_creds use_first_pass
auth required pam_deny.so
Стандартный пул пользовательских uid'ов начинается с 1000.Обычно, но не всегда.
Это не грязный хак, это реальное использование unix систем, и если Вы не умеете использовать базовые утилиты и каждый раз городите свой велосипед на языка программирования — Вы не понимаете UNIX.Как видим на моём примере — это таки грязный хак. Список пользователей вообще не должен жить (и не живёт) в /etc/passwd, а для управления пользователями есть специальные утилиты.
Любой shell сценарий использует base утилиты из системы.1. awk далеко не во всех системах входит в base system, так что вы сами себе противоречите своим примером.
Во всех production системах awk входит в base-system.О как. Вот прямо даже так. То есть все системы где нет awk автоматически объявляются не-production?
Python — слишком сырой и использовать его для простых серверных скриптов может только фанатик.И в чём же заключается его сырость?
Если Вы не знаете базовых утилит unix — Вам лучше с ним распрощаться навсегда. Вам было бы полезно ознакмоиться с идеологией UNIX. Могу посоветовать книгу Эрика Рэймонда — «Искусство программирования в UNIX»А с чего вы решили что я ней не знаком? И что эту книгу я не читал? Или любой человек, прочитавший её и не воспылавший нежной любовью к awk автоматически записывается в душевнобольные?
Нет. На сервера принято ставитьтолько production системы, и всякие экзотические дистрибутивы к ним не относятся. А во всех боевых дистрибутивах awk есть.Кем принято? Когда принято? Почему принято? Что такое «боевой» дистрибутив?
Сырость заключается хотя бы в полной несовеместимости 2 и 3 ветки. Это достаточное условие.О как. То есть любая система, которая развивается (ну например bash, совместимость первой и второй версий оставляет желать лучшего) для production систем не годится. Хм… А что там вообще может быть установлено.
С того, что Вы не понимаете или не хотите призновать того, что в ней говориться.То есть любой человек, не согласный с выводами вашей «суперкниги» автоматически ничего не понимает в unix? Бред.
production системы(nix) — freebsd, и несколько дистрибутивов linux. Которые суммарно покрывают 98% серверных установок nix систем. Принятно ставить системными администраторами, которые имееют порядочный опыт работы.Если мы говорим о типичных средних конторах — то, пожалуй, соглашусь. Но на них свет клином не сошёлся и понятие «production system» они таки не покрывают. Является ли система, выпускаемая десятками миллионов экземпляров (как какой-нибудь WiFi-роутер) production системой? Явлется ли BluGene/L production-системой? По-моему вы слишком сужаете рамки того, что вы называете «production системой».
Bash был всегда sh compatible. Во всяком случае bash скрипты спокойно читались. О полном различии не может быть и речи.Наоборот: о 100% совместимости никогда не шло и речи. Например такая вещь как var2=$"$var1" превратилась в bash2 в var2=${!var1} — но при этом старый синтаксис перестал работать!
Использование развивающихся, сырых, не достаточно проверенных систем обычно не принятно на production системах.Если это принять за аксиому, то стоит принять также и факт, что python — не является таковой. Среди тех «нескольких дистрибутивов linux», о которых вы говорили выше есть и такой зверь как RHEL (RedHat Enterprise Linux — или вы скажете что и им никто не пользуется?). Там большая часть утилит администрирования написана на Python'е.
Вы можете использовать их у себя на тестовых машинах, но не в продакшн. За примерами далеко ходить не стоит. Гонка за всем новым и современным зачастую ничего не приносит кроме энергии, потраченной на установку этого нового и решения проблем, принесеннымм этим новым. Повторяюсь, речь идет о production системах. У себя дома — можете городить что хотите.Ух ты, сколько пафоса. Слова-то верные, но причём тут Python?
Вы книгу читали? Можете привести пункты, с которыми не согласны? И желательно аргументировать.Например его утверждения про полезность текстовые конфиги и хранения данных в текстовых форматах — весьма спорно. Активное использование текстовых конфигов обозначает что вы будете иметь миллион парсеров, которые будут пытаться парсить одни и те же конфиги и наверняка по разному! Использование чего-нибудь вроде Protocol Buffers или Apache Thrift ничуть бы не усложнило работу с конфигами (если забыть про bash), но дало бы возможность обойтись меньгим количеством «велосипедов». К сожалению историю нельзя повернуть вспять…
Любой shell сценарий использует base утилиты из системы.1. awk далеко не во всех системах входит в base system, так что вы сами себе противоречите своим примером.
Мне кажется Вы просто не имеете опыта работа с большим количеством серверов и не знаете реалий.Ну… смотря что считать «большим количеством серверов». В системах, с которыми работал я обычно было 100-200 серверов (в последнее время я сталкиваюсь с системами в 5'000-10'000 серверов, но вынужден признать что awk там есть… хотя python используется чаще) и они часто использовали специально под них заточенные дистрибутивы (да почти всегда — не годятся распространённые дистрибутивы под такие задачи без «обработки напильником»).
Вашу точку зрения я понял, и пытаться Вас переубедить — бесполезно, тем более что позиция Ваша достаточно откровенно выглядит глупой.Я всегда готов сменить точку зрения под давлением фактов, но вот как раз с ними-то у вас туго: я вижу кучу неверных утверждений, а не какие-то факты с которыми я был бы готов согласиться. Как-то: во всех production системах awk входит в base-system — неверно: я сам общался с системами где awk не было. Вполне production. Или:Сырость заключается хотя бы в полной несовеместимости 2 и 3 ветки. Это достаточное условие. Тоже бред: переход с Java 1.4 на Java 1.5 был довольно-таки болезненным и с совместимостью там были напряги. Что не мешает Java быть и оставаться одним из самых используемых на production системах языком. Ну и так далее.
Хотя бы потому, shell скрипты быстрее python аналогов. Примеры сможете привести, для чего использовался python на этих серверах?Shell скрипты, как правило, медленнее python аналогов. А уж при использовании RPC (а как вы ещё собираетесь управлять кластером в несколько тысяч компьютеров?) из bash'а — это превращается в такой кошмар, что говорить о скорости их написания не приходится.
Примеры production систем, где нет awk привести можете?Легко — любой WiFi router. Обычно там нет и python'а, но если вам нужен не один роутер, а система из нескольких сотен подобных зверей разбросанных по всему миру… в общем по-моему вы очень узко смотрите на понятие «production system».
Основы BASH. Часть 1