Sziasztok. Olyan segítségre lenne szükségem, hogy egy használok egy minimalista filekezelőt (lf file manager), amit testre lehet szabni bash scriptekkel. Azt már megoldottam benne, hogy olyan másolási algoritmust használjak, ami kiírja, hogy %-ésoan hol tart, és progressbar-t is mutat, iilletve aszinkronként működjön. Viszont a másolás kimenetét (amit parancsorban is látni, hogy épp hol tart), azt nem tudom a státusz sorba kiíratni. A fejlesztő csinált egy példát még anno erre, csak ő az rsync -et vette alapul, és így néz ki:
cmd paste &{{
set -- $(cat ~/.local/share/lf/files)
mode="$1"
shift
case "$mode" in
copy)
rsync -av --ignore-existing --progress -- "$@" . |
stdbuf -i0 -o0 -e0 tr '\r' '\n' |
while IFS= read -r line; do
lf -remote "send $id echo $line"
done
;;
move) mv -n -- "$@" .;;
esac
rm ~/.local/share/lf/files
lf -remote "send clear"
}}
Ítt a lényeg a case-en belül a copy rész. Az rsync csinálja ugye a másolást. Ezt cserélném le az alábbi parancsra: gcp -rfp "$@" .
Viszont az stdbuf és while-done nem tlejesen tiszta. A lényegét értem, miszerint az rsync progress funkciója minden egyes file-ra külön írja ki, és ezért kell a while-done gondolom, hogy minden egyes sort ki is irasson a státusz bárra, illetőleg az stdbuf amit nem igazán értek, hogy mi, és mit csinál. Az biztos, hogy ez a kód jól működik, kiírja az lf programon belül a státuszbárra az rsync éppen aktuálisan kiírt kimenetét (ezt csinálja az lf -remote program, de ha az rsync-et lecserélem a gcp -re, akkor semmit nem jelenít meg. Azt tudni kell, hogy a gcp egy sorba írja ki a kimenetét, így gondolom a while-done-ra nem lenne szükség alapból, de valamilyen változóba bele kellene tenni a kimenetet, hogy ki tudjam iratni, mert a példában is úgy van: lf -remote "send $id echo $line" Vagyis a line változóba teszi, és azt így már ki lehet iratni az lf remote paranccsak amit a program megeszik.
Valaki esetleg jártas ebben az stdbuf parancsban, hogy a fejlesztő miért így oldotta meg?
MEGOLDÁS: egy másik másolásra használt program lett az alapja: https://github.com/jarun/advcpmv
cmd paste &{{
set -- $(cat ~/.local/share/lf/files)
mode="$1"
shift
case "$mode" in
copy)
advcp -ag "$@" . | grep -Po --line-buffered "(?<=^\033\[K).+%$" | sed -nu 'p;n' |
stdbuf -i0 -o0 -e0 tr '\r' '\n' |
while IFS= read -r line; do
lf -remote "send $id echo '$line'"
done
;;
move)
if [ $size -gt 5 ]; then
advmv -fg "$@" . | grep -Po --line-buffered "(?<=^\033\[K).+%$" | sed -nu 'p;n' |
while IFS= read -r line; do
lf -remote "send $id echo '$line'"
done
fi
;;
esac
rm ~/.local/share/lf/files
lf -remote "send clear"
}}