LINUX.ORG.RU

Schemesh v0.9.0 — оболочка командной строки на Scheme

 , ,


1

5

Пока сограждане предавались праздничным развлечениям, разработчик Schemesh разрабатывал и в результате наразрабатывал очередной релиз своего проекта: оболочка командной строки, представляющая собой довольно элегантную амальгаму синтаксиса Chez Scheme и классического UNIX Shell.

В данном выпуске:

  • добавлены функции работы с историей и портами (в том числе и совместимые с Racket);
  • улучшена работа с фоновыми процессами;
  • несколько мелких исправлений и обновлённые инструкции по сборке.

Из нетривиальных особенностей проекта стоит отметить возможность смешивать синтаксис Lisp с обычным shell в рамках одного скрипта и возможность подгружать schemesh в качестве библиотеки в Chez Scheme. Детальнее с примерами можно посмотреть здесь.

От других REPL-образных оболочек с Lisp/Scheme синтаксисом данный проект отличается наличием полноценного job control (fg\bg и прочее).

На вкус автора новости получилась бы отличная замена того же Fish если бы поддерживался right prompt – на удивление редко встречающаяся фича среди оболочек командной строки.

>>> подробности

★★★★★

Проверено: hobbit ()
Последнее исправление: unfo (всего исправлений: 2)
Ответ на: комментарий от sena

Может я конечно уже брюзжу

Ну хорошо хоть сам это понимаешь

небережливое отношение к человеческому(пользовательскому) времени

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

Осталось сделать совсем небольшой шаг в понимании чтобы мир стал куда менее загадочным - задаться простым вопросом: а с какого хрена все эти люди, чей многолетний труд ты бесплатно используешь, тебе хоть что-то вообще должны?

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

предполагается что программирующий знает какой-то язык программирования

У меня вопрос. А зачем для шелла знать язык программирования? Мне вполне хватает знания скриптоты, и то эта ниша настолько глубокая, так как за ней хоть и урезанный но .Net, что окунешься и утонешь.

$ [Runtime.InteropServices.RuntimeInformation]::FrameworkDescription
.NET 10.0.0-preview.2.25163.2
dmitry237 ★★★★★
()
Ответ на: комментарий от zabbal

тебе хоть что-то вообще должны

Это же СПО. Конечно разрабы не должны лично мне что-то, а где я говорил что мне что-то должны? Ну в общечеловеческих рамках разве что, а так - нет. Они вправе допускать ошибки, а пользователи вправе на них указывать. Разрабы могут пытаться ошибки исправлять и расти, а могут забить.

Но обычно стараются исправить. Наверное потому что в нас заложено стремление к совершенству. За редким исключением :)

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

А чего перебор-то? Там вся длиннота в куче переменных да условий, а логика наверное несложная.

Многословно? Фигня. Работать-то будет быстро.

Как я понял, проблема баша как раз в том, что он будет медленным в определённых ситуациях, где другой скриптовый язык отработает мгновенно и код будет более компактным. Например, если сравнить скорость работы ассоциированного массива в баше и awk, то первый сильно проиграет.

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

У меня по-умолчанию init3.

Знать бы ещё что это такое.

В wayland ещё пилить и пилить – вот и пилят.

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

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

ради сохранения хотя бы предыдущего пользовательского опыта придётся писать тонну кода

Вылазь уже из под коряги - это все давно написано и отлично работает. Все актуальные графические тулкиты поддерживают wayland.

За пределами DE и пары-тройки тайлинговых WM жизни на wayland, считай, и нет.

Это и есть примерно весь современный GNU/Linux c графикой. В embedded еще раньше переехали на wayland из-за неудобоваримой тормознутости xorg.

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

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

Да я ж не против. Пусть пилят. Кто бы только ещё запилил привычное ПО под вяленький.

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

Вылазь уже из под коряги - это все давно написано и отлично работает. Все актуальные графические тулкиты поддерживают wayland.

