Что: 66095704400d2b836981716785bb460caf95dac3 Когда: 2022-02-19 13:13:30+03:00 ------------------------------------------------------------------------ Темы: hate zsh ------------------------------------------------------------------------ Zsh в go.stargrave.org/feeder В feeder-е много всяких .zsh файлов. Основные скрипты: cmd/download.sh, cmd/parse.sh, cmd/muttrc-gen.sh написаны на POSIX shell, но другие уже на zsh. Благо в целом они опциональны. Почему не POSIX shell, ведь я так бьюсь против башизмов например? Bash почти ничего не даёт в плане безопасности и простоты написания скриптов. Единственное что приходит на ум из действительно ценного в нём это setopt pipefail. В остальном же (0630e96a5148d8f43b8873fc013acac53cb0f677) он точно так же подвержен всем трудностям и сложностям программирования на shell. Я изначально старался делать POSIX shell в feeder, но как-то меня достала постоянная борьба со всем что попадается в нём, с каждой его строчкой. download.sh/parse.sh -- хорошо ложаться на POSIX shell без особых страданий и граблей. Но cmds="$(dirname "$(realpath -- "$0")")" конструкция уже довольно неприятна (dirname правда можно заменить на отрезание строки до последнего слэша). В zsh это будет cmds=$0:h:a, прям буквально без всяких кавычек. while IFS= read -r -d '' file; do some_command "$file" done < <(find . -type f -name '*.mp3' -print0) в zsh станет (0630e96a5148d8f43b8873fc013acac53cb0f677) (и тоже без проблем с кавычками вокруг аргументов): for file (**.mp3(.)) { some_command $file } Чтобы вывести список упавших задач запущенных через GNU parallel, я создаю --joblog файл, который является TSV, где первая строчка это заголовок указывающий какие элементы в какой колонке находятся. В POSIX это всякие cut бы пришлось использовать, не шибко приятно выглядящие. В zsh же для вывода всех упавших команд (у которых return code != 0, где команда всегда последний элемент TSV): read row cols=(${(s:\t:)row}) i=${cols[(i)Exitval]} while read row ; do cols=(${(s:\t:)row}) [[ ${cols[$i]} -ne 0 ]] || continue print failed: ${cols[$#cols]} end Ни единого внешнего вызова и даже while выполняется не в subshell. Удалить все устаревшие файлы, не входящую в первую сотню? rm -f $feed/cur/*(Nom[101,-1]) Вместо сотни использовать значение переменной? Да пожалуйста, заменяем "101" на $max. Кажется очевидным? А в bash бы уже не сработало: for i in {1..$n} В zsh я могу спокойно писать: opts=( --page-requisites --foo $bar ) cmd $opts --out=$dst/$fn $url не боясь что пробелы в именах директории $dst или $fn или $bar что-то могут испортить. Хочется побыть человеком и использовать что дружелюбно ко мне, тем более раз оно есть. ------------------------------------------------------------------------ оставить комментарий: mailto:comment@blog.stargrave.org?subject=Re:%20Zsh%20%D0%B2%20go.stargrave.org%2Ffeeder%20%2866095704400d2b836981716785bb460caf95dac3%29 ------------------------------------------------------------------------ Сгенерирован: SGBlog 0.34.0