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 ()
Последнее исправление: shell-script (всего исправлений: 2)

Накатим! Язык языков шел шелов

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

А в чем преимущество-то?

Задача: в заданном каталоге удалить файлы старше 7 дней.

Как нормально сделать это в баше?

muon ★★★★
()

уверен что это лучше терминатора 5

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

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

Да вот я всё жду примеров, а их нет.

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

Да что-то нифига подобного, куча пунктов с изменением поведения существующих элементов.

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

не паришься ни с какими объектами-в-пайпах

Тут ты не прав, они там довольно удобны. Да, не для шела как UI, а если «программу писать». Что-то типа «generator | filter | map | reduce» в питонах выглядит довольно неприглядно, а встречается часто.

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

find . -mtime 7 -exec rm {} \;
чотакататак вроде, только bash тут как-то сбоку

не сбоку, а где надо
На баше это выглядит так

find ${DIRS[@]} -maxdepth $MD -type $OBJTYPE -mtime $DAYS -delete

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

Ч. т. д.

Из баша запускается бинарь-комбайн, который делает то, что надо. Точно такой же бинарь можно запустить из cmd.exe, а потом рассказывать, что cmd.exe — крутой шелл.

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

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

Задача: в заданном каталоге удалить файлы старше 7 дней.

Как нормально сделать это в баше?

find -type f -mtime +7 -exec rm '{}' \;

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

Чувак, ты просто не догоняешь... Для Bourne Shell (и для bash, как для его прямого наследника) управление запуском внешних команд (с передачей им параметров, установкой нужного окружения, управлением потоками данных между ними) — основное предназначение. Оно именно для этого и создавалось.
Так что ты сейчас сказал примерно следующее: «bash неюзабелен потому, что он правильно выполняет свою работу».

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

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

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

управление запуском внешних команд (с передачей им параметров, установкой нужного окружения, управлением потоками данных между ними) — основное предназначение.

Угу. Вот с передачей данных между запускаемыми приложухами он справляется плохо. Собственно, ветка растёт из обсуждения объектного пайпа.

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

Из баша запускается бинарь-комбайн, который делает то, что надо

А че в этом плохого? Если этот бинарь-комбайн везде есть и везде одинаково круто себя ведет — считай что часть шелла. Отчего в cmd.eхе толковых бинарей не завезли — понять решительлно невозможно.

Приходится привлекать дополнительные комбайны-костыли типа sed, awk и find, или сразу писать на пайтоне.

да они не дополнительные. де-факто это — часть шелла. Где есть баш и нет финда?

На практике баш, начиная с башевского пайпа, неюзабелен для сложных практических задач

Всю дорогу только на пайпах и решали. А тут вдруг неюзабельно. И по сей день. Ваш пауэр шелл, вещь может и хорошая (я не знаю), но изучать/использовать его — ССЗБ, ибо и моргнуть не успеешь, хозяева его закопают, как закопали все до этого, а баш с финдом и через 20 лет будут рабоать все так же, как работали 20 лет назад.

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

либо хорошее, либо на баше

Шел есть интерфейс между человеком и осью. Что ось поставляет, то шел и дёргает. Ты поставил задачу, которую решает существующая программа, задача шела - в «настоящей оси» - её дёрнуть.

В случае п/ш и винды — либо «не шел» либо «не ось»(а что-то типа пакетного менеджера для библиотек). Задачу для сравнения стоило бы искать после выбора, что из этого верно, чтобы не сравнивать тёплое с мягким.

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

да они не дополнительные. де-факто это — часть шелла. Где есть баш и нет финда?

Тогда теряет смысл само обсуждение баша. Как пускалка годится даже sh.

Всю дорогу только на пайпах и решали.

И Беломоро-Балтийский канал лопатами выкопали.

В принципе, можо и на пайпах, и всякое «ls | mail ...» конечно будет работать. Пока не попадётся имя файла с переносом строки, табами и пробелами в начале и конце. Но случившимися отказами можно пренебречь, 100% надёжности или 98% — да какая разница.

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

