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)

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

Ты вообще гуманоид?

Потому что никто cat и test не вызывал таким образом — вызывались какие-то системные утилиты, а все условия вокруг вывода писались на нормальном жс. Код, может быть, длиннее, но когда читаешь не надо помнить, что -v значит для конкретной утилиты: увеличить уровень лога, инвертировать вывод или показать версию.

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

Он везде по-разному работает

type, не? bash-only, ну так ты по башу ж вопрос задаешь и внешний which/whereis не подходит...

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

Условие чтобы работа с REST API была вшито в сам шелл - есть?

Если нет, тогда читерим и юзаем curl

цикл и printf для форматирования вывода - по вкусу(Autosize нет, это да). Можно и в однострочник если прям надо совсем сократить...

Объектный подход Powershell забавен ровно до тех пор, пока ты не понимаешь, что ForEach-Object ведет себя внутри методов в отношении возвращаемых значений вовсе не так как обычный ForEach и еще более не так, как простой For :-)

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

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от legolegs
$ LC_ALL=C bash --rpm-requires
bash: --rpm-requires: invalid option

А все почему? Потому, что у меня маргинальный deb:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04 LTS
Release:        18.04
Codename:       bionic

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

Ты же не требуешь неосишку без скобок в if и точек с запятой

Кто сказал Nim?

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

Зачем мне restapi в шелле?! Очередной комбайн от некрософта.

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

Похоже, совместить всё в одном не получается.

scsh вроде норм был*

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

Это на самом деле очень удобная фича, если мозги не съел какой-нибудь пистон.

rc был без "", вроде немного потеряли

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

Чтобы если команда принимает число

Команда в любом случае принимает char**

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

Тем, что это тупо либа для js.

Альтернативы - либы для питона.

crutch_master ★★★★★
()

Конечно PowerShell.

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

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

Почему бы не писать просто if $a == «1»

Потому, что поломается if grep, например.

Зачем нужен постоянный квотинг переменных

Иначе не получится использовать пробелы для разделения аргументов.

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

сделать инлайн переключение синтаксиса

Появятся идентификаторы синтаксиса, escape-символы для них, escape-символы для escape-символов, и станет всё как раньше.

Похоже нужно переформулировать понятие «plaintext». Устройств, ради которых оно придумывалось я не видел уже лет 20. Кто нибудь?

Пришла пора сказать правду - «текст» представляет собой сложную иерархическую(в лучшем случае) структуру, с потенциально разным оптимальным отображением для каждого узла, устройства, размера и зрения. Придумать новый формат хранения этого, что-то типа tlv, чтобы спецсимволы были не нужны. Предусмотреть отсылки к предыдущим t(например, sed -e «s/pattern/$REPLACEMENT/» - t для $REPLACEMENT должно говорить «а это значение переменной из предыдущего интерпретатора). Написать 3 редактора для холиварщиков. Редакторы должны будут интерпретировать „t“, показывая пользователю „v“ так, как тому нужно это видеть.

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

И потом убедить весь мир работать „по новому“. Готов возгравить революцию?

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

type -t grep. [which — не стандартизирована]

Я не вижу чтобы в стандарте у type был ключ -t. У меня например, его нет.

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

цикл и printf для форматирования вывода - по вкусу(Autosize нет, это да). Можно и в однострочник если прям надо совсем сократить...

Можно вообще извратиться и написать свой преобразователь JSON в таблицу. Тогда и Autosize будет :)

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

А bash тут вообще причём? Может тебе API к чему угодно завтра в голову взбредёт, и чо? Ты свои порядки маздайные сюда не приноси. Тут unix-way вообще-то и oldschool. Пацаны бородатые. Вали со своим PS-ом в ту дыру, откуда пришёл.

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

Ну вот, а надо арийский GNU Bash 4. Например такой:

$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

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

И type с ключами это настолько же нестандарт, как и which & co.

О каком стандарте речь? GNU Bash — единственный «стандарт» Bash. Тред о Bash.