Где взять Fvwm под Wayland? А Windowmaker с пачкой доккапов?

За пределами DE и пары-тройки тайлинговых WM жизни на wayland, считай, и нет.

Это и есть примерно весь современный GNU/Linux c графикой.

Ах если бы. Это только у дефолт-боев с убунтой или федорой. А остальным как? Переучиваться на что-то менее привычное и удобное только потому что смузихлёбы теперь так носят?

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

Единственное преимущество линукса на декстопе было в возможности послать лесом всех модных дизайнеров и специалистов в UI/UX из рабовладельческих корпораций, и накрутить себе какое угодно окружение. Если это больше не работает, зачем тогда страдать с линуксом? Прямее он не стал, скорее наоборот.

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

а логика наверное несложная.

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

Многословно? Фигня.

Тем временем сами авторы скрипта оставляют комментарии

matrix_copy ()
{
    # TODO: find less ugly func.
    echo "`echo "$1" | \
    awk -F, '{for (i=1; i<=NF; i++) {n=n$i","; z+=1; if (i==64) {z=0; sub(",$","",n)}; if (z==8) {z=0; n=n"\n"}}; print n}'`"
}

Сверх того, чем больше читать, тем скорее устанешь и что-нибудь да пропустишь. Вот, возьмём:

AUD_FREQ_SRC="`${FFMPEG} -i "${AUDIO_SRC}" 2>&1 | awk '/Audio:/ {print $5}' | sed s/,// | head -${AUD_TRACK} | tail -1`"

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

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

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

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

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

Терминал он вот он

А на LOR ты через elinks сидишь? Или твоё желание строить из себя нетакусика так далеко не простирается?

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

Уровень диалога моего младшенького.

Или как животное в кнопочки GUI тыкать?

Что поделать - приходится подстраиваться под уровень собеседника.

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

Это ж классика, есть даже какой-то мем на английском типа «только для письма», то есть для чтения не годится 😁

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

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

Ага, я давно решил для себя не впрягаться за больших дядей 😁

Например, кто-то говорит, что Фрейд говно, или, скажем, Дарвин, и что?! Именно мой голос всё исправит? Было бы странно…

Bash, полагаю, тоже как-то справится без моей апологетики, ибо где эти ваши барабашки да скимиши, и где баш!

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

есть даже какой-то мем на английском типа «только для письма», то есть для чтения не годится

Это всё от неосиляторства. Бывает человек выучил какую-то жаву, и всё другое ему кажется загадочным и непонятным. Но портянка промышленного кода на жаве способна ввести в ступор неподготовленного читателя, хотя там вроде знакомые английские слова. Чтобы всё это осмыслить нужна серьезная подготовка: знание языка, библиотек, промышленных паттернов. То же касается и лиспа, если смотреть на него глазами обычного неподготовленного кодера, то это какое-то «месиво из овсянки с обрезками ногтей». Но вот угодай читает это как Пушкина, например. А кто-то баш или перл так читает, всё зависит от подготовки и тренировки.

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

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

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

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

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

Просто тут когорта людей обсуждают какой bash плохой, но по факту все им пользуются. Нелогично как-то. «Плохой bash» - ну так покажи success cases с чем-то другим.

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

Смотрел как-то какой-то системный скрипт или из пакета какого-то (не помню), так там чувак в комментарии перед блоком с кодом на sed прямо так и написал, мол извиняйте, все вопросы про эту абракадабру к изобретателю этого языка

Мне больше нравится история, как к какому-то блоку кода был коммент вида «129 часов было потрачено на рефакторинг этого кода». Код был и правда ужасен, и какой-то товарищ решил его переделать. Потрахавшись с этим приличное время, он откатил все свои правки, и изменил только коммент: «142 часа было потрачено на рефакторинг этого кода».

😊

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

Не, ну с таким настроением можно и лор закрывать.

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

