LINUX.ORG.RU

Вышел bash 5.0

 , ,


3

7

Почти через 10 лет после выхода bash 4.0 и чуть больше чем через 2 года после выхода bash 4.4 состоялся релиз пользовательской оболочки и интерпретатора скриптов версии 5.0.

В новой версии:

  • Встроенная команда «wait» теперь ждёт создания замены последнего процесса;
  • Новые переменные $EPOCHSECONDS и $EPOCHREALTIME, которые раскрываются в секунды с начала эпохи Unix с точностью до секунд и с точностью до микросекунд соответственно;
  • Новые загружаемые встроенные команды: rm, stat, fdflags;
  • Новая переменная $BASH_ARGV0, которая раскрывается в $0 и устанавливает $0 в назначение;
  • При передаче числового аргумента readline'овская команда shell-expand-line больше не удаляет кавычки и подавляет замену команды и процесса;
  • Команда «history -d» теперь понимает отрицательные аргументы как сдвиг с конца истории команд;
  • При передаче аргумента «name» команде «coproc» теперь активируется режим раскрытия слов, таким образом уникальные coproc'ы теперь могут быть созданы в циклах;
  • Цикл раскрытия имён из именных ссылок в функциях теперь раскрывает их в имена переменных в глобальной области видимости;
  • У встроенной команды «wait» теперь появилась опция "-f", которая указывает ждать полного завершения процесса вместо изменения его состояния;
  • Теперь появилось определение в файле config-top.h, которое позволяет оболочке в ограниченном режиме переопределять статическое значение $PATH независимо от содержимого при запуске;
  • Теперь замена процессов не наследует опцию «v» в отличие от замены команд;
  • Теперь если оболочка в неинтерактивном режиме с включенным управлением процессами замечает, что основноц процесс завершился с SIGINT, то ведёт себя как при получении SIGINT;
  • Теперь Posix режим включает единожды запускаемую SIGCHLD ловушку для каждого завершающегося процесса-потомка даже если управление процессами отключено;
  • Новая shopt опция: localvar_inherit; Если она установлена, то локальная переменная наследует значение переменной с таким же именем в ближайшей предшествующей области видимости; Однако, значения переменных несовместимых типов (например, индексированный массив вместо ассоциативного массива) наследоваться не будут;
  • «bind -r» теперь проверяет связана ли указанная последовательность прежде чем связать её с NULL'ом во избежание создания раскладок для многоклавишных последовательностей;
  • Числовой аргумент для команды «operate-and-get-next» теперь указывает какую строку из истории команд нужно редактировать;
  • Позиционные параметры теперь определяются до запуска стартовых файлов, а потому в них теперь стало можно использовать $@;
  • Появилась новая опция, которая доступна на этапе компилирования, которая позволяет отключить проверку того, чтобы наследованная $OLDPWD была директорией;
  • Встроенная команда «history» теперь может удалять диапазоны команд из истории через "-d начало-конец";
  • Встроенная привязываемая команда «vi-edit-and-execute-command» теперь переводит readline обратно в режим вставки vi после выполнения команд из редактируемого файла;
  • Дополнение команд теперь учитывает соответствия алиасам и именам функций оболочки без учёта регистра если установлена переменная completion-ignore-case;
  • Новая опция оболочки «assoc_expand_once», которая включает попытку раскрытия индексов ассоциативных массивов только единожды;
  • Теперь оболочка устанавливает $BASH_ARGV и $BASH_ARGC при запуске только при включенном расширенном отладочном режиме, в то время как раньше они устанавливались независимо от дополнительных условий;
  • Встроенная команда «umask» теперь позволяет указывать режимы и маски больше чем восьмеричное 777;
  • Встроенная команда «times» теперь учитывает локаль при выводе разделителя между целой и дробной частями десятичного числа;
  • В наличии новая, отключенная по умолчанию и незадокументированная опция оболочки, которая позволяет включать и отключать отправку истории команд syslog'у во время их выполнения;
  • Больше нельзя определять переменные перед специальными встроенными командами, которые изменяют атрибуты переменных, а затем возвращают их обратно в исполняемую среду, до тех пор пока уровень совместимости не установлен в 44 или меньше;
  • Теперь можно определять дефолтное значение $HISTSIZE во время компиляции в файле config-top.h;
  • Встроенная команда «complete» теперь принимает опцию "-I", которая указывает что нужно дополнять первое слово в строке;
  • Встроенная в bash malloc() теперь использует mmap() (по возможности) для удовлетворения запросов более чем 128 Кб, таким образом free() теперь может задействовать mfree() для возвращения страниц памяти ядру;
  • Опция «globasciiranges» теперь включена по дефолту и может быть отключена при компиляции;
  • Индексированные и ассоциативные массивы теперь разрешают индексы состоящие исключительно из пробелов;
  • Опция «checkwinsize» теперь включена по дефолту;
  • shopt опции «localvar_unset» и «progcomp_alias» теперь видимы и задокументированы;
  • Обработчик имён сигналов теперь понимает имена от «SIGRTMIN+n» до «SIGRTMAX»;
  • Новая загружаемая встроенная команда seq;
  • Выполнение ловушек теперь учитывает внутренние вызовы «eval»;
  • Переменная $_ теперь не меняется при выполнении форкающей команды;
  • Встроенная команда «kill» теперь принимает такие аргументы как -sSIGNAME и -nSIGNUM даже если соответствующие программы не поддерживают соответствующие сигналы;
  • В Posix режиме теперь включена «shift_verbose» опция;

