LINUX.ORG.RU

Ищу удобную альтернативу Bash

 , ,


1

3

Навеяно недавними новостями.

Собственно, я ищу примитивный, башеподобный язык для написания скриптов вида: выполнить n команд с парой условий.

Bash и его производные настолько ужасны, что тут даже обсуждать нечего. Легаси в 3-м поколении.

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

# запуск процесса
run(['ls', '-l'])
# получение расширения файла
splitext("text.txt")[1][1:]
# конкатенация путей
join('/home', 'user')
И это с реэкспортом функций, что не канон.

Fish выглядит самым адекватным решением, но работа с переменными просто ужасна. Например создание списка: set -l mylist 1 2 3. Или инкремент счётчика set i (math "$i + 1"). Зато условия пофиксили.

Поэтому ищу или удобный скриптовый язык или либы для питона.

PS: Ещё интересно было бы услышать что в Bash у вас вызывает самую сильную боль. Я бы, например, не отказался бы от встроенной фичи для проверки существования субкоманд, типа require grep

★★★★★

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

У тебя кавычки везде стоят где не надо и не стоят где надо.

Я этот код даже не проверял, а писал прямо в коммент исключительно как пруф оф концепт.

как в perl

Да, на нём я последнее время пишу чаще, поэтому автоматика сработала. Тут ты прав.

И IFS глобально поменял и не вернул

Нет. Он меняется только внутри функции.

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

Я этот код даже не проверял, а писал прямо в коммент исключительно как пруф оф концепт.

Ну сообщил бы людям, что это ненастоящий код тогда. Вдруг твой бред кто-то нагуглит.

И IFS глобально поменял и не вернул

Нет. Он меняется только внутри функции.

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

Только C++ - говно.

Ну, идея-то проста как день. Вместо него можно любой компилятор подставить, хотя бы того же rust'а. А в исходнике на гитхабе подправить строчку, вызывающую этот компилятор.

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

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

Ну, идея-то проста как день. Вместо него можно любой компилятор подставить, хотя бы того же rust'а. А в исходнике на гитхабе подправить строчку, вызывающую этот компилятор.

Эта идея - JIT-компиляция с кэшированием, хоть и полезна, но никакого отношения к шеллам не имеет. Шелл отличает контекстно зависимый разбор, с, грубо говоря, двумя режимами - keywords и commands. Режим keywords примерно соответствует "настоящим" языкам программирования, там нужно соблюдать некий развитый синтаксис и не нужно квотить переменные. В режиме commands весь синтаксис отключен, единственный синтаксический элемент это пробел (и его отмена), по которому разделяются аргументы для exec(2). Соответствено, инструменты, в которых не предусмотрено альтернативных режимов разбора, такие как C++, для шелла подходят так же как навоз для изготовления снарядов.

d_a ★★★★★
()
Ответ на: комментарий от shell-script

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

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

Эта идея - JIT-компиляция с кэшированием, хоть и полезна, но никакого отношения к шеллам не имеет. Шелл отличает контекстно зависимый разбор, с, грубо говоря, двумя режимами - keywords и commands.

С этим полностью согласен, поэтому и оговорился сразу, что

Сам я совсем не считаю, что это очень нужно и удобно.

Однако добавил и теперь повторю, что

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

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

Хотя, если ТС не преуменьшает, говоря в верхнем посту

выполнить n команд с парой условий

то ему и баша должно хватить, просто опасные команды типа eval не надо использовать.

aureliano15 ★★
()
Ответ на: комментарий от shell-script
function get_ext() {
  echo "${1#*.}" # самый длинный extension file.tar.gz -> tar.gz
  # echo "${1##*.}" # самый короткий extension file.tar.gz -> gz
}

:D

Кстати, IFS лучше делать local

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 2)
Ответ на: комментарий от shell-script

Ещё у тебя не очень безопасный echo и PATH переписал.

Неосиляторы.
shell-script

Иронично.

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

то ему и баша должно хватить, просто опасные команды типа eval не надо использовать.