Вот поэтому если нужно обрабатывать чужие файлы, то нужно либо предварительно проверять и исправлять их имена, либо писать скрипты так, чтобы они корректно обрабатывали сложные имена файлов, а не просто «ls | nextcmd». Свои файлы, разумеется, можно сразу создавать с нормальными именами.

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

Собственно, ветка растёт из обсуждения объектного пайпа.

А в павершелле как, поди ж объект по имени передается по конвееру? И что мешает такое же реализовать средствами баша? Есть же разделяемая память? Клади в нее все че хошь, а ссылку на нее (имя) передавай по конвееру в виде текста. При условии что все программы из конвеера будут в курсе — все сработало.

Пусть программа ls_pwd сканирует текуший каталог на предмет найденных файлов. Найденную информацию кладет в память, идентификатор вываливает в stdout. Найдет информацию по всем атрибутам файла, дате создания, владельцу — по всему. Инфу по каждому файлу упаковать в структуру, все данные — в массив структур.

пусть программа super_puper_grep умеет считвыать из стандартного ввода имя объекта shared-memory и знает формат структуры, ну и умеет фильтровать по заданным критериям и вываливать идентификатор получившегося объекта в stdout. Ну и программа super_puper_print — понятно что делает

А теперь — фокус-покус!

cd /home/username/
ls_pwd | super_puper_grep --owner another_user | super_puper_print

И что мне помешает оперировать объектами через пайпы баша?

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

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

Собственно, он и не «передаёт данные между приложухами»(1) — это пайпы в оси делают, шел их только к программам прикручивает. И я, что-то, сильно подозреваю, что п/ш тоже делает не (1) — ибо передача внутри одного процесса-комбайна.

0/0

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

Объект это полноценный объект CLR с методами и полями. Кстати в линукс повершелл сыр и уныл - только что на команде «ls ls» тупо зафризился ввод и помогло только убитие процесса. Набрал быстро забыв что уже набрал до этого. Так что да, лучше bash который после убития процесса pwsh продолжил свою работу.

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

Объект это полноценный объект CLR с методами и полями

Что мешает в shared-memory разместить полноценный объект с методами и полями и всем отдавать ссылку на него? Или оформить как тот же бинарь.

ls `pwd` | bash_obj create --type list_of_file --obj_name file_list
super_puper_grep --create-time >7d --obj_name file_list
bash_obj method get_filenames --obj_name file_list | stdout

ну, короче, че я распинаюсь — с методами тоже можно

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

А bash_obj это скрипт или бинарь?

А какая разница? Ну ешь — скрипт, хочешь — бианрь. Я б на си написал, если б мне была нужда. Можно ж дергать си-шные функции из so-шки. Они могут и с памятью работать и с данными и методами являться и вообще че хошь.

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

Было уже в dbus, УГ получилось.

Ну это же не отменяет того факта, что так можно, а напротив — подтверждает.

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

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

не попадётся имя файла с переносом строки, табами и пробелами в начале и

поэтому ты возьмёшь find и xargs, я не видел чтобы ls использовал кто-нибудь когда-либо для чего-либо помимо визуального анализа, да и башизмы удобны в первую очередь для интерактивной сессии

anonymous
()
Ответ на: комментарий от muon
SEVENDAYS=$((7*24*60*60))
for f in *; do
  #не знаю как работает новый built-in stat, поэтому написал так
  FCTIME=$(stat -c '%W' "$f")
  if [ $(($EPOCHSECONDS - $FCTIME)) -gt $SEVENDAYS ]; then
    rm -rf "$f"
  fi
done
anonymous
()
Ответ на: комментарий от pihter

На Си писать это не выход. Скриптинг-же. Можно и возможно лучше тот-же JSON|XML (внешними утилитами) и передавать по пайпу. Главное велик не изобретать настолько насколько это возможно

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

а вот это уже лучше, если избавиться от многомиллионных вызовов утилит скрипт будет работать на порядки быстрее — надо пользоваться тем что у нас сложный шелл, всё-таки он не самый быстрый и легковесный (всё ещё лучше zsh и наверно fish)

anonymous
()

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

приложенгиям

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

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

На Си писать это не выход

Одну утилитку для работы с разделяемыми объектами? Как раз выход и правильный.

Скриптинг-же

