LINUX.ORG.RU

А какие сейчас есть актуальные замены (da|ba|k|)sh для скриптов?

 , скриптинг


1

4

Пишу сейчас очередной sh-скрипт с кучей вызовов awk, grep и sed. В связи с чем задумался об альтернативах. Попытался сформировать список черт, которые делают sh до сих пор актуальным инструментом:

  • Возможность легко и просто скомпилировать под любой утюг.
  • Отсутствие развесистой библиотеки, которую интерпретатор таскает с собой, а также как следствие — нет слома совместимости между версиями библиотеки.
  • Минимальное время инициализации интерпретатора.
  • Малое потребление памяти.
  • Простой параллелизм через fork.
  • Возможность удобно и просто вызывать внешние команды и пайплайны команд.
  • Возможность прозрачно миксовать внешние команды и собственные функции. (В sh мы делаем command1 | command2, и это работает одинаково, независимо от того, являются ли эти команды собственными функциями или внешними командами.)

Если обобщить, то главным отличием sh от ЯП типа perl, ruby, python и т.п. является композиция программы как совокупности исполняемых модулей, запускаемых как отдельные процессы, в противовес композиции библиотечных модулей, слинкованных в единый процесс.

Главным минусом sh является то, что в нём не развиты средства работы с какими-либо структурами данных, кроме строк. Да и для самих строк средства не развиты.

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

★★

Последнее исправление: wandrien (всего исправлений: 5)
Ответ на: комментарий от s-warus

Всё что ты перечислил не имеет отношения ни к адресной арифметике следствием которой является нулевое смещение по данным в начале, ник к взятию значения из хеш таблицы по целочисленному ключу.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

В Луа не с нулика во первых потому что на это нет технических причин, во вторых если хочется с нулика делай с нулика, в третьих львиная доля пользователей Луа не программисты от слова совсем.

Дети в школе и сотрудники Ж/Д тоже не программисты, однако как выше было совершенно верно замечено, сантиметры на линейке и километровые столбы мы считаем с нуля, а не с единицы. Наверное всё-таки есть какая-то причина?

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

Ладно, всё равно останемся при своём, пишу на сишке и на луа параллельно, проблем нет, мне норм. Вопрос исключительно привычки. И никакого отношения к линейкам не имеющий :)

Наверное всё-таки есть какая-то причина?

Причина считать с нуля в Си адрессная арифметика, она так работает алёёё, кому кому но не тебе я буду её объяснять ты сам её знаешь получше моего. Всё, более никаких причин считать с нуля нет, кроме одной, удобства программистов, общей консистенции между разными языками. Всё. ТЧК!!11!

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Попытка называть таблицы луа массивами со всеми вытекающими.

Таблицы являются деталью реализации, когда таблица по смыслу представляет собой МАССИВ или СПИСОК. Это вопрос интепретации, а не внутреннего представления. Точно так же как и запись a[x] в C++ абстрактно представляет собой индексацию массива, а конкретно под капотом там может быть вообще что угодно. Языки предназначены для того, чтобы на них ВЫРАЖАТЬ СМЫСЛЫ.

Ещё какое есть! Попытка воспринимать Сишные байтовые массивы как индексируемые ячейки, а не как адресуемые со всеми вытекающими.

Я вижу, что ты не понимаешь, о чем ты говоришь. Операция, определённая над массивом, называется ИНДЕКСАЦИЯ. Она по смыслу определена, понимаешь? Исходя из того, что есть вот такой тип данных, и у него есть такая операция. Просто потому что.

Какие там адресации при этом происходят, является реализацией, а не семантикой.

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

ААААААААААААА, я кашу есть пошёл, потом всё :)

ВЫРАЖАТЬ СМЫСЛЫ

Так блин когда мы уже пошли в абстракции выражения смыслов на языке то ваще по барабану как там в языке хоть с 1 хоть с 0 хоть с -1, там я уже свой тип данных делаю и работаю с ним абстрактно выше семантики самого языка скрывая все особенности доступа к данным в реализации ВЫРАЖЕНИЯ СМЫСЛОВ ууууууууууууууууууу