Новое в библиотеке readline:

  • Неинкрементирующий поиск в vi-режиме ('N', 'n') теперь может искать шаблон оболочки в соответствии со спецификацией Posix (при доступности используется fnmatch());
  • Доступны новые назначаемые команды «next-screen-line» и «previous-screen-line», которые перемещают курсор в тот же самый столбец следующей или предыдущей строки соответственно;
  • Доступны дефолтные привязки клавиш для control-arrow-key комбинаций;
  • Отрицательный аргумент "-N" команды quoted-insert теперь означает вставку следующих N символов используя quoted-insert;
  • Новая публичная функция rl_check_signals(), которая позволяет приложениям отвечать на сигналы, которые ловит readline пока ожидает ввода используя кастомную функцию чтения;
  • Теперь доступна проверка условий относительно версии readline прямо в файле inputrc; Для этого была внедрена своя собственная реализация сравнения: поддерживаемые операторы «равно» и «неравно», строковые переменные могут сравниваться с числами, двоичные переменные должны сравниваться с «on» и «off», имена переменных от операторов отделяются пробелами;
  • Библиотека для раскрытия истории теперь понимает замену команд и процессов, расширенную универсализацию и позволяет появляться им где угодно в словах;
  • Библиотека истории теперь содержит новую переменную, которая разрешает приложенгиям устанавливать начальное состояние закавычивания, таким образом состояние закавычивания может наследоваться от предыдущей строки;
  • Новая публичная функция rl_set_keymap_name() для установки и использования определяемых приложениями имён раскладок;
  • Клавиша «Insert» на цифровом блоке, если доступна, теперь переводит readline в режим перезаписи;

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

★★★★★

Проверено: Shaman007 ()

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

в повершелле ты между пайпами передаешь полноценные объекты, а не текст

Прям объекты с методами или просто структуры данных?

Я вот который год про это слушаю. А в чем преимущество-то?

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

Передавать объекты - это отстойная идея .. ибо они .net- овские. А не нетовскими они не могут быть ибо в посиксе нет понятия объект. А вот то что пайп в шеле - это текст - заблуждение. Пайп - это скорее нетипизированый (в терминах ООП) стрим. Пихай туда все что хочешь. И это очень крутое решение.

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

все команды построены по принципу Глагол-Существительное

Что не обязательно есть хорошо. «подлежащее»-«сказуемое» было бы лучше — вездесущие «get-» не добавляют красоты.

ChildItem

А это, как бы, и не очень существительное. Итого, всё равно угадывать.

самый совершенный инструмент

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

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

Да, только в posh можно напрямую у типизированного объекта свойство почитать, а в твой стрим умрёт на каком-нибудь awk из-за чуть изменившегося формата или локали. Или самый эпик - как парсить имена файлов с пробелами?

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

Для того чтобы прочитать св-во - нужно чтобы это свойство было. А из космоса оно не возникает. Поэтому если вызываешь что-то за пределами ps. Он точно так же парсит пайп и строить объекты (или оболочки). Если вывод команды неизвестный - ценность этих свойств очень сомнительна. Ну а главное - скрипт может и умрет .. а ps- вообще не взлетит на большей части систем.

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

Баш застрял в 80х, уже несколько лет использую фиш для интерактивного терминала, а скрипты на powershell

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

crypt ★★★★★ ()

Новые загружаемые встроенные команды: rm, stat, fdflags;

кто-нибудь знает причину? и как это будет работать вместе со штатным бинарником?

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

