LINUX.ORG.RU

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

 ,


5

7

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

На ЛОРе регулярно возникает топик, где кто-нибудь просит помощи с bash-скриптом. Попробуй там, покажи всем насколько легче решить задчу питоном.

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

на самом деле, и bash (вкупе со всем юниксовым подходом), и питон и Power Shell — оба говно и одинаково ни хрена не умеют.

Казалось бы, такая простая задача — вывести список всех локально подключённых девайсов, с названиями их производителей. Но все эти язычки садятся на ней в лужу.

Legioner

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

Казалось бы, такая простая задача — вывести список всех локально подключённых девайсов, с названиями их производителей. Но все эти язычки садятся на ней в лужу.

lspci, lsusb ?

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

ну вот lsusb сделал и получил:

Bus 001 Device 003: ID 0a5c:4500 Broadcom Corp. BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)

и все остальные строчки замусорены в том же духе.

а надо как-то так:

Устройство: Bus 001 Device 003: ID 0a5c:4500 Производитель: Broadcom Corp. Модель: BCM2046B1

ну или так (если следовать строго условию, указанному выше):

Устройство: Bus 001 Device 003: ID 0a5c:4500 Производитель: Broadcom Corp. 
next_time ★★★★★
()
Последнее исправление: next_time (всего исправлений: 1)

Нужно что-то конечно построже, лишенное недостатков, но проще и красивее питона и не теряя возможностей баша.

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

не точно, разбиение по процессам уже есть, разбиение по категриям (attr autogroup auxv cgroup ...) тоже уже есть, ну да внутри надо в основном распарсить имя:значение, не сильно то и долго и муторно, ни что не мешает использовать уже готовый код или один раз написать свой

novoxudonoser
()
Ответ на: комментарий от iVS

поздняк метаться. из-за этого патча придётся полсистемы переделывать.

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

ну да внутри надо в основном распарсить имя:значение

только вот, в общем случае, это невозможно (см. пример выше) + парсинг текста жрёт ресурсы.

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

см. пример выше

man cut

парсинг текста жрёт ресурсы

в мире где частоты процессора измеряются гигагерцами объём памяти гигабайтами сеть сотнями мегабит

мы всё ещё считаем ~100 тактов цп и ~1кб памяти

novoxudonoser
()
Ответ на: комментарий от next_time

Казалось бы, такая простая задача — вывести список всех локально подключённых девайсов, с названиями их производителей. Но все эти язычки садятся на ней в лужу.

А почему язычки должны парсить за тебя sysfs?

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

Для скриптописания сносно, можно ещё rc посмотреть для скорости.

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

man cut

см. выше

мы всё ещё считаем ~100 тактов цп и ~1кб памяти

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

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

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

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

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

Да банально хочешь получить аргументы запущенного процесса в виде массива. >Тебе надо читать cmdline и парсить его по пробелам. Или по \0. Хочешь >посмотреть установленные лимиты? Открывай текстовый файл limits и парси его.
Каждой функции по парсеру.

Yea bro! А ты думал в рай попал?

Да, я думал, что надо применять нормальное объектно-ориентированное API для создания прикладных программ.

Кстате у вас в фиииндооууусЪ вообще жопа :) Вон коллега парился писал чёй то для Эксчейнджа на мошнойщели ..... а потом попытался запустить это на просто DC ;)))) Так вот - тав _ВНЕЗАПНО_ вообще нужных обЪектов не оказалось :))) А чтобы они появились - на DC надо пол Эксчейнджа взгрмоздить :)))

Чагой то у нас? В венде в целом дерьма хватает. А .NET это хорошая открытая кроссплатформенная технология.

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

Вот как это делается на Java с гипотетической библиотекой:

for (Device device : os.getConnectedDevices()) {
    System.out.printf("%s from %s%n", device.getDescription(), device.getVendorName());
}

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

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: PowerShell от next_time

Предполагаю, что это потому, что это shell для программистов. Чтобы его эффективно использовать, надо хорошо знать .NET. Админы его не знают, а программистам сильно автоматизация и не нужна, ну а кому нужна, те молча решают свои задачи и не отсвечивают.

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

присоединяюсь к вопросу любителям баша

задачу поставил next_time

Казалось бы, такая простая задача — вывести список всех локально подключённых девайсов, с названиями их производителей. Но все эти язычки садятся на ней в лужу.

вопрос задал легионер сообщением выше, я просто повторю для удобства:

Вот как это делается на Java с гипотетической библиотекой:

for (Device device : os.getConnectedDevices()) {
    System.out.printf("%s from %s%n", device.getDescription(), device.getVendorName());
}

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

cast alozovskoy, entefeed, RADDyomin, Stanson, slovazap, Zmicier, chinarulezz, novoxudonoser, Kroz, gh0stwizard, iVS, ugoday, tailgunner, korvin_, mky

AndreyKl ★★★★★
()

Если в баше все так плохо, не пора ли переспать

Хороший вброс.

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

вывести список всех локально подключённых девайсов, с названиями их производителей.

Дааа, вот уж вброс так вброс, по всем канонам. Для тех, кто не понял - это явно именно та задача, с которой сталкивается любой админ ну прям таки ежедневно.

Ну да ладно. Держи:

$ lspci -v; lsusb -v

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)
Ответ на: комментарий от AndreyKl

Теперь моя очередь ставить задачки. Что там у вас, java?

Казалось бы, такая простая задача — проиграть все mp3/flac файлы в каталоге в случайном порядке. Но все эти язычки садятся на ней в лужу.(C)

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