Мне удобно в сишечке адреса шатать, удобно, практично и очень красиво. И мене удобно в луа произвольно манипулировать доступом к данным с понимаением что библиотечные функции итераций пойдёт с идинички, если я очень захочу пойдёт с нолика, блин это не какой то ушибленный синтаксис раста, это условность размером с гулькину писульку. Я не индексирую в луа, я запрашиваю значение по ключу «жопка» в начале а не 0 или 1 если хочу, напишу свой итератор и делов то, ты один хрен в луа как и в си всё сам у тебя минимальная база, расширяй в то что хочешь. А когда дело что в си что в луа заходит до выражения через организацию данных то это всё вообще улетает на десятый план семантика становится выше, ниже лишь детали реализации и языка.

Воть :)

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Ответ на: комментарий от LINUX-ORG-RU

всё сам у тебя минимальная база, расширяй в то что хочешь

Да можно вообще на Lua писать Форт, на котором написать Лисп. Но зачем? троллейбус_из_буханки.jpg

wandrien ★★
() автор топика

Я смотрел в сторону xonsh. Мне понравилось, что потенциально такие скрипты можно оформить в виде pip пакетов. Да, будут зависеть от xonsh пакета, но он на чистом питоне написан, так что не страшно.

https://xon.sh/

egzakharovich
()
Ответ на: комментарий от LINUX-ORG-RU

странно факториал считают с 0, даже где исторически этажи считают с 1 в строительстве от этого переходят на 0 хотя про адрессную арифметику не слышали, а вот в обратную сторону с 0 на 1 никто не переходит что удивительно.

s-warus ★★★
()
Ответ на: комментарий от LINUX-ORG-RU

я вот всячески избегаю C++, просто люто избегаю.

В следующий раз в три раза больше ответ будет!!!!

Так-так… ложитесь на кушетку поудобнее, постарайтесь расслабиться. Какие ассоциации у Вас вызывает вот этот символ «&» ?;-)

AntonI ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Единичка в луа это просто нюанс

Два чаю. Хоть с девятнадцати пусть начинается (лучше бы, конечно, чтобы везде одинаково). Всё равно ошибок на единицу избежать не удастся, это врождённый порок императивщины.

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

как я сказал выше индексы с 0 в паскале и Делфи кроме стиля старых строк, в которых тоже индекс 0 есть просто в нём длина строки хранится.
zsh я не знаю но он пытается быть совместимым частично с bash, а там индексы где встречаются точно с 0 начинаются.
Индексы с 1 мне встречались в lua в древних версиях бейсика, в древних языках не fortran там с 0 а какие то вроде него.
lua современный и часто используймый инструмент и такой анихранизм встретить в нём очень странно

s-warus ★★★
()
Ответ на: комментарий от Nervous

В техе они закрываются по другому. Садитесь два раза по двойке (за незнание матчасти и за попытку умничать при явном незнании матчасти). Пересдача осенью.

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

Проверил, действительно валидный. Ну ладно, на этот раз выкрутился.

А где это символы в угловых скобках пишут — какой-то раздел физики? Ни разу такого не встречал.

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

на этот раз выкрутился.

не-а, осенью придете;-)

А где это символы в угловых скобках пишут

Это общепринятое обозначение средней величины, в статфизике например.

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

Если обобщить, то главным отличием sh от ЯП типа perl, ruby, python и т.п. является композиция программы как совокупности исполняемых модулей, запускаемых как отдельные процессы, в противовес композиции библиотечных модулей, слинкованных в единый процесс.

Что это обозначает? В шелле есть только один процесс — сам шелл. Сабшелл запускается разве что для некоторых операций, вроде ( ls ) или | while . . .. О каких модулях идёт речь?

Перл не знаю хорошо, но разве в нём сложно запустить дочерний процесс? И в итоге иметь набор скриптов с интерпретатором /bin/perl.

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

&

птичка, глядящая влево

Пфф. Очевидно, что это толстенький котик, сидящий на жопке и разглядывающий собственный хвост.

Шотландец.

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

С бытовой точки зрения сперва идет первый элемент, за ним второй. С математической точки зрения, вообще не важно как адресовать (хоть с -1/12), главное, чтобы была определена операция взятия значения по индексу. А вы застряли в частном промежутке между абстрактным и конкретным и возводите свои вкусы в абсолют. Не надо быть таким зашоренным.