POSIX Shell — для тех, кто хочет кровавых стражданий чтоб ублажить BDSM *BSD-шников.

И кстати:

$ type type
type is a shell builtin

Т.е. type — базовая функциональность баша в отличии от внешнего which:

$ type which
which is /usr/bin/which

$ dpkg -S $(readlink -e /usr/bin/which) 
debianutils: /bin/which

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

POSIX.2: Shell and Utilities.

Ну вот, GNU Bash умеет в такую совместимость.

Стандарты нужны (в большей мере) для обеспечения совместимости между альтернативами. Which имеет альтернативы на разных системах, но стандарта нет. GNU Bash — один. И если в скрипте написано #!/bin/bash (или более милосердно #!/usr/bin/env bash) то значит что не надо пытаться запускать скрипт этими вашими «реализициями» POSIX Shell. Bash == GNU Bash.

RazrFalcon, моя наибольшая боль в Bash — это когда приходят бздуны с плачем «ниработает скрипт» и наотрез отказываются ставить Bash.

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

И если в скрипте написано #!/bin/bash [...]

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

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

А я и не бздун. Но даже на гну/линуксе mksh это просто глоток свежего воздуха после гну/баш.

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

Но даже на гну/линуксе mksh это просто глоток свежего воздуха после гну/баш.

вроде «process substitution» только планируется, а без него уныло немного

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

моя наибольшая боль в Bash — это когда приходят бздуны с плачем «ниработает скрипт» и наотрез отказываются ставить Bash

Ну если ты пишешь скрипты с претензией на переносимость, то сам понимаешь наверно кто в этой ситуации мудак.

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

mksh это просто глоток свежего воздуха после гну/баш.

Вообще-то нет. Переписываешь скрипт под этот ksh и думашь - «ну нафига им были эти понты?».

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

Если нет, тогда читерим и юзаем curl

цикл и printf для форматирования вывода - по вкусу(Autosize нет, это да). Можно и в однострочник если прям надо совсем сократить...

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

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

Ну если ты пишешь скрипты с претензией на переносимость, то сам понимаешь наверно кто в этой ситуации мудак.

Претендую на переносимость в границах доступности #!/bin/bash. Однако временами приходится страдать с написанием «более переносимых» скриптов. Но только за деньги или серьезные причины. Я даже на работе за такое не берусь просто так.

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

Так правильный вариант только один.

А если кто-то хочет протестировать совместимость which? :) No single truth.

Использование type вместо which/whereis — скорее из раздела «best practices».

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

Bash - это собирательное имя. То есть любой shell.

Не делай так. Bash — это Bash. А shell — это POSIX Shell. (как котлеты и мухи).

Другое дело — Bash популярен, ибо по умолчанию. Но в то же время Bash — надмножество POSIX Shell.

KennyMinigun ★★★★★
()

Твои примеры сложнее в использовании, чем в баше.

#!/bin/bash


# запуск процесса
ls -l
# получение расширения файла
## 1
FILE='text.txt'
function get_ext {
        IFS='.'
        while read -r name ext
        do
                echo $ext
        done <<< $1
}
get_ext $FILE
## 2
echo ${FILE##*.}
# конкатенация путей
HOMEDIR='/home'
USERNAME='user'
PATH="$HOMEDIR/$USERNAME"
echo $PATH

require grep

env grep

что в Bash у вас вызывает самую сильную боль

Неосиляторы.

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

полученные данные нужно предварительно рассортировать

берешь xmlstarlet, если не хватит ruby + nokogiri, или чем-нибудь подобнымi; не вижу чем встроенный костыль лучше

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

FILE='text.txt'
get_ext $FILE

У тебя кавычки везде стоят где не надо и не стоят где надо. То есть ровно на 100% инвертированы, как в perl/php. И IFS глобально поменял и не вернул, в результате чего остальной код будет делать странное.

Неосиляторы.

Мдауш.

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