Pull to refresh

Comments 29

Посмотрел минут 5 из вашего курса по bash из любопытства.

И вижу у вас стандартный методологический косяк: не разделяются понятия «команды» и «утилиты». Просто чуть более точная терминология позволит не образовываться каше в голове. Видел я уже людей, пытающихся делать 'sudo cd'.
Спасибо за ревью, учтем в будущих реинкарнациях.
Вы практику еще зацените ;)
А на какой уровень там курс вообще? Потому что некоторые вещи ведь и «команды» и «утилиты» одновременно. Скажем "[" (не путать с "[[" !).

P.S. А вообще bash — это, конечно, что-то с чем-то. Много вы знаете языков программирования для которых задача «запомнить где-то значение переменной, чтобы потом восстановить его» была бы сложной проблемой, а не чем-то с чего описание языка бы начиналось?
Если иметь ввиду, что bash это не язык программирования, а shell, среда для более-менее удобного запуска других программ и согласования их работы, то многое становится на свои места.

Не понимаю, где вы увидели сложности в «запомнить где-то значение переменной»
FOO=$BAR

нет?
Вероятно имеются в виду более сложные случаи, когда значение переменной присваивается послее пайпа или в сабшелле.
Там действительно всё не так тривиально.
$ cat file
woo
hoo
$ wii=1 ; cat file | while read title ; do wii=$title ; echo $wii ;  done ; echo $wii
woo
hoo
1
Да, конкретно этот случай можно несложно обойти, например так:

$ wii=1 ; while read title ; do wii=$title ; echo $wii ;  done < file ; echo $wii
woo
hoo
hoo
правда, нужно помнить, что файл не должен заканчиваться на \n (иначе в конце получится пустая строка).
И вообще обо всей этой кухне нужно знать.
>И вообще обо всей этой кухне нужно знать.

Боюсь сейчас начнут минусовать, но как по мне лучше все же для более сложных вещей использовать python или go.
На bash много всего можно сделать, но вот приходится переодически выкручивать мозг и пусть лучше он останется для фана, чем развивать в себе башизм.
Программа на python'е, увы, далеко не на каждой системе запустится, увы. go для простых скриптов может быть просто слишком велик (несколько мегабайт рантайма), так что без bash'а, увы, часто не обойтись.