P.s. babashka рулит и бибикает на поворотах.

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

Бытовую точку зрения сформировали пифогор и другие древние авторитеты которые о 0 не знали, да в детском саде не удобно обяснять понятие 0.
Если приходится приводить к индексу 0 это не говорит об удобстве, а наоборот о не удобстве. Более того во всех современных языках разработки индекс 0 является стандартом, один луа из него выпадает. Это в первых поделиях была 1, но фортран заточеный на математику, и си переломили ситуацию.

s-warus ★★★
()

execline превосходит sh по всем перечисленным параметрам, но структур данных там тоже нет. Он в целом предназначен для очень коротких скриптов, где время инициализации интерпретатора составляет бОльшую часть общего времени работы скрипта.

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

С бытовой точки зрения сперва идёт первый элемент, с электронщической - сперва идёт элемент со смещением ноль относительно начала последовательности.

(first list) ; Первый элемент
(second list) ; Второй элемент
(elt list 0) ; Элемент со смещением 0
(elt list 1) ; Элемент со смещением 1

Какой ещё язык подумал и о домохозяйках и о электронщиках? :]

@s-warus

Gentooshnik ★★★★★
()

А, если высокоуровневый то Tcl. execline - это исключительно для вызова внешних утилит с передачей туда-сюда аргументов и пайпов. Tcl более-менее соответствует Lua, только у Tcl без костылей нет одинакового использования команд и внешних утилит, а у Lua без костылей нет пайплайнов… и одинакового использования команд и внешних утилит.

https://www.tcl.tk/man/tcl8.6/TclCmd/exec.htm#M8

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

с кучей вызовов awk, grep и sed

Тебе нужен Perl.

Возможность легко и просто скомпилировать под любой утюг.

Perl

Минимальное время инициализации интерпретатора.

Perl

Малое потребление памяти.

Perl

Простой параллелизм через fork.

Perl

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

сантиметры на линейке и километровые столбы мы считаем с нуля, а не с единицы. Наверное всё-таки есть какая-то причина?

Разумеется, есть. В обоих случаях мы меряем физическую величину, выраженную действительным числом.

Нумерация же элементов массива (ящиков в гардеробе, квартир в доме) — это несколько про другое.

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

С бытовой точки зрения есть разница между порядковыми и количественными числительными. «Первый» — не то же самое, что «один», а «first» не то же самое, что «1» или «0». Так что тут всё логично. 0 сантиметров, 0 километров, смещение 0. При этом первый (first) элемент. Одно другому не противоречит. «Нулевой элемент» — это лишь конструкт в виду несовершенства естественного языка, и потому что говорить «элемент с индексом ноль» слишком запарно.

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

Дело привычки, не более.

Но да, я согласен, что нумерация с 1 в Lua несколько напрягает. Но не потому что это как-то математически необосновано само по себе (нет тут никакого основания, раз это не смещение), а лишь потому что это не как везде, но при этом не даёт никаких преимуществ. Это как использовать == для присваивания и := для сравнения — лишь бы не как везде.

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

согласен, нумерация же элементов массива это несколько про другое, выбор нумерации требующий меньше телодвижений при преобразовании в физическую величину, это плюс для такой системы нумерации элементов.

s-warus ★★★
()
Ответ на: комментарий от CrX

Линейка начинается с 0. Потому и индексы с 0, ведь компудахтеры изобрели инженеры (раса разумных пришельце из чужого), которые любят все мерять ходить, они же и первыми погроммистами были. Математику я уже не помню, да и не знал толком никогда. 7-ой класс - мой предел ныне, но в матрицах и векторах все с 1 начиналось… Получается, что Lua изобрел математик? - Сейчас проверим…

Учёная степень

доктор философии (PhD)

Нежданчик (да, ладно, я знаю, что это ничего не значит и к философии отношения не имеет)

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

доктор философии (PhD)

Перефразируя старый анекдот:

- Мама, мама, а какая учоная степень у дяди Роберту?
- О, он доктор философии!
- Это как у Пифогора и других древних авторитетов?
- Нет Изаура, у этих поцев не было никаких степеней потому что тогда не существовало  диссоветов. 
AntonI ★★★★★
()