AUD_FREQ_SRC="`${FFMPEG} -i "${AUDIO_SRC}" 2>&1 | awk '/Audio:/ {print` $5}' | sed s/,// | head -${AUD_TRACK} | tail -1`"

Мне одному этот код кажется отлично читаемым?

(Я бы только обратные кавычки заменил на $(), ну и к awk у меня личная непрязнь по причине продемонстрированной в предыдущем примере в том же посте).

И, ок, сколько людей столько мнений. А можно пример аналогичной логики на другом ЯП, чтобы было лаконично и читаемо?

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

Мне одному этот код кажется отлично читаемым?

На земле 8 миллиардов людей, часть из них сумасшедшие, часть наркоманы. Есть из кого выбирать.

А можно пример аналогичной логики на другом ЯП, чтобы было лаконично и читаемо

Как-то так:

aud_freqsrc=ffmpeg.aud_track
(def aud-freq-srq (:aud-track ffmpeg))

Да где угодно обращение к полю структуры/ключу словаря делается проще и понятнее паравоза из awk| sed| head| tail.

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

Ха, хитрый! А что стоит за :aud-track ffmpeg? Ты уж покажи полный листинг, что ж ты только кусок показываешь. И чтобы через вызов внешней команды.

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

Ха, хитрый!

Вдобавок и ленивый.

И чтобы через вызов внешней команды.

??? Довольно странное условие. Если баш по другому не умеет, то это проблемы баша. Зачем другим нужно решать башепроблемы башесредствами, если у них есть свои средства и способы?

покажи полный листинг

Для этого нужно разбираться что тут происходит и зачем и как тут вообще всё устроено. Мне это не настолько интересно. В любом случае, решение будет в стиле

(defn parse-ffmpeg [arg1 arg2 … argN] …)
(def config (parse arg1 arg2 … argN))
(def aud-freq-srq (:aud-track config))

Отдельно — разбор выхлопа ffmpeg (или что-нибудь вместо этого), после чего у нас есть нормальная структура данных (словарь скорее всего). Отдельно — использование нормальной структуры данных с нормальными алгоритмами.

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

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

Это же СПО.

Вот именно. И что создатели ПО, что разработчики и мейнтейнеры дистров решают с его помощью свои задачи. То что зачастую они совпадают с твоими - это тебе просто повезло.

Но обычно стараются исправить.

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

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

Где взять Fvwm под Wayland? А Windowmaker с пачкой доккапов?

Ты реально без подсказки не догадываешься? Обычно я тупым не подаю, но сейчас всё-равно жду курьера, поэтому сделаю исключение: в кой-то веки распахни кошелёк вместо хлеборезки, оплати портирование разработчикам, и всё немедленно будет к твоим услугам.

А остальным как?

Да всем насрать на хотелки полутора калек.

Переучиваться на что-то менее привычное и удобное только потому что смузихлёбы теперь так носят?

Те, кто переучивание не осиливает, может по форумам поныть. Есть ещё, разумеется, вариант написать самому, но те, кто на такое способен, и с обучением проблем не испытывают. От чего у ламеров дополнительно пригорает, а нормальных людей - развлекает :)

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

Тем временем сами авторы скрипта оставляют комментарии

так тут же как раз и есть вставка из другого языка, ну могли бы ещё на питоне или на перле вставить

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

зачем тогда страдать с линуксом?

Тебе? Точно не за чем. Сваливай обратно на винду и не простудись по дороге :-D

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

где эти ваши барабашки да скимиши, и где баш!

Москва не сразу строилась - глядишь ещё придавят баш при нашей жизни ;-)

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

так тут же как раз и есть вставка из другого языка,

Алё. Если в баше запретить вызовы awk/sed/grep и др. программ, там вообще делать нечего. Впрочем, в качестве домашнего упражнения, вы можете переписать эту функцию на чистом баше.

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

То что при этом чей-то там опыт отправляется на помойку это даже близко не проблема

