Опубликован выпуск проекта ShellCheck 0.9, развивающего систему статического анализа shell-скриптов, поддерживающую выявление ошибок в скриптах с учётом особенностей bash, sh, ksh и dash. Код проекта написан на языке Haskell и распространяется под лицензией GPLv3. Предоставляются компоненты для интеграции с Vim, Emacs, VSCode, Sublime, Atom и различными интегрированными средами, поддерживающими GCC-совместимый вывод сведений об ошибках...Подробнее: https://www.opennet.me/opennews/art.shtml?num=58394
must have для всех местных экспертов
Да в принципе для всех нужная, но не необходимая.
Ошибается даже самый маститый гуру консоли, особенно с недосыпу или в цейтноте.
Новые мозги анализатор не поставит.
но он позволит создавать скрипты не подверженные опасным ошибкам. я вообще удивляюсь как никому в голову не пришло создать такой инструмент раньше. это же по сути анализ текста и сверка его с правильным шаблоном(хотя и несколько сложнее). кстати в си и с++ такой анализатор был бы просто спасением в свое время. хотя если с си это можно сделать, то с плюсами куда сложнее. там столько напихали в язык и продолжают пихать, что это окажется той еще задачкой.
>я вообще удивляюсь как никому в голову не пришло создать такой инструмент раньшеРаньше -- это когда? Shellcheck сто лет в обед.
>то с плюсами куда сложнее.
Сложнее, и тем не менее, cppcheck, clang-check, и ещё какие-то есть.
способны ли они в с++ разобраться вот вопрос. там слишком много подводных камней))
У так называемых программистов, не знающих что такое шина адреса и шлепающих формы на скриптухах для верстальщиков типа java, их нет и не может быть.
>Код проекта написан на языке HaskellНо практически бесполезно. Ни GNU Haskell, ни gcc-haskell не наблюдается.
Зато есть GNU/MIT Scheme.
Титаническая программа! От всей этой шелл-лапши никуда не деться, поэтому такой анализатор должен быть очень полезен.
Всегда считал, что вместо systemd надо было вложиться в такой анализатор или генератор скелета скриптов.
и как ты на башпортянках реализуешь асинхронщину и параллельный взаимозависимый запуск служб? да ты споткнешься уже на простейшей задаче "дождаться, когда ядро обнаружит /dev/sda" (нет, делать по таймеру проверку на существование /dev/sda -- это не верное решение)
Никогда до systemd не встречал ситуации, что система не может стартовать, хотя бы и в неполном виде, из-за того, что не может чего-то дождаться.
Даже кернел так то умеет параметр rootwait. Догадаешься почему? А так то ты видимо еще много чего не встречал.
Объясните пж не шарящиму, что это за зверь?
Например ваш raid массив на 48 дисков инициализируется не мгновенно и root device таким образом недоступен если не подождать
А потом "что-то пошло не так" и система не загружается никогда.
И Ctrl+C не нажать как в BSD и попробовать починить систему в /bin/sh
> А потом "что-то пошло не так" и система не загружается никогда.
> И Ctrl+C не нажать как в BSD и попробовать починить систему в
> /bin/shНажимать ctrl+c на bsd системах пожалуйста, кто ж запрещает
> А потом "что-то пошло не так" и система не загружается никогда.Вообще-то один из пойнтов RAID это сделать "что-то пошло не так" более редким явлением.
> И Ctrl+C не нажать как в BSD и попробовать починить систему в /bin/sh
Что и как ты будешь чинить, если рутфс нету, чудак?
А если очень надо то init=/bin/bash в бутлоадере - и чини себе. Но нормальные люди такое извращение если и практикуют то в сильно специальных случаях. Если тебе приходится этим заниматься, 99% что ты занимаешься фигней, и 1% - что у тебя ну вот реально нестандартная системная задача.
> Что и как ты будешь чинить, если рутфс нету, чудак?Какой-то рут есть же, не? Инитрамфс для чего придумали?
> Какой-то рут есть же, не?Ну да, путем телепортации появляется.
> Инитрамфс для чего придумали?
Он опционален. Может быть, может не быть. Его нужность определяется тем вкомпилены ли нужные драйверы фс и блочных устройств в основную тушку или нет. Если они там есть - зачем инитрамфс тогда? Сразу основное зацепит. Если нету - тогда упс, придется вот так. Со всеми радостями генерации этого и временем на распаковку при старте.
Иногда надо загрузиться на деградированном рейде - например, без одного диска в зеркале.
> Объясните пж не шарящиму, что это за зверь?Ждет появления девайса(-ов) с рутфс чтобы смонтировать оный. В зависимости от конфигурации устройство на котором рутфс размещена может появиться и заметно после момента когда кернел уже был технически готов init пытаться запускать "сам по себе". Если кернел попытается инит запустить и не найдет его - он довольно крепко на это дело обижается. А вот так - пожалуйста, потуповэйтит появления нужного устройства вместо того чтобы сразу обижаться на отсутствие инита.
Мало ли, разным железкам разное время на инициализацию надо. А старт с initrd это не единственный возможный вариант. Можно и без initrd стартовать.
> реализуешь асинхронщину и параллельный взаимозависимый запуск службА оно надо? Там выйгрыш ничтожно мал, если раскрутка только дисков занимает минут 5 на сервере, что мне с миллисекунд победы?
Даже на домашнем пк можно сделать systemd-analyze blame и обалдеть, как все плюсы системды разбиваются об ожидание mount или dhcp.
А еще мое любимое при выключении, Waiting for process: "Дохлый недоеденный енот" .. 1s / 10min
> да ты споткнешься уже на простейшей задаче "дождаться, когда ядро обнаружит /dev/sda"Ты в курсе, что pid=0 запускается, когда ядро уже загружено и все проинициализировало. Типичный фанат поттеринга.
> pid=0 запускаетсяТы в курсе, что процесса с pid=0 не существует? Типичный критикан системд.
> ядро уже загружено и все проинициализировало
И кто же это все проинициализировал? Да ядро даже /dev тебе не подключит, пока явно не попросишь или не выставишь соответствующий конфиг перед компиляцией. (Спойлер: дистрибутивные ядра его не выставляют.) В общем критикан системд дважды грубо ошибся в одном предложении. "Это уметь надо!"
> Ты в курсе, что процесса с pid=0 не существует? Типичный критикан системд.Вроде в его роли ядерный тред выступает. Который потом 1 создает и инит.
>> ядро уже загружено и все проинициализировало
> И кто же это все проинициализировал?Он видимо из позапрошлого века пишет и продолбал момент когда ядро так то стало довольно асинхронным кроме всего прочего, в том числе и по инициализации железа.
> В общем критикан системд дважды грубо ошибся в одном предложении. "Это уметь надо!"
Малацца, анон. Я вон тут поху мастеркласс насчет самбы дал, точнее ksmd. Букмарки иногда апдейтить надо, фигли.
> и как ты на башпортянках реализуешь асинхронщину и параллельный взаимозависимый запуск служб?Ну так пойди и посмотри, как оно в Debian было сделано. И стартовало, между прочим, быстрее, чем стало после внедрения systemd.
> генератор скелетов в шкафуИзвините, не удержался.
> Всегда считал, что вместо systemd надо было вложиться в такой анализатор или
> генератор скелета скриптов.А я вот не считаю, что шелл-лапша -- это лучшее решение для процесса загрузки. Но и жирный, переусложнённый systemd (который к тому же всё хочет замкнуть на себя, эдакий вендорлок) -- тоже плохое решение. В идеали видится что-то простое и быстрое, которое решает только одну нужную задачу. В целом, такие проекты есть, но не снискали особой популярности.
Хорошо.
>отсутствие пробелов при сравнении "[[ $foo==0 ]]", наличие пробелов "var = 42"Хороший язык, продуманный. Консистентный, я бы сказал.
у раста по части памяти всё хорошо в сравнении с дедовыми плюсами, ведь она у него не течёт как у ски в месячные
Уровень лексикона растоманов понятен
Большинство местных растоманов в пуберантном периоде
Как и всех остальных -манов на этом ресурсе, что очевидно из всей демагогии в комментариях под любой новостью о Rust, да и не только. Настоящих спецов здесь крайне мало, будь то растоманов, сишников, приплюснутых, скорлупщиков и т.д. Рассадник самоуверенной школоты, короче. Сам не знаю, зачем читаю комментарии и отвечаю на них, но от детерминизма не убежишь.
>Сам не знаю, зачем читаю комментарии и отвечаю на нихПотому что ты сам считаешь, что удобненький язычок с удобненьким пакетным менеджером научит тебя кодить.
Я считаю, что кодить меня научит только практика, чем я и занимаюсь. Я больше не разрабатываю софт профессионально после выгорания и долгих лет борьбы с депрессией, но дело идёт на поправку, последние несколько месяцев я слежу за своим питанием (кето, витамины и т.д.) пью Страттеру (для СДВГ) и это приносит плоды - появилась куча энергии, исчезла вечная усталость, и теперь я после работы сантехником и в выходные уже недель шесть допиливаю свою библиотеку risky (https://github.com/burjui/risky/tree/v0.4.0) для кодирования инструкций RISC-V (пока только RV32I + M + Zicsr): написал документацию, под две сотни тестов, улучшил API. Потом буду добавлять другие расширения, займусь своим игрушечным компилятором (https://github.com/burjui/rambo), который тоже нуждается в переработке: сделаю внятное выделение регистров, переделаю герерацию RISC-V инструкций (сейчас там примитивный говнокод), добавлю новые оптимизации (сейчас только constant folding + propagation и инлайнинг функций), языковые конструкции. Потом буду изучать теорию типов, чтобы вообще понимать, что я делаю. Я всегда изучал новые ЯП для расширения кругозора и тренировки мозга (вот недавно пощупал koka (очевидная шутка для местных петросянов)), и продолжу это делать, пока он у меня есть.Короче, я хоть что-то делаю, пусть и на ненавидимом здесь Rust и как хобби, а местные ыксперты пусть и дальше верят в сказки об идеальном коде идеальных программистов, и поучают меня при помощи демагогии. Время покажет, кто из нас тратит время впустую, а кто развивается.
>стена текстаГораздо выразительней этой стены текста с саморекламой говорят сами за себя выпады в сторону сишных указателей и такого неудобного шелла, которого удобнее питончик, политый удобненьким VSCode. От обоих выпадов прямо-таки навевает словами "детская травма".
Да мало ли, что они тебе говорят. Сейчас бы прислушиваться к мнению какого хрена с опеннета, у которого нет даже ника, не то что кода, знаний и опыта. Разве что опыта демагогии 😁
Зачем вы себя мучаете этим программированием, непонятно. Есть куча других профессий и занятий по мимо ИТ.
Зачем вы себя мучаете чтением моих комментариев, непонятно. Есть куча другого текста "по мимо" написанного мной.
>и теперь я после работы сантехником и в выходные
> уже недель шесть допиливаю свою библиотеку risky (https://github.com/burjui/risky/tree/v0.4.0)
> для кодирования инструкций RISC-V (пока только RV32I + M + Zicsr):Очень жирно
Жирно или нет, но:
1. Мне есть, что показать, чего не скажешь о местной школоте.
2. В risky покрытие кода тестами 99.55%, она быстрая и корректно работает на big-endian, в ней нет кривой работы с памятью и последняя не течёт.
3. Нормального человека мой пример может мотивировать на написание кода, и мне неважно, будет это код на Rust, С, Python или BASIC - лишь бы человек писал код и учился. А такие, как вы - одна из причин, почему люди теряют веру в человечество.Я человек не злой по натуре, и вам бы искренне пожелал хорошего дня, но, сдаётся мне, для вас хороший день - это плюнуть кому-нибудь в душу, поэтому не буду.
С каких пор джаваскритпизеры стали сантехниками?
Ещё один выполз... Я никогда не писал ни на JS, ни на PHP, а в Битриксе делал приложения для Android на Java и Kotlin (который там внедрял я).
> Ещё один выполз... Я никогда не писал ни на JS, ни на
> PHP, а в Битриксе делал приложения для Android на Java и
> Kotlin (который там внедрял я).Раскрою тебе секрет: разработчик под мобилки такой же формошлеп.
Раскрою тебе секрет: я не пишу под Андроид уже лет 8. И ещё один: в нём кроме UI ещё много всего. Ну да ладно, куда мне до тебя, ты же, поди, работаешь с бигдатой, ИИ, запускаешь спутники, а в перерывах пишешь компиляторы.
> Раскрою тебе секрет: я не пишу под Андроид уже лет 8.Такс. Ты вроде как хвалился тем, что писал под Андроид, что не формошлеп, а теперь пошли оправдания "не пишу уже 8 лет".
> И ещё один: в нём кроме UI ещё много всего.
Не поверишь, но джаваскриптизеры также говорят.
> Ну да ладно, куда мне до тебя, ты же, поди, работаешь с бигдатой, ИИ, запускаешь спутники, а в перерывах пишешь компиляторы.
Во всех вышеупомянутых областях используется С, С++, Python, которые ты так ненавидишь. Ой. Получается ты приводишь в пример то, что ненавидишь. Как же так?
> в ней нет кривой работы с памятью и последняя не течёт.
> не течётОткуда такая уверенность?
Во-первых, оттуда, что я не писал такой код, в котором даже теоретически может течь. Во-вторых, valgrind. А в-третьих, я научился у местной сишной интеллигенции одному хитрому трюку: делаешь умное лицо и сразу просто знаешь, что твой код лучше, а все, кто не согласен - быдло.
> Во-первых, оттуда, что я не писал такой код, в котором даже теоретически может течь.А доказательско теории где можно посмотреть?
> Во-вторых, valgrind.
Тестирование программ может оказать наличие ошибок, но никогда не покажет их отсутствие. (с) Дейкстра
> А в-третьих, я научился у местной сишной интеллигенции одному хитрому трюку: делаешь умное лицо и сразу просто знаешь, что твой код лучше, а все, кто не согласен - быдло.
Вижу сишная интеллигенция тебе не сказала, что это не работает для быдла.
> А доказательско теории где можно посмотреть?Динамическое выделение памяти не используется, течь не может в принципе. Если хочешь формальное доказательство - доказывай сам на здоровье. Но лучше не страдай фигнёй, а научись пользоваться спеллчекером.
> Динамическое выделение памяти не используется, течь не может в принципе.Что растоманы подразумевают под динамическим выделением?
То же, что и синяки. Есть такой классный сервис для поиска информации по фразам, называется Google, очень рекомендую. Я понимаю, что любые высказывания "растоманов" здесь принимаются в штыки, независимо от смысловой нагрузки, но сервис действительно хорош, и его используют миллиарды людей во всём мире. Например, среди первых результатов есть ссылка на статью в Wikipedia. Это, кстати, ещё один замечательный сервис, база знаний. Там можно узнать много интересного про компьютеры.
> То же, что и синяки. Есть такой классный сервис для поиска информации
> по фразам, называется Google, очень рекомендую. Я понимаю, что любые высказывания
> "растоманов" здесь принимаются в штыки, независимо от смысловой нагрузки, но сервис
> действительно хорош, и его используют миллиарды людей во всём мире. Например,
> среди первых результатов есть ссылка на статью в Wikipedia. Это, кстати,
> ещё один замечательный сервис, база знаний. Там можно узнать много интересного
> про компьютеры.Вижу ты совершенно не понимаешь, что происходит у тебя в коде.
А ты понимаешь, что происходит у меня в коде? Как насчёт челленджа: найти утечку памяти в risky v0.4.0. Разумеется, я шучу, потому что:
1. Я не настолько мизантроп, чтобы просить кого-то искать утечки памяти там, где их быть не может по определению, в 6600 строках кода.
2. Всё равно никто здесь на это не решится по разным причинам:
- Нет желания
- Нет времени
- Нет компетенции
- Нет даже базового знания Rust
- Да просто потому что иди нахренЛадно, без шуток, теперь аргументируй, в чём я неправ насчёт утечек памяти и динамического её выделения. Я - человек не гордый, умею признавать ошибки (как это было с занулением указателей через calloc в каком-то треде).
> Растоман общается как недоразвитый подростокВот мне интересно, ты и правда настолько глуп, или просто притворяешься, что не понял, что эта известная фраза как бы исходит от читателя моего кода, в жалкой попытке выставить меня неадекватом? Боже, с кем я веду диалог... просто невыносимый уровень тугости.
> дальше можешь не стараться.
Ай молодец, отмазался. Я и не сомневался, что ты только в лужу пердеть можешь, а код даже читать не умеешь и, скорее всего, его даже боишься, потому что он заставляет думать.
Ты второй за всё время, кого я добавлю в игнор. И я на 100% уверен, что ты будешь гордиться этим, будто неким достижением: мол, гагага, затралил растомана. Молодец, возьми с полки пирожок и дальше смотри мультики под пиво и играй в майнкрафт, или чем там занимаются школьники в свободное время, кроме троллинга на опеннете.
>[оверквотинг удален]
> я веду диалог... просто невыносимый уровень тугости.
>> дальше можешь не стараться.
> Ай молодец, отмазался. Я и не сомневался, что ты только в лужу
> пердеть можешь, а код даже читать не умеешь и, скорее всего,
> его даже боишься, потому что он заставляет думать.
> Ты второй за всё время, кого я добавлю в игнор. И я
> на 100% уверен, что ты будешь гордиться этим, будто неким достижением:
> мол, гагага, затралил растомана. Молодец, возьми с полки пирожок и дальше
> смотри мультики под пиво и играй в майнкрафт, или чем там
> занимаются школьники в свободное время, кроме троллинга на опеннете.Ахахаха. Забанил анонима. Если ты такая истеричка, то лучше вообще сюда не заходи.
Он прекрасно понимает, думаю. А вот ты базовой терминологией не владеешь, что, впрочем, для местного "эксперта" неудивительно. Ты, кстати, так и не ответил, с чем работаешь и в какой области. Ни одного проекта не привёл в ответ. Что весьма и весьма хорошо характеризует тебя.
> Он прекрасно понимает, думаю.Он прекрасно показал, что не понимает ничего. Еще и сдеанонился.
Ещё как у Раста течёт. Этож способ защиты от use-after-free.
Я бы рассказал шутку про раст, но она не поместится в стек.
Я бы рассказал шутку про C, но Й№28(%3?*№3Х{>?5ц
Segmentation fault
> Я бы рассказал шутку про C, но Й№28(%3?*№3Х{>?5ц
> Segmentation faultВот что бывает, когда растоман пытается пошутить в unsafe блоке.
Ой-ой-ой, синяки обиделись и накидали минусов, а теперь ещё и вяло петросянят об этом, я расстроен до глубины ноздри. По твоей логике, вы сами-то даже думаете в одном большом unsafe блоке, что объясняет качество ваших антирастовых шуток: гага в расте стек переполнен (сказал пользователь языка, популяризовавшего термин stack overflow, лол), гага растоманы (шутки про наркотики всегда актуальны среди зрителей Камеди кала).
> Ой-ой-ой, синяки обиделись и накидали минусов, а теперь ещё и вяло петросянят
> об этом, я расстроен до глубины ноздри. По твоей логике, вы
> сами-то даже думаете в одном большом unsafe блоке, что объясняет качество
> ваших антирастовых шуток: гага в расте стек переполнен (сказал пользователь языка,
> популяризовавшего термин stack overflow, лол), гага растоманы (шутки про наркотики всегда
> актуальны среди зрителей Камеди кала).У тебя мусор в голове. Просто нормальные люди видят плюсы и минусы, а ты только плюсы или только минусы.
То есть, ты сейчас подтвердил, что 90% комментаторов про Rust - ненормальные, потому что видят в нём одни минусы.
> То есть, ты сейчас подтвердил, что 90% комментаторов про Rust - ненормальные,
> потому что видят в нём одни минусы.Я же говорю у тебя мусор в голове. Ты видишь, что хочешь видеть.
Ты вообще много говоришь. Иди код пиши лучше, балабол.
> Ты вообще много говоришь. Иди код пиши лучше, балабол.Этот растаман порвался, несите следующего
Нужен новый shell, безопасная работа с памятью которого обеспечивается во время компиляции через проверку ссылок, отслеживание владения объектами и учёт времени жизни объектов (области видимости), а также через оценку корректности доступа к памяти во время выполнения кода. Также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
> Нужен новый shell, безопасная работа с памятью которого обеспечивается во время компиляции
> через проверку ссылок, отслеживание владения объектами и учёт времени жизни объектов
> (области видимости), а также через оценку корректности доступа к памяти во
> время выполнения кода. Также предоставляет средства для защиты от целочисленных переполнений,
> требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает
> ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок
> и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических
> ошибок.Нужен. Например на Lua.
Идеальный вариант!
Самый быстрый некогда интерпретатор. Достаточно пластичный и мощный язык.
На фоне баша, ему можно простить даже кривость инопланетного синтаксиса.Есть ли варианты, вроде IPython и Xonsh?
Язык хороший, но в качестве замены шелла не взлетит. Замена шеллу - это перл. Нравится вам это или нет. И это уже 30 лет так.
Есть ли у перла варианты типа Xonsh?
Perl конечно... так себе замена то. Вот это видеть ГА;) К*Г)*а4гн8кн82 вместо [[ $RE -gt 2 ]]
Кривой баш, в любом случае, давно уже требует замены. Привыклю корячиться буквой зю, и ничего не меняется. Школьники уже даже умудряются боготворить его идеальность.
Баш ужасен, и с этим не поспоришь, но позикс шелл с bsd-шными coreutils ещё хуже — там потенциал выстрелить себе в ногу на два порядка выше
Суть в том, что баш это очень кривая подпорка, на сегодняшний день.
Люди делают его замены, меньшей кровью. Успешно. Оболочка ZSH недалеко ушла, но куда удобней.
Fish ушел еще дальше и боли меньше. Но концептуально, на претендента замены подходят лишь IPython и Xonsh.
Т.е. люди это осознают давно уже и даже есть вариант - пайтон в основе.
Интересно, пробовал ли кто-то луа.. люди на реддите очень хотят луа на этом месте видеть. И даже есть интересные варианты использования. Но по существу, воз и ныне там.
Проблема в том, что эта подпорка есть везде. Может быть когда-нибудь, лет эдак через -цать, когда питон станет главной зависимостью во всех линуксах, люди начнут перебираться на шелл на основе него, а пока — скрипты для пакетов будут писаться на sh с пригоршней башизмов, клей в Dockerfile будет писаться на sh с привкусом смузи и томатного гозе и весь мир будет прилаживать костыли и подпорки к получившейся хтони
Питон это антипод юниксвэя. Может сделать что угодно, но делает все одинаково паршиво.И совершенно не способствует разделению системы на мелкие быстрые и эффективные кирпичики объединяемые более высокоуровневым координатором через пайпы под конкретную задачу. Вместо этого вы скорее получите монолитное здоровенное блоатваре, являющейся пародией на нормальную программу и требующее переписывания раз в полгода. В этот момент все как раз все и узнают что такой код майнтенансу не подлежит, так что период полураспада подобных конструкций - очень сильно более другой по сравнению с даже, вот, шеллскриптом обычным.
А приколитесь, шелскрипт эпохи питона 2.4 прекрасно заработает на моей системе. Без танцев с бубнами. А теперь попробуйте это с скриптом на питоне 2.4 в современной системе повторить и чтоб не переписать минимум половину при этом. Ну и вот зачем бы такая системная автоматизация нужна? Чтобы убивать на ее майнтенанс времени больше чем она экономит на решении тех задач?
> А теперь попробуйте это с скриптом на питоне 2.4 в современной системе повторить и чтоб не переписать минимум половину при этом.Дичь поришь. Берешь 2.7 и запускаешь скрипт.
Данунафиг, антипод юниксвэя. Делает что угодно и одинаково фигово. Ведет к тому что вместо нормальных кирпичиков объединяемых вон тем - здоровенные шевелящиеся монстры с щупальцами, которые страшно трогать руками.
Power Shell.
вот кстати, отличное решение. есть команды - согласен. и вывод, в json есть. который всегда можно распарсить, не непонятными регулярными выражениями, которые разваливаются на ходу, а нормальным json парсером, получить те данные которые нужно и проч.
единственная проблема - родные системные утилиты не дают выхлоп в таком формате.
а башем, парсить строковый вывод - это про времена, когда всю ось мог написать один Линус. а сегодня - это про мазохизм.
пожалуйста, изложите свои мысли в виде json-а а то вас трудно парсить
Нужен новый шелл-ланг, который как %хайповый_язычок%, но другой.
Под новый шелл-ланг нужен новый интерпретатор, мегабайт на сто, как МощныйРакушка.
Под новый интерпретатор нужно новое системное окружение, где он *сможет_раскрыть_потенциал*.
Под новое окружение нужны новые принципы создания аварийных и удаленных оболочек, чтобы юзер не умер в чистом sh.
...
Про Scheme уже было?
В удалённых.
Какая ещё компиляция при скриптовании?
sbcl когда-нибудь видел? вот это оно
https://www.oilshell.org/
https://www.nushell.sh/
лучше уж es-shell воскресить
https://wryun.github.io/es-shell/
Попытки из шелла и скриптовых языков делать что-то квазитипизированное - это клиника.
На шелле не надо программировать. Он не для этого. В юникс даже не обязательно писать на скриптовых языках. Вас никто не заставляет использовать инструменты, с мощью которых вы не можете справиться.
Если шелл не для того чтобы программировать, то почему в System V на нём писали программы?
Сам SysVinit на Сишке. А на bash там писали и пишут скрипты.
Я не готоврю про sysVinit. Я говорю про AT&T UNIX System V. diff3, spell, basename, uuto, dirname, man, install и многие другие команды написаны на shell.
Так и деды и в лаптях на телеге когда-то ездили, и что?
>diff3, spell, basename, uuto, dirname, man, install и многие другие команды написаны на shell.все перечисленные тобой утилиты написаны на Си
В этом юниксвэй и состоит: объединять быстрые эффективные кирпичики вон тем координатором через пайпы. А то что народ из инструмента для glue-логики зачем-то временами чуть не мегаприложухи пытается, так что сабж требоваться начинает - бывает и такое, конечно.
>А то что народ из инструмента для glue-логики зачем-то временами чуть не мегаприложухи пытаетсяТак выходит же - почему не пытаться?
> Так выходит же - почему не пытаться?Ну да, а у другого тут выходит видео блендером редактировать. Можете попробовать еще объяву на забор в автокаде написать, почему не пытаться? :)
>Ну да, а у другого тут выходит видео блендером редактировать. Можете попробовать еще объяву на забор в автокаде написать, почему не пытаться? :)Когда это блендер и автокад стали универсальными инструментами навроде шелла?
> Когда это блендер и автокад стали универсальными инструментами навроде шелла?Я бы не стал настаивать что он вот именно универсальный.
Конкретный пример: написать HTTP сервер на шелле ну не то чтобы вообще совсем нельзя, но, поверьте, это крайне паршивая идея.
>Я бы не стал настаивать что он вот именно универсальный.Какой есть, универсальней особо нет. Язычок для управления программ, внезапно на котором при наличии достаточного числа этих самых программ можно написать что угодно, если надо.
>Конкретный пример: написать HTTP сервер на шелле ну не то чтобы вообще совсем нельзя, но, поверьте, это крайне паршивая идея.
inetd и готово, работать будет, причём такую портянку можно засунуть в роутер и будет не хуже дырок на пхп.
Ето если про werc ещё не вспоминать, правда вот шелл там уже немножечко другой, но суть одна.
Не в System V. Значит всё же он изначально и задумывался для программирования утилит
>Попытки из шелла и скриптовых языков делать что-то квазитипизированное - это клиника.Только в том случае, если накладывание типов не тащит за собой контракты (тут можно поспорить) или реальную оптимизацию кода (а тут нельзя). Ничего из этого подгавкиватели за тайпскриптом и сам тайпскрипт не делают.
Иногда, конечно, в шелле (ash) подкорке мозга не хватает структур данных, но пережить это можно.>На шелле не надо программировать.
Надо, пайплайн на шелле проживёт дольше портянки на питоне.
>В юникс даже не обязательно писать на скриптовых языках.
Если пишуший не проникся философией юникс. Ну как здоровому ходить в инвалидной коляске. Я считаю так: не освоившему базовые навыки компьютерной грамотности на юниксе делать нечего - иначе юникс очень быстро и окончательно вместо годного инструмента станет большой инвалидной коляской.
Всё-то, может, и по делу, и верно, но только суть баша от этого не меняются: встратый синтаксис, несколько слоёв expansion-ов, shopt-магия и так далее. Баш, может быть, мощный инструмент, хороший инструмент, но точно не удобный или современный инструмент, о чём тут спорить вообще.
>синтаксисГодный синтаксис у обычного шелла, что надо умещает получше любого питона, про башизмы тебе не отвечу.
>несколько слоёв expansion-ов, shopt-магия
Да наплевать. Наквотил разик, запомнил и забыл. Больше двух уровней обратных кавычек редко бывает. Из опций только трассировка и может быть полезной в основном, ну -e плюс-минус, магии в этом нет.
>не удобный
busybox ash делает бррррр, работа делается, что ещё надо? Даже репл есть.
>или современный
Т.е. знания шелла не обесцениваются. Это наоборот плюс.
>Годный синтаксис у обычного шеллаГов-ный там синтаксис. Ты хоть статью почитай, что ли. Пробел лишний поставил - уже проблему получил. Не поставил - снова проблема. Что здесь может быть хорошего?
>что надо умещает получше любого питона
Нихрена обычный шелл толком не умеет, особенно без утилит, типа awk, grep, sed, find, tr, basename, dirname и прочих.
У каждой такой утилиты, понятное дело, свой мозговыносящий синтаксис,что тоже никак не добавляет читабельности программ на шелле.
Хорошего здесь то что с таким синтаксисом ты можешь делать присвоение прямо в команде:
foo=123 progaЕсли разрешить пробелы при присвоении будет неоднозначность.
Line 1:
rm -rf /usr /bumblebee
^-- SC2114 (warning): Warning: deletes a system directory.
Ну, как видишь, работает. Не на...ли :)
Действительно работает, если убрать пробел, то ложного срабатывания не будет.
Настоящими программистам все эти проверки не нужны, они нужны только всяким там, которые даже язык не знают на котором пишут
Есть одна проблема с вашим определением термина "настоящий программист": таких не существует. Нет и не было за всю историю человечества ни одного индивида, который бы не совершал ошибок. Конечно, если это мелкий одноразовый скрипт для не слишком важной ерудны, то цена ошибки настолько мала, что можно обойтись и без статического анализатора. Но если он уже есть, не пользоваться им - безумие.
Так там одна часть в рекламке шеллчека так и гласит: ищут ошибки новичков, и шоб никаких криптик мессаджес!
> статического анализа shell-скриптовБлин, если вам это понадобилось, вы что-то, вероятно, делали не так.
согласен. ошибки нужно искать не в коде, а в ДНК
У баша какие-то проблемы с совместимостью. Несколько лет всё прекрасно работало, а тут он в 5.2 фейлится на ?() в $() и надо теперь вместо $() использовать обратные кавычки. При этом, в синтетическом коде это не проявляется и надо было догадаться, где проблема.
Покажи код, аноним. Баш не должен фейлиться на $() никогда.
Да, я тоже думал проблема может быть в другом месте, но она именно тут (похоже, дело именно во вложенной ?(), но если с ней что-нибудь сделать, glob не будет работать, как надо)line 90: syntax error near unexpected token `('
shopt -s extglob
fname=$(shopt -s failglob;shopt -s nocaseglob;echo "${fname}"/?("${BASH_REMATCH[1]}")"${BASH_REMATCH[2]}${BASH_REMATCH[3]}"$pext)
[[ 0 -ne $? ]] && echo '#glob match failed' && exitnow
shopt -u extglobДо bash-5.2 всё было норм, 0 проблем с файлами. Этот скрипт генерирует страничку для веббраузера, и в один прекрасный день он просто перестал это делать(
>[оверквотинг удален]
> именно тут (похоже, дело именно во вложенной ?(), но если с
> ней что-нибудь сделать, glob не будет работать, как надо)
> line 90: syntax error near unexpected token `('
> shopt -s extglob
> fname=$(shopt -s failglob;shopt -s nocaseglob;echo "${fname}"/?("${BASH_REMATCH[1]}")"${BASH_REMATCH[2]}${BASH_REMATCH[3]}"$pext)
> [[ 0 -ne $? ]] && echo '#glob match failed' && exitnow
> shopt -u extglob
> До bash-5.2 всё было норм, 0 проблем с файлами. Этот скрипт генерирует
> страничку для веббраузера, и в один прекрасный день он просто перестал
> это делать(У меня ваш код работает ожидаемо в GNU bash, версия 5.1.16(1)-release (x86_64-pc-linux-gnu)
в 5.1 эта ошибка синтаксиса вылетает, если extglob не задавать, "?()" будет некорректным. Ваш пример загрязнен BASH_REMATCH и прочими неимеющими отношения к вопросу деталями. это затрудняет диагностику.
Могу предположить, что если у вас вылетает не описанная вами ошибка про line 90, но просто не находится файл, то беда в том, что нет матча на содержимое ?(), при failglob будет ошибка матчинга. То есть, вы указали что мол вам и не нужно то, что в скобках, но это все равно будет fail globbing.
В генте 5.2 ещё маскирован, как обновится - проверю ещё раз ваш кейз. Должен работать.
Нет, баш в генте 5.2 в тестовой ветке, не замаскирован. Я уже говорил, что в синтетическом примере не проявляется, поэтому нет смысла. Это была копия проблемного кода и я отдельно убедился, что дело именно в нём. Баш вообще не пытается исполнить этот файл, поэтому переменные никакого значения не имеют.
> Нет, баш в генте 5.2 в тестовой ветке, не замаскирован. Я уже
> говорил, что в синтетическом примере не проявляется, поэтому нет смысла. Это
> была копия проблемного кода и я отдельно убедился, что дело именно
> в нём. Баш вообще не пытается исполнить этот файл, поэтому переменные
> никакого значения не имеют.не поленился, собрал локально 5.2 в хомовике, сделал минимальный сампл на базе вашего кода, накидал файликов под матч ?() - вижу пока одно и то же поведение как с системным 5.1, так и с bash-5.2/bash.
Кстати local pext='@(*.mkv|*.mp4|*.avi)' поэтому да, extglob.
так у вас какая именно ошибка? Вижу две в вашем сообщении
1. некорректный синтаксис line 90 -это очень похоже на отключенный extglob
2. файл не находится
Если 2 это следствие №1, то это одна ситуация. Если №2 на одном и том же наборе файлов и минимальном пруфе работает по разному на разных версиях баша - это надо репортить.
Давайте запилим минимальный пруфик бага?
Файл находится в 5.1 и не находится в 5.2? И при чём тут файл, если баш не пытается выполнять этот код, который ему не нравится? В этом у баша большая проблема, если ему что-то не нравится, приходится играть в угадайку. Технически этот код подстановки заранее неизвестного имени даже не использовался, потому что скрипту надо передать каталог вместо файла и это никогда так и не использовалось. Но, я уверен, что он корректный и всё работает, как и ожидалось, специально это проверил. Тут большая проблема, что extglob не работает корректно с @ в имени. Просто внезапно баш после обновления решил, что надо использовать обратные кавычки тут. Выглядит 100% как баг, или регрессия.Вот полный пример кода, в котором $() не работает, но кавычки работают как и с 5.1.
#!/bin/env bashprocess_dirname(){
local pext='@(*.mkv|*.mp4|*.avi)'
shopt -s extglob
fname=$(shopt -s failglob;shopt -s nocaseglob;echo "${fname}"/?("123")"qwe"$pext)
[[ 0 -ne $? ]] && echo '#glob match failed' && exit 1
shopt -u extglobif [[ ! -f "${fname}" ]];then
echo "new filename ${fname@Q} couldn't be located, didn't guess the filename correctly"
exit 1
fi
echo "# filename for ${file@Q} changed to ${fname@Q}"
}file="$@"
[[ -n "${file}" ]] || { echo -e "Usage:\t$0 FILENAME"; exit 1; }fname="${file##*/}"
fpath="${file%/*}"
[[ -d "${fname}" ]] && process_dirnameЕщё раз, дело именно в синтаксической ошибке от $(?()) и не в чём-либо ещё.
>[оверквотинг удален]
> echo "# filename for ${file@Q} changed to ${fname@Q}"
> }
> file="$@"
> [[ -n "${file}" ]] || { echo -e "Usage:\t$0 FILENAME"; exit 1;
> }
> fname="${file##*/}"
> fpath="${file%/*}"
> [[ -d "${fname}" ]] && process_dirname
вы не поверите, но этот код зависит от файлов, которые находятся - или не находятся. Предлагаю собрать локально 5.2 и 5.1, и убедиться, что оба интерпретатора работают идентично, вызывая прямо ~/src/bash-5.1/bash ./script.sh и ~/src/bash-5.2/bash ./script.sh
Трюк с VAR=$(echo $VAR) это фактически аналог разыменовывания указателя, получения конкретного значения переменной, вместо вычисления переменной каждый раз. Именно для него вам понадобились здесь shopt. В тонком месте и порвалось, ни одно кодеревью этот код не прошел бы; но всё-таки, врядли дело в версии баш. прошу проверить через выполнение именно разными версиями, установленными локально. С новым годом!
Этот код ни от чего не зависит, если он не интерпретируется. Не понимаю, что тонкого в ?(), если extglob -- это штатная функциональность баша? Я уже уже собирал баш 5.0_p18 и 5.1_p16-r2 -- в них нет ошибки синтаксиса, которая возникла сразу после размаскировки 5.2_p15 пару месяцев назад. Более ранние рассматривать нет смысла, в остальном коде присутствует максимально много башизмов, потому что только они позволяют писать профессиональный и устойчивый к ошибкам и уязвимостям код без лишних зависимостей (у которых будут свои особенности опять же). Конкретно приведённый код демонстрирует эту ошибку в 5.2_p15, её там быть не должно, либо $() вообще нельзя использовать нигде и никак.
> Этот код ни от чего не зависит, если он не интерпретируется. Не
> понимаю, что тонкого в ?(), если extglob -- это штатная функциональность
> баша? Я уже уже собирал баш 5.0_p18 и 5.1_p16-r2 -- в
> них нет ошибки синтаксиса, которая возникла сразу после размаскировки 5.2_p15 пару
> месяцев назад. Более ранние рассматривать нет смысла, в остальном коде присутствует
> максимально много башизмов, потому что только они позволяют писать профессиональный и
> устойчивый к ошибкам и уязвимостям код без лишних зависимостей (у которых
> будут свои особенности опять же). Конкретно приведённый код демонстрирует эту ошибку
> в 5.2_p15, её там быть не должно, либо $() вообще нельзя
> использовать нигде и никак.пруф должен выглядеть так:
mkdir test
cd test
mkdir dir
touch dir/{имена_файлов_под_матч}
~/src/bash-5.1/bash ~/src/script - работает
~/src/bash-5.2/bash ~/src/script - не работает
пока этого нет - говорить о регрессе бессмысленно.
Зачем мне это? Я накатил старые версии интерпретатора, которые есть в репах, и убедился, что у них всё нормально. Этого более чем достаточно. Но ладноhttps://ftp.gnu.org/gnu/bash/bash-5.2.15.tar.gz
~ $ ./configure
~ $ make
~ $ ./bash -x ~/bin/bashextglob.sh 123
~/bin/bashextglob.sh: line 6: syntax error near unexpected token `('
~/bin/bashextglob.sh: line 6: ` fname=$(shopt -s failglob;shopt -s nocaseglob;echo "${fname}"/?("123")"qwe"$pext)'ожидаемый результат выглядит вот так
~ $ bash -x ~/bin/shitsniffer3.sh 123
+ file=123
+ [[ -n 123 ]]
+ fname=123
+ fpath=123
+ [[ -d 123 ]]Сколько раз надо повторить, что дело не в файлах? Это уже 10 вроде.
>[оверквотинг удален]
> "${fname}"/?("123")"qwe"$pext)'
> ожидаемый результат выглядит вот так
> ~ $ bash -x ~/bin/shitsniffer3.sh 123
> + file=123
> + [[ -n 123 ]]
> + fname=123
> + fpath=123
> + [[ -d 123 ]]
> Сколько раз надо повторить, что дело не в файлах? Это уже 10
> вроде.так у вас разные скрипты вызываются?
Нет, это один файл. Я же написал, как повторить (когда я пытался воспроизвести на минимальном примере в прошлый раз, почему-то не получилось).
Они не могли придумать более оригинального названия? И как мне гуглить это и искать в репах?
От названия прямо-таки пахнет тем, что эти ребятки юниксом никогда не проникались. Ещё для бинго можно было бы домен .io зарегать.
$ cnf shellcheck
The program 'shellcheck' can be found in following packages:
* ShellCheck [ path: /usr/bin/shellcheck, repository: zypp (repo-oss) ]
* ShellCheck [ path: /usr/bin/shellcheck, repository: zypp (openSUSE-Tumbleweed) ]Try installing with:
sudo zypper install ShellCheck
Если человек в своём профиле пишет, что ему нравится кодить на sh, к нему стоит присмотреться
психиатрам
Или девушкам, как к завидному жениху и уверенному в себе мужчине? 🤔
Вот это и скажешь человеку, умеющему кодить на шелле, когда в очередной раз в слезах к нему обратишься с тем, что ты куда-то нажала и оно перестало запускаться, хорошо, дорогуша?
> а использование "echo {1..10}" будет выделено как несовместимое с dash и sh.ох тыж! ды кому какое дело до этих dash и sh ?
Меинтейнерам пакетов Debian
Тому кто хочет чтобы его скрипт можно было запустить? На нормальной системе, где нет места bash я имею в виду.
Такие системы называются легаси их всё меньше и меньше. Сегодня, если на операционной системе общего назначения не существует баша, это показатель её непригодности к промышленному использованию. Практика деплоев тому доказательством.
Не хватает только канпелятора.
А, да, ещё объект-ориентированности, статической типизации и обязательно всё на хрусте.
Штука отличная.
Много лет выпущенная гуглем Salt bash записки на пипифаксе для меня прям настольный пипифакс. А анализатор, это хорошо, особенно когда свой забытый скрипт надо переделать. Тем более что спросить про bash стеснительно, как пёрнуть в обществе, а очень напрасно. Не любо не слушай, а врать не мешай. Я помню несколько ситуаций, когда высоколобые многомудрые девы реально готовы были потратить нехилые деньги на проблемы решаемые однострочником на баш. Да и гугловое руководство тоже похоже на "к вящему сожалению совсем без bash не получится, но хотябы делайте так, а?"
Какой области девы? По специализации
Совет на скриншоте: "используйте bc или awk" просто "гениальный"..
"Не используйте встроенные фишки в интерпретаторе, лучше создайте ещё один процесс через конвейер и посчитайте в нём" - что за бред?
какие еще встроенные фишки для дробных чисел, ты о чем ?n=3.6
if (( n > 3.5 )); then
echo $n
fiдаже сам bash-интерпретатор вылетает от такого кода:
строка 5: ((: 3.6 > 3.5 : ошибка синтаксиса: недопустимый математический оператор (неверный маркер «.6 > 3.5 »)
на том же скриншоте написано, что шелл не умеет работать с дробями (а ash, dash, bash вроде как не умеют
Да, что-то я дроби не увидел сразу, подумал чекер даёт совет считать всегда в сторонних программах.
не знал о существовании этой тулзы, спасибо!