Ну ещё может начать свой писать. Без word split, но с инкрементами и float point. И чтобы conformant-профили могло сорсить. И без гнутого мусора (readline и проч.) Я бы не отказался ^_~

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

В моих фантазиях это выглядит так:

# строготипизированный путь
path = p"~/test.sh"
# path-extension - built-in функция, может применяться только к типу Путь.
# Иначе ошибка "компиляции" ещё до запуска.
ext = path-extension $path

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

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

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

и float point

man bc

И без гнутого мусора (readline и проч.)

А readline чем не угодил? Да и какое он имеет отношение к оболочке? Он же, как я понимаю, с терминалом взаимодействует.

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

Ой любо-дорого будет посмотреть, что он со своей бандой выдаст на замену башу.

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

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

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

А readline чем не угодил? Да и какое он имеет отношение к оболочке?

Тем что настраивать надо в двух местах, тем что gnu и тем что gpl. Отношение прямое: интерактив и REPL.

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

тем что gnu и тем что gpl

Так это весь Линукс такой. Тогда надо переходить на что-то полностью проприетарное, а там и readline заодно не будет.

aureliano15 ★★
()

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

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

От баша отказываться смысла не вижу, потому что значительную часть времени провожу в ssh сессиях удаленных машин, а там всюду bash, смена локального шелла приведет к неконсистентности. К тому же, мой .bash_profile успел изрядно распухнуть - не хочу его переписывать.

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

Да и у path, и у "~/test.sh" они тоже не нужны, как по мне, утиная типизация же. Вон, в том же groovy сделали что "ps aux".execute() процесс (e.g. java.lang.Process) возвращает, а тут пусть "test.sh".fileExt() автоматом строку в путь конвертирует. (Больше, к сожалению в groovy, кажется ничего релевантного твоей задаче не сделали, ну и основа -- jvm -- для короткоживущих скриптов не годится.)

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

ЛОЛ, написал ненужнопост, здесь не про шелл, а про скриптовый язык.

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

Не хочу методы вида .name() Будет слишком аляповато рядом с обычными командами.

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

Ищу удобную альтернативу Bash

хех, раньше первой альтернативой для скиптов был perl, второй альтернативой был perl+CPAN

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

Этот твой awk на стероидах вызывают из баш скриптов по надобности.

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

Сделай мне вот это в баш:

Invoke-RestMethod -Uri https://www.linux.org.ru/section-rss.jsp?section=1 | Format-Table -Property title, author, pubDate

Ref: Invoke-RestMethod, Format-Table

круто, а теперь забацай так же просто это в виде HTML-таблицы, такие батарейки есть?

anonymous
()

скриптовый язык

perl, епт.

anonymous
()

башеподобный язык для написания скриптов вида: выполнить n команд с парой условий

perl же.

работа с переменными просто ужасна. Например создание списка: set -l mylist 1 2 3. Или инкремент счётчика set i (math «$i + 1»).

tcl смотрит на тебя с недоумением.

no-such-file ★★★★★
()
Ответ на: комментарий от RazrFalcon

И зря, в тикле есть все, чтобы запилить вызов команд в неотличимом от нативного шелла виде с пайпами и прочим. А в остальном тикль вполне себе пристойный ЯВУ.

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

Парсить бинариком структурированные форматы в текст, чтобы потом заново парсить уже этот текст. Башисты такие затейники.

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

Только C++ - говно. Зачем писать скрипты на языке без fs в std?

Так добавили же в C++17. Считай, готов.

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

Не ясно откуда там столько звёзд за такой примитивный код

Звезды ставят за то, что людям нужно.

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

Ага, интересная идея. Посмотреть бы во что это выльеться в реализации.

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

Конечно нет - ими удобно отдельно отсортировать один файл, или выхлоп утилиты во время фигак-фигак прототипирования.

anonymous
()

Тут на лоре, кстати, был интересный человек, который пилил какую-то обёртку или самостоятельную реализацию шелла, в котором всё есть есть объект. Насколько я помню, там выхлоп команд оборачивался в js, и пайпы как-то строились на js.

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