Нет, ты не прав. Когда ресурсы тратятся впустую (человеческие или там энергетические), это неправильно. Непрофессионально, халтурно, не эстетично, некрасиво, расточительно и глупо наконец.

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

То же касается и лиспа

Да каким боком-то?! Там же из всего синтаксиса несколько скобочек - тривиальнее некуда.

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

по факту все им пользуются

С чего ты это взял? У меня, например, его даже в системе нет. Раньше был потому что какое-то говно для network-manager (кажется) его по зависимостям притащило. По счастью нужда в этой дряни отпала.

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

success cases с чем-то другим.

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

Только явные *.sh:

sudo fd .+\.sh / | wc -l    # 435
dmitry237 ★★★★★
()
Ответ на: комментарий от sena

Когда ресурсы тратятся впустую

Ну можешь везде таскать с собой кактус чтобы компенсировать впустую израсходованный кислород :)

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

И чтобы через вызов внешней команды.

??? Довольно странное условие. Если баш по другому не умеет, то это проблемы баша

ЛОЛ!

Вообще-то bash, как и любой шелл - это в первую очередь средство для запуска внешних комманд и всё что вокруг этого (управление выполнением, перенаправление ввода/вывода и т. п.). Это основной use case любого шелла. Мы про шелл говорим.

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

Алё. Если в баше запретить вызовы awk/sed/grep и др. программ, там вообще делать нечего.

Кто предлагает запретить? А-та-та ему.

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

А вот если, как в сабже, на такой вызов не будут ещё расходоваться ресурсы (новый процесс, передача данных и т.п.), зато будет возможность написать современный структурированный код, то будет вообще прекрасно.

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

Ну можешь везде таскать с собой кактус чтобы компенсировать впустую израсходованный кислород :)

Только и остаётся. Ну ещё на форуме пожаловаться и помогать тем, кто работает иначе. Бороться с этим невозможно, разве что только уговаривать, объяснять. Приводить хорошие примеры. Благо в СПО люди к этому более внимательны. Неприятная тенденция появилась только в последние годы, видимо влияние корпов.

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

shell нужен, чтобы решать проблемы пользователя. То, что он по другому, крому вызова внешних программ, не умеет (точнее умеет очень плохо, медленно и мучительно) — это его ограничение. Более совершенные инструменты лишены этого недостатка и, естественно, не должны себя этим ограничивать. Очевидно же.

Врочем, если уж вам так неймётся, вот вам очевидное решение предыдущей задачи:

(require '[babashka.process :refer [shell]])

(def video-file "/tmp/video.mp4")

(def streams
        (->> video-file
             (shell {:out :string} "ffprobe -v quiet -print_format json -show_streams")
             :out
             (#(json/parse-string %1 true))
             :streams))

streams — это массив словарей, который содержит все нужные данные в удобной форме

streams

 [{:color_space "smpte170m",
   :tags
   {:language "und",
    :handler_name "VideoHandler",
    :vendor_id "[0][0][0][0]"},
   :color_range "tv",
   :r_frame_rate "24/1",
   :pix_fmt "yuv420p",
   :index 0,
   :refs 1,
   :codec_type "video",
   :coded_width 640,
   :color_transfer "smpte170m",
   :start_time "0.000000",
   :width 640,
   :codec_tag_string "avc1",
   :avg_frame_rate "24/1",
   :chroma_location "left",
   :duration "54.833333",
   :film_grain 0,
   :start_pts 0,
   :disposition
   {:still_image 0,
    :timed_thumbnails 0,
    :default 1,
    :dub 0,
    :original 0,
    :lyrics 0,
    :karaoke 0,
    :attached_pic 0,
    :non_diegetic 0,
    :captions 0,
    :comment 0,
    :dependent 0,
    :descriptions 0,
    :visual_impaired 0,
    :hearing_impaired 0,
    :metadata 0,
    :clean_effects 0,
    :forced 0},
   :nal_length_size "4",
   :is_avc "true",
   :codec_name "h264",
   :level 30,
   :time_base "1/12288",
   :sample_aspect_ratio "1:1",
   :bits_per_raw_sample "8",
   :extradata_size 48,
   :coded_height 480,
   :id "0x1",
   :codec_long_name "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
   :has_b_frames 2,
   :display_aspect_ratio "4:3",
   :bit_rate "574034",
   :color_primaries "smpte170m",
   :closed_captions 0,
   :nb_frames "1316",
   :field_order "progressive",
   :duration_ts 673792,
   :profile "High",
   :height 480,
   :codec_tag "0x31637661"}
  {:tags
   {:language "und",
    :handler_name "SoundHandler",
    :vendor_id "[0][0][0][0]"},
   :r_frame_rate "0/0",
   :sample_rate "48000",
   :index 1,
   :channel_layout "stereo",
   :channels 2,
   :initial_padding 0,
   :codec_type "audio",
   :start_time "0.000000",
   :codec_tag_string "mp4a",
   :avg_frame_rate "0/0",
   :duration "54.848000",
   :start_pts 0,
   :disposition
   {:still_image 0,
    :timed_thumbnails 0,
    :default 1,
    :dub 0,
    :original 0,
    :lyrics 0,
    :karaoke 0,
    :attached_pic 0,
    :non_diegetic 0,
    :captions 0,
    :comment 0,
    :dependent 0,
    :descriptions 0,
    :visual_impaired 0,
    :hearing_impaired 0,
    :metadata 0,
    :clean_effects 0,
    :forced 0},
   :codec_name "aac",
   :time_base "1/48000",
   :extradata_size 5,
   :id "0x2",
   :codec_long_name "AAC (Advanced Audio Coding)",
   :bit_rate "160970",
   :sample_fmt "fltp",
   :nb_frames "2572",
   :duration_ts 2632704,
   :profile "LC",
   :bits_per_sample 0,
   :codec_tag "0x6134706d"}]

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

(def  aud-freq-srq 
        (->> streams
             (filter (fn [stream] (= "audio" (:codec_type stream))) )
             first
             :sample_rate
             (Integer/parseInt)))

aud-freq-srq
48000
ugoday ★★★★★
()
Ответ на: комментарий от sena

Вместа авка там можно вставить вызов интерпретатора кода и на перле и на питоне и вообще на чём угодно.

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

демонстрируется преимущество шела

Над кем?

на такой вызов не будут ещё расходоваться ресурсы

Если мы в принципе говорим о shell’е, то на такую ерунду как ресурсы памяти и процессора мы давно забили.

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

Если мы в принципе говорим о shell’е, то на такую ерунду как ресурсы памяти и процессора мы давно забили.

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

echo «$y1 $y2» | awk ‘{print $1+$2}’

вот это вот всё

Конечно шел с внешними программами справляется великолепно и это должно остаться. awk тоже прекрасен для многих задач. Но кое-что всё же следует доработать :)

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

форк, запуск внешней программы, её инициализация, плюс копировать данные туда-сюда между процессами

Честно скажу, меня это нимало не заботит. Тоесть быстро, конечно, лучше, чем медленно, но меня скорее волнует моя личная производительность. Если всё делается через жопу внешние программы, то запросто может оказаться, что где-то не заметишь, что в subshell’е будут не те переменные, как ты думал, и это обойдётся тебе в пол дня отладки (а то и испорченные данные). Этого бы очень не хотелось.

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

То есть ты согласен что есть пространство для улучшения? ;)

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

shell нужен, чтобы решать проблемы пользователя.

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

Приведённый пример на bash реализуется в разы проще.

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

особенно мило, если всё что тебе нужно - сложить два дабла… echo «$y1 $y2» | awk ‘{print $1+$2}’ Но кое-что всё же следует доработать :)

Я сделалЪ:

$ echo "$((5+3))"
8
Kroz ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.