После двух с половиной лет разработки вышла (http://lists.gnu.org/archive/html/bug-bash/2016-09/msg00018....) новая версия командного интерпретатора GNU Bash 4.4 (http://www.gnu.org/software/bash/), используемого по умолчанию в большинстве дистрибутивов Linux. Одновременно состоялся (http://lists.gnu.org/archive/html/bug-bash/2016-09/msg00019....) релиз библиотеки readline 7.0, применяемой в bash для организации редактирования командной строки.
Из улучшений (http://git.savannah.gnu.org/cgit/bash.git/tree/NEWS?h=bash-4.4) можно отметить:
- Во встроенной команде mapfile появилась возможность определения произвольного символа-разделителя записей (опция "-d");
- Для почти всех команд реализована опция "--help" для вывода подсказки;
- Добавлен шаблон ${parameter@spec} для применения преобразования к значению "parameter";
- Во встроенной команде local появилась возможность указания аргумента "-" для сохранения состояния однобуквенных shell-опций и восстановления прошлых значений при выходе из функции;
- Добавлена новая переменная EXECIGNORE, позволяющая определить имена, которые следует игнорировать при поиске команд;
- Подготовлен начальный SDK для создания собственных команд (загружаемых через "enable -f"), включающий набор заголовочных файлов и фрагментов сценариев Makefile;
- Bash теперь сохраняет статус выхода только для асинхронных заданий, что нарушает совместимость с прошлыми версиями в которых сохранялись статусы для всех заданий. Таким образом теперь нельзя использовать команду wait для получения статуса предыдущей синхронной команды;- В команду ulimit добавлены опции "-k" (kqueues) и -P (pseudoterminals).
URL: http://lists.gnu.org/archive/html/bug-bash/2016-09/msg00018....
Новость: https://www.opennet.ru/opennews/art.shtml?num=45163
> Bash теперь сохраняет статус выхода только для асинхронных заданий, что нарушает совместимость с прошлыми версиями в которых сохранялись статусы для всех заданий. Таким образом теперь нельзя использовать команду wait для получения статуса предыдущей синхронной команды;
интересно, нафига они это сделали?
Фашизм, очевидно же.
Происки Госдепа, не иначе!
Данное изменение предложено лично Бараком Обамой. Юзайте православную версию, там всё по старому.
Хм. wait для получения статуса *синхронной* команды? А кто его вообще для этого юзал? Как он умудрился это сделать, и главное -- зачем это понадобилось?Я вот думал, что wait только для асинхронных команд можно использовать. Или отдельные умельцы шлют SIGCONT остановленному процессу синхронной команды, и натравливают на него wait?
> Я вот думал, что wait только для асинхронных команд можно использовать. Или
> отдельные умельцы шлют SIGCONT остановленному процессу синхронной команды, и натравливают
> на него wait?Остановленный процесс это уже асинхронная команда.
Я с интересом для себя обнаружил, что:
$bash -c 'echo $$;exit 33'
2737
$bash -c 'echo $$;exit 44'
2738
$wait 2738 ; echo $?
44
$wait 2737 ; echo $?
33
$wait 2738 ; echo $?
44Отключили вероятно для оптимизации. Помнить все PIDы может оказаться накладно в гипотетической ситуации.
Спасибо, очень интересная штука. Хм. Была.
zsh лучше
Только на маке, на линуксе он какой-то глючный.
vi-mode или emacs? с последним уже много лет проблем не замечал. может, дистро-специфичные проблемы? баг уже отрепортили?
Думаю автор имел в виду Debian based багу.
Думаю, автор яблодрочер.
Автор имел ввиду не пойми что. Debian Jessie, ZSH 5.0.7, проблем не наблюдаю.
Короче рассказываю. Как была шумиха вокруг shellshock я решил что баш не безопасен и пора сваливать на zsh (я тогда только недавно перешел на GNU+Linux). Так как настраивать с нуля желания не было скачал с гитхаба oh-my-zsh, так что возможно вина в глючности лежит не на самом zsh, а на этом конфиге)
Вот список глюков встреченных за 2 дня использования:
- при длинном названии working directory шрифт коцался и становился нечитаемым
- если нажать энтер 2 раза быстро после ответа на какой-то readline вопрос все коцалось и писалось не на тех рядках, где должно
- иногда он просто не работал, окошко терминала просто становилось пустым и надо было открывать новую вкладку
При том всем на макбуке мамки oh-my-zsh работает отлично без подобных проблем.
В общем я потом попробовал fish и остался им доволен аки слон, там все стабильно, быстро и удобно. С тех пор пользуюсь им чего и вам советую.
P.S. на сайте zsh оглавление мануала размечено с помощью тегов definition list, уже одно это говорит что у авторов не в порядке с головой и чего стоит ожидать от их продукта.
oh-my-zsh
использовать крайне не рекомендуется, по причие тормазнутости.
посмотрите сколько времени идет запуск.
for i in $(seq 1 10); do /usr/bin/time zsh -i -c exit; done
oh-my-zsh -- та ещё помойка с понадёрганными со всего интернета рецептами для плагинов. Для начала лучше использовать grml.
oh-my-zsh -- помойка, у которой дефолты начисто подвешивают консоль (Зато красиво! Им, понимешь ли, красиво хотелось, а то, что по секунде ждать следующего приглашения консоли - это им плевать).Мне лично хватает git://github.com/zsh-users/zsh-syntax-highlighting.git
Плюс разумеется bash-completion и своего немного там понавешал.
> P.S. на сайте zsh оглавление мануала размечено с помощью тегов definition list,
> уже одно это говорит что у авторов не в порядке с головой и чего стоит ожидать от их продукта.Нет, это говорит о том, что уважаемому диванному аналитику опеннета стоило посмотреть хотя бы на cлона^W мета-данные, прежде чем делать так далеко идущие выводы:
> <!-- Created by GNU Texinfo 6.0, http://www.gnu.org/software/texinfo/ -->
> <meta name="Generator" content="texi2any">
Вы хотели сказать KSH.
CSH же!
`mapfile -d` -- вау, годно!Ещё бы запилили применение нескольких модификаторов подстановки за один раз (как в zsh, через двоеточие) -- цены бы не было.
Есть вообще шелл с человеческим синтаксисом?
Пёрл?
xonsh?
Есть, оберон называется.
в армии есть, но там терминалов нет.
> в армии есть, но там терминалов нет.Если бы там побывал, то знал бы, что терминалы там есть. Ах с советских времён.
PowerShell, ха-ха
fish
Бери баш и ebash. Очевидно же. Не нравится - пиши свой. Как сделаешь человеческим, не удивляйся реакции человеков.А если серьезно, ты скорее всего не прочел полную справку на баш, он вполне, поэтому и стал стандартом.
> стал стандартомшта?
Ждем теперь появления OpenBASH, NetBASH и FreeBASH
LibreBASH же.
MS BASH
Кстати а может кто объяснить зачем люди ломают мозги и пишут bash-скрипты когда есть Python и много других более интуитивных и более мощных языков? Просто любопытно.
А что тут объяснять? Это очевидно любому специалисту. Где-то удобнее bash, где-то python.
> когда есть Python и много других более интуитивных и более мощных
> языков?"понятный даже дебилу" != "интуитивный и мощный для не-дебила".
Любой вопрос возникает от незнания. В данном случае ты не знаешь, что непосредственно в шеле можно выполнять последовательности команд, а после выполнения, их полезно куда-то сохранить. Так и появляются bash-скрипты. Когда в командной строке синтаксис python дойдёт до степени удобства bash, то можно будет обсудить поставленный вопрос, а пока сравнение из серии сравнения ежа с носорогом.
Причин несколько.
1. Самая распространенная заключается в незнании большинством админов ЯП общего назначения вроде питона, перла, рубина.
2. Некоторые скриптовые языки чаще всего отбрасываются из-за их отсутсвия по дефолту в любом линуксе, в отличии от перла и питона. Прощай рубин.
3. Скрипт зачастую вырастает из однострочника, а значит с питоном тоже прощаемся.
4. Некоторые задачи таки удобней сделать на шелле, так как в них больше половины работы приходится на внешние утилиты.
Полностью согласен. Почти всегда мои башескрипты начинаются с однострочника, но иногда, на втором часе правок и попыток я говорю себе "лучше бы сразу взял Питон". Но когда делать на последнем лень, часто спасает python -c и inline script.
Не знаю как у вас, а наши админы знают perl и python иногда не хуже разработчиков. Но пользуются часто и bash-скриптами.
> PythonЗачем мне ЭТО в системе? А bash\sh везде есть.
python поставляется почти со всеми дистрами(по крайней мере популярными) так же как и perl.
не скажу за линуксы, но во фре, начиная с версии кажется 6что-то_там перла по умолчанию нет.
во freebsd и bash по умолчанию не поставляется на сколько мне известно.
Всё правильно известно.Ещё в до-мезозойскую эру отцы основатели сказали что то типа интерактивным шеллом можешь иметь что хочешь, но для скриптов пользуй #!/bin/sh Luke! And Power will be with you ...
(ну и ещё много какашек на csh как шелл для скриптов ... да кто это помнит уже :)
У меня например руки сами бактики набирают вместо $() :)Хотя по нынешним временам, когда зайдя по ssh в 99% увидишь линукс и баш ... стоит ли йУнным париЦЦо?!
> У меня например руки сами бактики набирают вместо $() :)$() - POSIX shell
Но ты и дальше "бактики" набивай...
Какой версии?
И ввиду "некоторых несовместимостей" (не)работает по разному, с utf-8 тоже интересная история.
> А bash везде есть.Распространённое заблуждение.
> Распространённое заблуждение.Конечно, ведь я написал ещё про sh. Только не говорите, что busybox не везде есть. Никогда не поверю.
sh есть везде. А sh == bash -- распространенное забдуждение. Я вас не правильно понял.
Ключевая фраза: "Bash теперь сохраняет статус выхода только для асинхронных заданий, что нарушает совместимость с прошлыми версиями"...
Синдром Поттеринга -- страшная заразная болезнь нашего времени.
Я правильно понимаю, что вот такая конструкция у меня перестанет работать с версии 4.4 ??<code> if [[ -d "$dalet_path" ]];then
cp $end_path$end_file_name.$CONTAINER $dalet_path$FORMAT_PATH >> $LOG_FILE 2>&1 & pid_cp=$!
else
log_info "\e[1;31m Ошибка при копировании в DALET, путь не найден \e[0m"
fi
if [[ -d "$frank_path$date_dir" ]];then
cp -R $source_path* $frank_path$date_dir$v_hd >> $LOG_FILE 2>&1 & pid_cp1=$!
else
log_info "\e[1;31m Ошибка при копировании на FRANK, путь не найден \e[0m"
fi
if [[ -d "$frank_path$date_dir" ]];then
cp $end_path$end_file_name.$CONTAINER $frank_path$date_dir$dlya_montaja >> $LOG_FILE 2>&1 & pid_cp2=$!
else
log_info "\e[1;31m Ошибка при копировании на FRANK, путь не найден \e[0m"
fi
wait $pid_cp2
if [[ "$?" -ne 0 ]]; then
log_info "\e[1;31m Ошибка во время копирования готового на FRANK \e[0m "
return 1
fi
wait $pid_cp1
if [[ "$?" -ne 0 ]]; then
log_info "\e[1;31m Ошибка во время копирования исходников на FRANK \e[0m "
return 1
fi
wait $pid_cp
if [[ "$?" -ne 0 ]]; then
log_info "\e[1;31m Ошибка во время копирования готового в DALET \e[0m"
return 1
fi
</code>