From 66095704400d2b836981716785bb460caf95dac3 Mon Sep 17 00:00:00 2001
From: Sergey Matveev <stargrave@stargrave.org>
Date: Sat, 19 Feb 2022 13:13:30 +0300
Subject: [PATCH] =?utf8?q?Zsh=20=D0=B2=20go.stargrave.org/feeder?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit
Ð 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 ÑÑо-Ñо
могÑÑ Ð¸ÑпоÑÑиÑÑ. ХоÑеÑÑÑ Ð¿Ð¾Ð±ÑÑÑ Ñеловеком и иÑполÑзоваÑÑ ÑÑо дÑÑжелÑбно
ко мне, Ñем более Ñаз оно еÑÑÑ.
--
2.51.0