Кроме всего можно кодить почти в функциональном стиле, создавать кастомные объекты, хеш-таблицы, вызывать платформ-АПИ, обернув его в функцию и при творческом подходе многое другое. Из недостатков оверхед по памяти, зависимость от мелкософта(но это такое, оно опенсорсня можно форкнуть, собрать при большом желании), не везде есть (под БСД например).

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

В CRUX задумывали перейти на dash
это ж придётся все /etc/rc* скрипты переписывать и ещё не факт что оно взлетит.

Нет там никаких особых проблем. Я много лет пользовался CRUX'ом. И большую часть из этих лет — именно с переделанной на соответствие POSIX shell'у системой инициализации. Конечно, rc-скрипты пришлось пропатчить. Но не настолько радикально, как кажется. Всё прекрасно взлетело и летало.

Пусть станет стандартом де-факто и всё!

Вот не надо! Если возможностей стандартного POSIX shell не хватает, то надо сразу брать полноценный ЯП. А баш — это промежуточное ни то, ни сё. К тому же, гораздо больше подверженное уязвимостям в силу своей раздутости.

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

Там ещё из полезности - прозрачная передача этих самых объектов по сети. И не надо париться, что кто-то в stdout лишнего напишет при вызове ssh.

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

кто-нибудь знает причину?

а чем встроенные команды лучше аналогичных внешних?

и как это будет работать вместе со штатным бинарником?

нормально. загружаемые команды надо руками через enable -f загружать

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

Кроме всего можно кодить почти в функциональном стиле

Че б доброго

создавать кастомные объекты, хеш-таблицы

пфф.. я хз. берешь любой современный php, ruby, python или чо там у вас нынче модно — и не паришься ни с какими объектами-в-пайпах

Из недостатков оверхед по памяти, зависимость от мелкософта

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

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

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

VKraft ()

Новые переменные $EPOCHSECONDS и $EPOCHREALTIME, которые раскрываются в секунды с начала эпохи Unix с точностью до секунд и с точностью до микросекунд соответственно;

секунды - EPOCHSECONDS, микросекунды - EPOCHREALTIME Л - логика

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

Башизмы, говорят, плохо. В целом я согласен, задроты которые дрочат на POSIX shell и так найдут способ адаптировать свои скрипты под всё и вся, а пишут то в основном на bash. bash есть в любой системе из коробки. Ну зачем с ним бороться то? Пусть станет стандартом де-факто и всё! Зачем ругать его что он такой, сякой и пытаться избавиться. Причём абсолютно безуспешно.

Знаешь, что плохо? Что народ пихает башизмы в файлы, начиающиеся с #!/bin/sh. Если ты честно пишешь #!/bin/bash — то тогда ОК, всё често.

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

bash есть в любой системе из коробки.

Да ладно?

root@square-gw:~# which bash
root@square-gw:~# head -1 /etc/openwrt_release
DISTRIB_ID='LEDE'

В FreeBSD(по крайней мере в старых версиях, как там сейчас хз) bash тоже изкоробки не поставляется.

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

По идее - проще проверки делать на валидность. Строка - это всё же слишком широко. В теории должно было быть хорошо, на практике получилось как всегда у Microsoft - циклы которые ведут себя по разному, неочевидности с потоками ввода-вывода и прочие красоты Powershell(я знаю, мне на этом говне писать на работе приходится), по сравнению с которыми общепризнанные родовые травмы bash(а они есть, уж поверь - на bash-е мною тоже много чего писано) выглядят не так уж и фатально.

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

Новая переменная $BASH_ARGV0, которая раскрывается в $0 и устанавливает $0 в назначение;

Parsing failed

«Переводчик» хотел сказать примерно следующее: «новая переменная $BASH_ARGV0, которая раскрывается в $0; если ей будет присвоено новое значение, оно же станет новым для $0» ("BASH_ARGV0: a new variable that expands to $0 and sets $0 on assignment" — так в оригинале), но почему-то не сказал.

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

Ну, во-первых, не надо мне тыкать.

Опять начинается. Я тылкал, тыкаю, и буду тыкать всем в Интернете.

Во-вторых, где я решил, кому что-то нужно?

Примерно здесь.

Я же никого не заставляю использовать.

Ещё бы заставлял.

Если нравится продлжать есть кактус, авкать, грепать, экситкоды проверять - да пожалуйста.

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

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

То, что делается на питоне тонной кода, делается парой строчек на ps

Пример? Давай реальный пример кода.

Строчка на PS, зачастую, сама по себе, хорошая тонна кода.

anonymous ()