Скриптинг твой — суть клей для того чтоб красиво подружить набор функций, написанных на си. Везде.

Можно и возможно лучше тот-же JSON|XML (внешними утилитами) и передавать по пайпу.

Так методов не будет,а народ просит

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

это если find удаляет, если он только перечень файлов отдаёт, нам, вероятно, придётся обмазываться, как минимум, stat и rm (которые теперь встроенные). Теперь надо ещё cp и mv запихать. Ж)

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

stat и rm (которые теперь встроенные). Теперь надо ещё cp и mv запихать

Лудше бы нормальный ffi сделали заместо этих костылей.

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

Всякое бывает, надо просто помнить что вызов внешних утилит «дорогая» операция. Я лет 15 назад тут на ЛОРе писал о том как один шелл-скрипт, с 4-5 вложенными циклами и 5-8 вызовами sed/grep/awk во внутреннем цикле, работал около часа, а один в один переписанный алгоритм на перле (т.е. без fork-exec) стал отрабатывать за 1-2 сек на той ве машине.

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

Лудше бы нормальный ffi сделали заместо этих костылей.

+1

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

Всякое бывает,

Ну логику вставки во внутрь всё же хочется увидеть. Вот «stat» давно напрашивался, ибо в «[]» он наполовину всегда был, и это раздражало. Типа проверка на пустой файл есть, и вообще пол алфавита ключей [ -* FILE ], а проверить, что ровно 1 байт — уже вызывай внешний stat. А почему «rm» теперь такая честь отдана?

надо просто помнить что вызов внешних утилит «дорогая» операция. Я лет 15 назад тут на ЛОРе писал о том как один шелл-скрипт, с 4-5 вложенными циклами и 5-8 вызовами sed/grep/awk во внутреннем цикле, работал около часа, а один в один переписанный алгоритм на перле (т.е. без fork-exec) стал отрабатывать за 1-2 сек на той ве машине.

Это на самом деле весьма сложный вопрос, который меняется со временем. 35 лет назад fork+exec был чудовищно медленными сисколами сами по себе. Потом это стало медленным по причине, что у вас вот вся память сожрана на текущие процессы и кеш диска. А теперь оно скорее тормозит из-за жирноты самих sed/grep/awk, которые пока запустятся, пока распарсят зачастую один и тот же регекс/скрипт в циклах со всё возрастаемыми фичами и только потом станут исполнять свой внутренний jit.

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

вместо

for FNAME in *; do
   MTIME=`stat -c '%Y' $FNAME`
...
done

надо типа такого

stat -c 'FNAME="%n"; MTIME="%Y"' * | while read line; do
  eval $line
...
done

### OR ###

#один вызов stat
stat -c '%n %Y' * | while read FNAME MTIME; do
...
done

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

надо типа такого

Не нра. Зачастую надо сразу несколько данных из struct stat.

Ну давайте поиграем в угадалки, как там могли сделать и как лучше. По мне, лучше через встроенный ассоциативный массив STAT[], то есть и STAT[size] и STAT[mtime]...

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

Не важно, смысл в том что дерганье внешних утилит можно оптимизировать или если такой сложный скрипт, что производительность упирается в fork+exec, надо переходить на другой язык

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

Думаю, наработки должны быть у пользователей *BSD - они в основном, от этого страдают.

Harliff ★★★★★
()

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

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

Не важно, смысл в том что дерганье внешних утилит можно оптимизировать или если такой сложный скрипт, что производительность упирается в fork+exec, надо переходить на другой язык

Ну и к чему эти банальности при обсуждении полезности вставки в язык уже имеющихся сисколов и кусков кода, как со stat и способа этой вставки? Когда-то и «[]» был fork+exec «test», и даже «cd» было отвратительным по своей сути реализации, но таки внешним процессом. Но, когда вспомогательные задачи не сильно мешают основной бизнес-задачи, то отводить кучу времени на переписывание из одного ЯП на другой не разумно. И perl ведь не всё может.

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

И что мешает такое же реализовать средствами баша?

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

А мешает окружение GNU, которое придётся целиком переделывать под новые пайпы. Проще забыть про него и написать всё заново. Что и сделали авторы пайтона. И павершелла.

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