Snažím se napsat jednoduchou bash funkci, která jako své argumenty bere řadu souborů a/nebo adresářů. Mělo by:
- Plně uveďte názvy souborů.
- Seřaďte je.
- Odstraňte duplikáty.
- Vytiskněte vše, co skutečně existuje.
- Vrátí počet neexistujících souborů.
Mám skript, který téměř dělá to, co chci, ale padá na řazení. Návratová hodnota skriptu tak, jak je, je správná, ale výstup nikoli (netříděný a duplicitní). Pokud odkomentuji | sort -u
jak je uvedeno, výstup je správný, ale návratová hodnota je vždy .
N.B. Jednodušší řešení k vyřešení problému jsou vítána, ale otázka je opravdu o tom, proč se to vyskytuje v kódu, který mám. To je důvod, proč přidání kanálu zdánlivě zastaví skript zvyšující proměnnou r
?
Zde je skript:
function uniqfile
{
local r=0
for arg in "[email protected]"
do
readlink -e "$arg" || (( ++r ))
done #| sort -u ## remove that comment
return $r
}
Přijatá odpověď:
Díky této funkci se jedná o dobře známou past bash :
Každý příkaz v kanálu se provádí jako samostatný proces (tj. v dílčím prostředí).
takže modifikované proměnné jsou lokální pro subshell a nejsou viditelné v nadřazeném prostředí.
Abyste tomu zabránili, přeformulujte svůj kód, abyste se vyhnuli potrubí, pomocí substituce procesu:
for arg in "[email protected]"
do
readlink -e "$arg" || (( ++r ))
done > >(sort -u)