Portál AbcLinuxu, 6. května 2025 16:32
# delete remote files (if enabled) if [ "x$delete_remote" = "x1" ]; then while read line; do file="$(echo $line | awk -F';' '{ print $2 }')" if [ ! -f "$file" ]; then azcopy remove "$url/$file?$sas" >/dev/null <=== toto ukonci cyklus pri prvej zhode echo "azcopy remove \"$url/$file?$sas\" >/dev/null" <=== ak to nahradim tymto, tak je to ok test $? -ne 0 && error=1 fi done < $remote_files_list fiObsah/format suboru $remote_files_list (prve je nazov, druhe je velkost):
;aaa/a1;0; ;aaa/a2;0; ;aaa/a3;0; ;bbb/b1;0; ;bbb/b2;0; ;bbb/b3;0;Lokalne subory:
aaa/a1 aaa/a2 aaa/a3takze by v azure malo postupne po jednotlivych suboroch vymazat cely adresar bbb. Ked spustim shell v debug mode:
+ [ x1 = x1 ] + read line + echo ;aaa/a1;0; + awk -F; { print $2 } + file=aaa/a1 + [ ! -f aaa/a1 ] + read line + echo ;aaa/a2;0; + awk -F; { print $2 } + file=aaa/a2 + [ ! -f aaa/a2 ] + read line + echo ;aaa/a3;0; + awk -F; { print $2 } + file=aaa/a3 + [ ! -f aaa/a3 ] + read line + echo ;bbb/b1;0; + awk -F; { print $2 } + file=bbb/b1 + [ ! -f bbb/b1 ] + azcopy remove https://azure.storage.url/path/to/bbb/b1 + test 0 -ne 0 + read lineA cyklus sa ukonci (skript potom pokracuje dalej). Netusite, cim by to mohlo byt? Vdaka.
Řešení dotazu:
$(azcopy remove "$url/$file?$sas" >/dev/null) test $? -ne 0 && error=1Tipuju ze to zhavaruje a vezme sebou celou smycku.
exec azcopy remove ...
, /bin/sh -c "/usr/bin/azcopy remove ..."
, eval $(echo "azcopy remove ...")
, nic, stale sa cyklus ukonci po prvom odstraneni suboru, a azcopy skonci bez chyby (je to vidno aj v tom debugu).
Co ma napada je, ze azcopy nejakym sposobom "vymaze" data predane while
cyklu. Je to mozne?
Skusim este stace.
azcopy ... < /dev/null
(azcopy remove "$url/$file?$sas" >/dev/null)
for
miesto while
a uz to funguje.
while read line; do ... done < $remote_files_listsom pouzil
for line in $(cat $remote_files_list); do ... donea toto funguje.
cat /proc/cpuinfo | while read l; do echo $l; cat - > /dev/null; doneTohle je obecně věc co nevím jak by se v Bashi měla řešit -- for cyklus nejde dělat když má člověk v těch věcech mezery (a současně chce původní IFS), u while je příjemné, že čte po řádcích. Ale zase to má tenhle problém.
Tohle je obecně věc co nevím jak by se v Bashi měla řešit
A o minutu později jsi sám řešení navrhl. :-)
Mimochodem, konstrukce
cmd | while read v; do ... ; done
má ještě jeden háček: while cyklus se při ní provádí v subshellu, takže proměnné nastavené v těle cyklu se nedostanou "ven" (nelze takto předávat hodnoty zbytku skriptu). Naštěstí to bash umožňuje obejít pomocí
while read v; do ... ; done < <( cmd )
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.