По ссылке: всегда так делал.
По мне так давно уже пора кому-нибудь запилить гибрид bash и python. А то вон на оффтопо-вражеском PowerShell какие финты вытворяют, и даже классы подключать из библиотек можно...
А наш любимый bash, как и был тормозным, неповоротливым, и костылефильным, так и остался.

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

Ну да ладно. Держи:

задача в том чтобы вывести в человеческом формате, как на жабке сделано. Просто выведи в строке девайс и производителя, не надо мусора на 5 страниц. Даже пример у тебя есть на жабке.

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

О, поймал одепта. Расскажи пожалуйста, чой-то все на zsh сидят? Чем он так крут? Можно ссылками(на что-нибудь русское, и разжёванное, типа bash vs zsh).

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

Казалось бы, такая простая задача — проиграть все mp3/flac файлы в каталоге в случайном порядке. Но все эти язычки садятся на ней в лужу.(C)

1) ты не дал примерчика баш кода

2) на жабке, с гипотетической библиотекой (я кстати не понял, тебе без повторов или с повторами? если что у меня без повторов.)

Player.playUniqRandomDir("/dir/", "flac, mp3");

3) ну и с повторами до кучи

Player.playRepeatableRandomDir("/dir/", "flac, mp3");

4) а может тебе рекурсивно?

Player.playRepeatableRandomDir("/dir/", "flac, mp3", true);

5) рекурсивно без повторов?

Player.playUnqueRandomDir("/dir/", "flac, mp3", true);

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

Хотите, или не хотите, дорогие участники треда, мы должны признать, что у Bash, с точки зрения ЯП есть определённые проблемы. (Заметьте, с точки зрения ЯП, а не с точки зрения файла, который хранит 2-3 строчки для выполнения команд.)

  • У Bash нет ссылок. Нельзя сделать ссылку на переменную, и передать её в качестве аргумента. Даже если эта ссылка будет юзабельна только внутри bash, и его функций. Нет, то, что есть у Bash сейчас, ссылками назвать нельзя. Потому что передаётся название переменной, а не её адрес.
  • У Bash есть всего 4 типа данных. Строка(самый основной), целое число, массив, и хэш. Ничего другого не дано. И заметьте, типа данных с точкой, даже не подразумевается. В связи с предыдущим пунктом, передавать массивы и хэши в качестве аргумента функции - невозможно. Любая попытка передать целочисленное число, приведёт к преобразованию его в строковой тип, в связи с ограничениями языка. Вот и получается, что единственное, чем функции в bash могут друг друга кидаться, это строки. Хочешь передать массив? Сформируй строку с определённым разделителем, или вообще строку, полностью повторяющую объявление массива в bash, а потом кидай это в eval(как мило, не так ли?). Ну или как-нибудь по другому передай строку, а потом упорно разбирай, что же там функции такого передали...
    Я соглашусь, это до боли просто. Нет ничего проще строк. Но эффективность такого метода - стремится к нулю. Особенно учитывая общую тормознутость bash.
  • Т.к. в Bash полностью отсутствует определение «число с точкой», математика с такими числами невозможна в рамках bash. Bash умеет в математику(для чего же еще нужны «$(( ))»?), но только в целочисленную. Для всего остального обычно, насилуется bc, или perl.

Если захочется, можно еще чего вспомнить(я описал только то, что меня беспокоит). Чего только стоят костыли... И использовать его для чего-то более, чем говноскриптики, это как минимум изнасилование. В принципе, ни для чего более он и не нужен.

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

Расскажи пожалуйста, чой-то все на zsh сидят?

Автокомплит лучше чем в баше. Полно тем (oh-my-zsh на github). Бесит только настройка клавиатуры и игнор .inputrc. Скриптов на zsh не писал, ибо они по сути локалхостовые, хотя плюшек там достаточно. Список фич: http://en.wikipedia.org/wiki/Z_shell

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

Бесит только настройка клавиатуры и игнор .inputrc.

А чего там настраивать? И что даёт .inputrc? Ни разу туда не залезал.

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

Player.playUniqRandomDir(«/dir/», «flac, mp3»);
Player.playRepeatableRandomDir(«/dir/», «flac, mp3»);
Player.playRepeatableRandomDir(«/dir/», «flac, mp3», true);
Player.playUnqueRandomDir(«/dir/», «flac, mp3», true);

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

player --play --random --repeat --dir="/dir" --ext="flac,mp3"
, а?

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

задача в том чтобы вывести в человеческом формате, как на жабке сделано.

Ничего не сделано.

Вот так это выглядит на баше с гипотетической «библиотекой»:

lsdevice --printf "%devid from %vendor_name"

Шах и мат.

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

Любыми. Продолжать использовать, что душе угодно. Я не агитирую за выбрасывание баша.

К слову, пока аналитики в треде кукарекают, разработчики пишут шелл-скрипты

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

Erlang не является официальным языком расширений GNU.

Puzan ★★★★★
()

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

А зачем ты запускаешь скрипт на неправильно называнных файлах? Только первая половина ASCII без запрещенных символов, никаких пробелов.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от nexfwall

чой-то все на zsh сидят? Чем он так крут?

Ничего сверхъестесвенного, zsh это тот же баш, но обогнавший его в развитии лет на 10-15. Т.е. просто баш будущего с человеческим лицом

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

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

for(device in `{getConnectedDevices}) {
	echo `{getDescription $device} from `{getVendorName $device}
}
korvin_ ★★★★★
()
Ответ на: комментарий от iZEN

tcsh выглядит интересно (использую как дефолт после логина - меньше жрёт). Есть интересные примеры скриптов на нём и вообще истории успеха?

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

Вот как это делается на Java с гипотетической библиотекой:

А откуда возьмётся эта гипотетическая библиотека? Получается, что ты переложил на неё все задачи парсинга.

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