В идеале, конечно, нужно писать на posix shellе, но там даже массивов нету (а без них очень тяжело корректно работать с командными строками), да и с переносимостью на практике всё… не очень (на системах где есть современный posix shell всегда есть и bash, а если bash'а нету, то часто и всяких вещей типа "[[" нету тоже).
Для администрирования работа на любой кофеварке не требуется, там проще указать в требованиях yum install python сразу после установки и не выкручивать мозги башем.
У разработчиков да, тащить здоровый рантайм для установочного скрипта некомильфо. Хотя в VMware плевать на это хотели и для пары скриптов в VMTools требуют Perl.
Да ладно там VmWare, вон некоторые производители типа HP аж Java с tomcat тащат для управление стримером, а аж чуть не подавился. Perl это просто рай я считаю.
Такие «веб-интерфейсы» встречают довольно часто, а у VMware реально скрипт на десять строк, который меняет хостнейм, настройки сети и пароль у рута, при этом ему всё равно нужны net-tools ведь вставить проверку ОС и параметры для NetworkManager — нереально сложная задача.
Я тут вспомнил как для управление RAID!!! приходилось ставить java.Скрипт запуска на универсальном наше был такой, сохранил на память. Пришлось его править руками, точнее в storagnt sed -e “s/0-6/\ 1-6/g” -i stor_agent иначе выдавала ошибку.

start() {
  echo "starting Adaptec Storage Manager agent ..."
  kill `ps axwww | grep java | grep StorMan | grep ManagementAgent | cut -b 1-6` 1>/dev/null 2>&1
  sleep 2
  kill -9 `ps axwww | grep java | grep StorMan | grep ManagementAgent | cut -b 1-6` 1>/dev/null 2>&1
  sh /usr/StorMan/StorAgnt.sh >/dev/null 2>&1 &
  sleep 1
  echo
}

                                                                
stop() {
  echo "stopping Adaptec Storage Manager agent ..."
  kill `ps axwww | grep java | grep StorMan | grep ManagementAgent | cut -b 1-6` 1>/dev/null 2>&1
  sleep 2
  kill -9 `ps axwww | grep java | grep StorMan | grep ManagementAgent | cut -b 1-6` 1>/dev/null 2>&1
  sleep 1
  echo
}

>Программа на python'е, увы, далеко не на каждой системе запустится, увы.

Честно говоря, я уже с трудом могу представить на каких системах python не запустится.
Уж в популярном RH и Ubuntu с Suse вставлено во все места и причем давно.
Если мы говорим про embendend решение, так и там уже стали не ломать себе мозг, но обычно там целенаправленно все пилят.
Ну и вы правильно заметили, что с таким подходом надо использовать posix shell.

В общем для фана и изучение да, но вот реальное писать нет, так как универсальность там страдает.
Код читать тяжко итд.
Честно говоря, я уже с трудом могу представить на каких системах python не запустится.
Вы лучше скажите на каких запустится. Что вы напишите в шебанг? В одних системах это /usr/bin/python2, в других /usr/bin/python3 (а /usr/bin/python может и вообще не быть в зависимости от фантазий автора дистрибутива).

То есть как ни крути вам потребуется вспомогательная программа, которая найдёт у вас в системе python! И на чём вы её будете писать, спрашивается?
env вам в помощь, это раз.
Я пока не видел системы с pyhton3 и что бы было проблемы с python2.
Ну и окружение virtualenv еще не отменили.
env вам в помощь, это раз.
Это, увы, только первый шаг. То есть да — это, в общем, решение, но это значит, что вам придётся поддерживать ещё больше разных версий python'а, так как env «увидит» не только системные python'ы, но и всякие python'ы из MacPorts и прочее.

Я пока не видел системы с pyhton3
Вам, значится, сюда. Усё будет. Скоро. Ждите.

и что бы было проблемы с python2.
В смысле с /usr/bin/python2? MacOS X. Там есть /usr/bin/python, а вот /usr/bin/python2, увы, отсутствует. Причём в каком-нибудь Arch'е /usr/bin/python — это Python 3. Вам рассказать что-нибудь про «изумительную совместимость» этих двух разных языков? Особенно с учётом того, что мы говорим об отдельно взятом скрипте и не хотим «грузить» пользователя установкой всяких добавочных модулей?

Да, все эти проблемы разрешимы и, в конечном итоге, сделать скрипт на python'е, которую можно просто скачать и запустить возможно (слава богу python2.4+ может запускать .ZIP файлы) — но для этого вам нужно будет сделать столько работы и навернуть столько разных приблуд, что мама не горюй.

И, скорее всего, результатом будет не «простенький скрипт», который хотелось породить изначально, а ZIP-архив с кучей модулей, большая часть которых будет посвящена борьбе с разными версиями python'а и прочими отличиями в системной конфигурации.

Заявлять после этого, что вы выбрали python потому что работать с bash'ем неудобно… как-то язык не поворачивается… да, синтаксис не очень, есть кой-какие проблемы, но по сравнению со всем вышеописанным…
Вы придумали проблем, там где их нет.
В системе как не странно может не быть bash, ash,ksh итд.
Вы реально думаете, что большенство разработчиков в компании сидят такие и думают, как бы блин нам все угодить, что бы везде работало? Пишут на чем могут, а если у тебя этого нет то ты сам себе дятел. Мы написали на java 6, то что там у тебя уже java 8 да пофиг.

Если брать про питон, то можно писать вполне себе и для 2 и для 3 если такая задача ВДРУГ стоит.
Писать проще и легче.
Если мы дальше говорим про модули, то вот где гарантия что у человек может стоять awk например? sed?
Почему я вспомнил, да так как такие конструкции сплошь и рядом. Одни для определения ip вызывают ifconfig, другие ip. Где гарантия, что у меня стоит iproute?

В общем к чему я это все, к тому, что если надо быстрое, простое и примитивное то ok.
Все, что пошло сложнее — заставляет лично меня выворачивать руки и мозг. Страдать башизмом.
Да можно на bash сделать эмуляции двухмерного массива или еще чего, но зачем?
Можно забивать гвозди микроскопом, причем парой очень удобно, пробовал.
Но лучше все же для этого использовать молоток.
Если мы дальше говорим про модули, то вот где гарантия что у человек может стоять awk например?
однако
sed?
Разумеется. А также dd, tr и много всего другого интересного.

Тот факт, что есть люди, которые делают всё через «одно место» не означает, что стоит игнорировать существование стандартов.
В том-то и дело, что нет.

$ declare -A BAR=([a]=x [b]=y)
$ FOO=$BAR
$ echo "|${BAR[a]}|"
|x|
$ echo "|${FOO[a]}|"
||

Насчёт того язык программирования bash или нет можно спорить, но если вы скачаете с какого-нибудь GOG'а игрушку, то получить файл мегабайт в 100 размером, который будет-таки shell-скриптом… строк на 500, примерно (остальное — это «приклеенный в конец» архив), но всё-таки в нём будут и функции и циклы и много чего другого.
Надо будет посмотреть GOG, но если это и так — то это не означает, что путь верен и надо так делать.
А как надо делать? Вам всего-навсего нужен инсталлятор, который разберётся в том, что у вас где стоит, найдёт в системе нужные компоненты (библиотеки, X'ы, python, в конце-концов) и разложит все файлы нужным способом. Конечно написать такую штуку можно на чём угодно, но… как потом сделать так, чтобы ваше творение у человека запустилось? Написать ещё один скрипт для запуска того скрипта? Так тоже иногда делают, но, в конечном итоге речь идёт не том, чтобы обойтись без shell-скрипта, а о том, что сделать в этом скрипте, а что — уже в самой программе. Альтернативы, по большому счёту, нету. То есть нету от слова «совсем». Даже если вы сделаете какой-нибудь RPM или DEB пакет настроечная часть будет, опять-таки, shell-скриптом!

Ну нет ничего другого в Linux (да и в POSIX), что стояло бы везде и везде в известном месте!
bash может как не странно, точно также может быть в разных местах.
Серебренный пули тут нет. Я не первая инстанция, что бы меня спрашивать как делать. Каждый вправе делать так, как он хочет и может. Я сам был упоротым по bash одно время, но просто если «код» начинает переваливать разумные значения с простым функционалом, то явно тут что-то не то.
Я не первая инстанция, что бы меня спрашивать как делать.
Ну это какая-то уж совсем неконструктивная критика: сказав А (это не означает, что путь верен и надо так делать) скажите уж и Б (а как, собственно, нужно?). Иначе и обсуждать нечего, сплошная демагогия…

bash может как не странно, точно также может быть в разных местах.
Может. Но /bin/bash присутствует на большинстве систем (в том числе на MacOS X). Если очень нужно поддерживать всякие странные системы типа FreeBSD можно использовать env, как вы уже говорили.

Я сам был упоротым по bash одно время, но просто если «код» начинает переваливать разумные значения с простым функционалом, то явно тут что-то не то.
Тут как бы вопрос сразу: а что вы понимаете под «простым функционалом»?
>Тут как бы вопрос сразу: а что вы понимаете под «простым функционалом»?

Скрипт больше 300 строк заставляет меня задуматься написать на чем то другом.
Странно, почему в курсе даже не затронули такую важную вещь, как циклы…
Этот курс не про программирование, а про то как пользоваться консолью для тех кто ее никогда в жизни не видел.
И как мне пользоваться консолью без циклов, извините? Как мне обработать больше, чем один файл? Скажем какая-нибудь простейшая задача переименовывания файлов так, чтобы они все были в одном регистре. Как это сделать — понятно:
$ find -type f -print0 | while IFS='' read -r -d '' f ; do mv "$f" "$(printf '%s' "$f" | tr [:upper:] [:lower:])" ; done
В скрипте я, понятно, заведу переменные, чтобы избежать сообщений « «x» и «x» — один и тот же файл », если команду нужно выполнить один раз, то, пожалуй, я о таких «нежностях» забуду, но как без циклов-то обойтись?
Какой-то уж, совсем-совсем, детский курс. И таки за это раньше деньги платили?
Плата идет за доступ ко всему контенту на проекте, а не за отдельные курсы.
Sign up to leave a comment.