Portál AbcLinuxu, 3. listopadu 2025 12:00
# 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
fi
Obsah/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 line
A 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.