Próbuję napisać prostą funkcję bash, która jako argumenty przyjmuje wiele plików i / lub katalogów. Powinno:
- W pełni kwalifikuj nazwy plików.
- Sortuj je.
- Usuń duplikaty.
- Wydrukuj wszystko, co faktycznie istnieje.
- Zwraca liczbę nieistniejących plików.
Mam skrypt, który prawie robi to, co chcę, ale spada na sortowanie. Zwracana wartość skryptu w jego obecnej postaci jest poprawna, ale dane wyjściowe nie są (nieposortowane i duplikaty). Jeśli odkomentuję | sort -u
instrukcję, jak wskazano, wynik jest poprawny, ale wartość zwracana jest zawsze 0
.
Uwaga: łatwiejsze rozwiązania problemu są mile widziane, ale tak naprawdę pytanie dotyczy tego, dlaczego tak się dzieje w kodzie, który mam. To znaczy, dlaczego dodanie potoku pozornie zatrzymuje skrypt zwiększający zmienną r
?
Oto skrypt:
function uniqfile
{
local r=0
for arg in "$@"
do
readlink -e "$arg" || (( ++r ))
done #| sort -u ## remove that comment
return $r
}
for arg in "$@"
dofor arg
. „If 'in WORDS ...;” nie jest obecny, wówczas zakłada się „w” $ @ ”.” - pomoc dlaOdpowiedzi:
Jest to dobrze znany pułapkę z powodu tej funkcji :
tak, aby zmodyfikowane zmienne były lokalne dla podpowłoki i nie były widoczne ponownie w rodzicu.
Aby tego uniknąć, przepisz swój kod, aby uniknąć potoku, z podstawieniem procesu:
źródło
>(..command..)
konstruktu. Myślę , że wiem, jak to działa, ale uważam, że powinienem trochę poczytać.Te
| sort -u
siły bit poprzedzający (więc cała pętla for), aby uruchomić w sub-process (bash potrzebuje „” STDOUT przekierować dosort
„standardowego wejścia”. (Internet wydaje się myślećksh
ibash
obsługiwać tę sprawę nieco inaczej .. pierwszy lub ostatni polecenie w sekwencji potoku zostaje umieszczone w podpowłoce?)Wątek dotyczy podobnego problemu i na końcu ma fajne rozwiązanie: http://ubuntuforums.org/showthread.php?t=312017
fragmentźródło