[О блоге] [наверх] [пред] [2022-02-19 13:13:30+03:00] [66095704400d2b836981716785bb460caf95dac3]
Темы: [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 что-то
могут испортить. Хочется побыть человеком и использовать что дружелюбно
ко мне, тем более раз оно есть.

    [оставить комментарий]