LINUX.ORG.RU

Lua Shell

 , , ,


2

5

Контест этого топика: Леннарт теперь до эмуляторов терминала добрался (комментарий)

@EXL:

Лучше бы Lennart взялся за Bash.

@wandrien:

Там только выкинуть целиком. Я вот хочу попытаться для lua сделать обвязку для скриптинга уровня оболочки. Подобные либы на Lua есть, но качество и объем фич мне не нравится. Надо лучше. Тебе бы был интересен такой проект?


Итак, вот моя идея в общих чертах. Составные части, на которых основываться:

https://github.com/BanceDev/lush
Низкое качество сборочного скрипта. Вероятно, и кода тоже. Интересует идея в первую очередь.

https://github.com/mna/luashell
Ключевое, что нам нужно. Взять за основу. Но:

  • Нужны полнофункциональные средства перенаправления ввода-вывода, заменить эту часть API. Под капотом, вероятно. придётся делать полноценную обработку fork - настройка процесса - exec.
  • test() должен быть вменяемый, а не парсить строку по пробелам. Просто алиас для sh.cmd("test", ...).exec()
  • Форк процесса без exec в качестве элемента пайплайна на уровне API
  • Как расширение предыдущего - обёртка а ля sh.echo("text").

В качестве базового API взять https://25thandclement.com/~william/projects/lunix.html вместо https://github.com/luaposix/luaposix

Также рассмотреть для включения и/или как источник идей:


Общая идея:

  • Lua + lunix — получаем возможность писать на Луа «приложения как на Си под libc».
  • Сверху на это - форкнутый и допиленный luashell. Это ключевое.
  • Далее QoL вещи: lua-path, argparse, функции для парсинга и форматирвоания времени, функции для JSON.
  • Далее - разработать интерактивный режим для использования в качестве командной оболочки.

Продукт компилируется в статический бинарь с musl и/или cosmopolitan libc и получаем «вечный» shell. При этом весьма компактный.

★★★

Последнее исправление: wandrien (всего исправлений: 4)

lcurses/lcurses

notcurses, но к ней нет Луа-биндингов. :)

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

Я б тоже поныл. Бесит. Но не вижу лучшей альтернативы:

  • Очень технологичная реализация интепретатора на чистом Си.
  • Сам язык базово очень прост, не требуется учить нетривиальные концепции, исторические наслоения, хитрые особенности рантайма.
  • Куча программистов, кто уже знает язык.
  • Куча библиотек, которые возможно взять за основу и включить в проект.
  • Еще больше lua-библиотек, которые пользователь оболочки может использовать сам.
wandrien ★★★
() автор топика

Я так и не понял зачем, вы там powershell пытаетесь изобрести?

Pierre_Dolle
()

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

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

а мне лично нравится нумерация с 1. Очень удобно.

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

В баше я печатаю:

$ mke2fs -E lazy_itable_init=0,lazy_journal_init=0 -L mylabel /dev/sdd1

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

>>>subprocess.run(["mke2fs", "-E", "lazy_itable_init=0,lazy_journal_init=0", "-L", "mylabel", "/dev/sdd1"])

На этом мой интерес к «нормальным яп в качестве шелла без дроча кавычек» угасает.

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

А теперь напиши на sh какой-нибудь скрипт. Хотя бы вот такого размера:

https://github.com/sde-gui/simple-file-info/blob/main/simple-file-info

Кстати, не забудь, что в POSIX sh нет даже локальных переменных. Удачки.

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

А. Так нужен разбор аргументов при самом вызове шелла, само собой. Чтобы внутри ты уже имел пару-тройку заполненных структур с награбленным из комстроки.

Ну типа ты запустил myscript.luash arg1=azaza arg2=bebebe -a mimimi raz dva tri и скрипт получил три переменных: словарь с именованными аргументами, словарь с однобуквенными ключами и массив всего остального.

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

Спасибо, мне по работе этого говна хватает

Еще бы я для личных проектов писал скрипты уровня клея между процессами на питоне. Я не мазохист.

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

Писал и посложнее. Естественно, с башизмами, я же себе не враг.

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

Потому что придётся принять кучу решений по кавычкам, эскейпингу т.д. И эти решения понравятся не всем. И будет такое же нытьё, как про баш.

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

В баше я печатаю

А что здесь конкретно от баша? Это должно работать в любом шелле.

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

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

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

Найдутся недовольные нумерацией массивов с 1 и придут ныть.

в подобном языке можно было бы и явно задавать диапазон типа [-3..3]

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

Найдутся недовольные нумерацией массивов с 1 и придут ныть.

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

arr = {'a', 'b', 'c'}
arr[0] = 'q'
arr["qwe"] = 'w'

print("[1]=", arr[1], "\t[0]=", arr[0], "\t[qwe]=", arr["qwe"])
[1]=    a               [0]=    q               ['qwe']=  w
COKPOWEHEU
()

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

rtxtxtrx ★★★
()

Это же всё на уровне ядра криво спроектирована. Там только код завершения гарантированно число. Остальное строки…хотя языки типа яваскрипт прекрасно приводят типы, повторюсь вывод всегда строка, так что «2» + 2 = «22». Неудобно. Lua мне не нравится совсем… Он какой-то гейский слишком не знаю, слишком несерьёзный, бедный на сахарок, даже встроенных средств нету чтобы взять две таблицы объединить с заменой ключей.

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

Покажи мне аналог <file.gz gunzip | xz > file.xz на питоне. Или на луа.

Предполагается, что в сабже будет так:

(cmd('gunzip').in('file.gz') | cmd('xz').out('file.xz')).exec()

Или так:

cmd('gunzip').in('file.gz').to('xz').out('file.xz').exec()
wandrien ★★★
() автор топика
Ответ на: комментарий от wandrien

Если хочешь говнолупу в терминале то нужно отдельное подмножество языка как минимум с поддержкой пайпов (конвейеров) встроенной… А потом всякую функциональщину добавить с лямбдами мапами… Проще новый язык написать. Этот явное говно

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

На этом мой интерес к «нормальным яп в качестве шелла без дроча кавычек» угасает.

Ты всё перепутал. Дроч с кавычками выглядит вот так:

get_icon_name_for_file() {
    check_tool GIO || return 1
    test -n "$1" || return 1
    test -e "$1" || return 1
    ( # force "local" variables
        icon_line="$($GIO info -a standard::icon "$1" | grep standard::icon)"
        icon_line="${icon_line##*: }"
        icon_line="${icon_line%%,*}"
        printf %s "$icon_line"
    )
}

В любом sh-скрипте он просто душу вынимает, всё правильно кавычить, экранировать, обвешивать закорючками а ля перловка.

При этом всё равно не получится добиться полного решения во многих случаях.

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

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

И всего-то? Вот find -exec внутри find -exec внутри ssh это да, это морока с кавычками

legolegs ★★★★★
()

lua уже есть, lua-jit уже есть. непонятно, что ты хочешь переизобрести.

в скриптах шелла компиляция не нужна, компилируемые языки и так существуют и не относятся к шеллу.

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

Чот сдается мне, без этого не получится обойтись.

thesis ★★★★★
()

Я могу подкинуть удобный парсер. Но он использует с++17 и не ниже. Это прям требование по copy elision иначе оно балуется.

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

А если бы была возможность использовать произвольный язык то имело бы смысл. Парсер произвольного языка в абстрактный ассемблер я подгоню

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

Дык он не тролль.

Да и синтаксис действительно говно, чего уж. Без пайпов херово.

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

восторг от этого синтаксиса

Ага, проняло. А кто недавно нахваливал lua как язык конфигурации для вима? Выглядит примерно так же красиво. Понятно, что все попытки изобразить шелл на таких языках обречены на жуткое вырвиглазие. Надо на лиспе же.

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

Можно списаться и обсудить. Единственное: токенизатор придется писать руками потому что я хакал qtextstream и в моем коде будет привязка к qt причем последних версий.

Я пишу движок для своей САПР для проектирования микросхем. Там надо много парсить код причем ещё и отдуплять где сам код а где дебаг данные. Но парсер точиться под с++ подобный язык и сможет понимать аналоги типа жабы. Трансляция задаётся конструкциями которые мне с телефона в лом писать но они очень читаемы. Трансляция идёт в псевдоассемблер. Точнее сперва идёт трансляция описания парсера в псевдоассемблер (потом добавлю честный асм). На выходе асм но другой: уже общего назначения.

ckotctvo
()

@thesis

Да и синтаксис действительно говно, чего уж. Без пайпов херово.

Если оставаться в рамках сабжевого языка, то иначе не получится.

Можно попробовать Tcl-подобный ЯП. Но не сам Tcl, потому что там наворотили много, а нужного нам - не наворотили.

Нужно что-то типа типа интерпретаторов lil или partcl. Это встраиваемые Tcl-подобне интерпретаторы с минимальным размером. И делать к нему стдлибу с нуля.

Но этим мы сразу теряем то преимущество, что Lua - знакомый и понятный многим разработчикам язык. К тому же, я пытался делать мокап, как бы это выглядело «на тикле», и там тоже не то что бы я был в доволен результатом.

Не забывай еще, что при написании скриптов на Lua, мы всё-таки на ином уровне будем писать, и для многих вещей, которые в bash делаются через сторонние костыли, нам вызов сторонних команд вообще не понадобиться. Вызываться будут команды «по существу».

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

"" не нужны, если вместо test использовать [[. В подстановке параметров тоже не нужны. Название иконки тоже не будет иметь пробелов или метастмволов. Засада остаётся только в названии файла icon_line="$($GIO info -a standard::icon "$1" ..., прочем неясно нафига всю конструкцию закавычили.

Короче, кто-то тупо перестраховался походу.

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

Lua норм для скриптования, но прям в качестве системного шелла, ну да же не знаю. Пока ничего лучше Nushell ещё не встречал, к тому же он часто текст и без кавычек переваривает.

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

Здравствуйте, найдётся ли у вас минутку поговорить он нашем /господине и спасителе Бабашке?

(-> (pipeline 
      (pb {:in (io/file "/tmp/bb/file.gz")} 
          "gunzip") 
      (pb {:out :write :out-file (io/file "/tmp/bb/file.xz")} 
          "xz"))
 last deref)

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

ugoday ★★★★★
()
Ответ на: комментарий от papin-aziat

кто-то тупо перестраховался походу.

Лучше тупо перестраховываться везде, чем случайно забыть проверку в нужном месте и уронить себе всё из-за случайного файла с «неправильным» символом.

ugoday ★★★★★
()
Ответ на: комментарий от papin-aziat

Твой пост говорит о плохом понимании sh.

А еще о неверном понимании принципов написания надёжного кода.

Извини, мне не охота всё это подробно разжовывать.

Тема не для тех, кто считает sh хорошим языком для написания скриптов.

Тема для тех, кто как я и @EXL разделяет мнение, что в таком качестве bash, ksh и прочие никуда не годятся в наше время.

wandrien ★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.