[О блоге]
[наверх]
[пред]
[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 что-то
могут испортить. Хочется побыть человеком и использовать что дружелюбно
ко мне, тем более раз оно есть.
[оставить комментарий]