Sto cercando di scrivere una semplice funzione bash che prenda, come argomenti, un numero di file e/o directory. Dovrebbe:
- Qualifica completamente i nomi dei file.
- Ordinali.
- Rimuovi i duplicati.
- Stampa tutto ciò che effettivamente esiste.
- Restituisce il numero di file inesistenti.
Ho uno script che fa quasi quello che voglio, ma cade nell'ordinamento. Il valore di ritorno dello script così com'è è corretto, ma l'output non lo è (non ordinato e duplicato). Se decommento il | sort -u
come indicato, l'output è corretto ma il valore restituito è sempre .
NB Soluzioni più semplici per risolvere il problema sono benvenute, ma la domanda riguarda davvero il motivo per cui ciò si verifica nel codice che ho. Cioè, perché l'aggiunta della pipe apparentemente interrompe lo script aumentando la variabile r
?
Ecco lo script:
function uniqfile
{
local r=0
for arg in "[email protected]"
do
readlink -e "$arg" || (( ++r ))
done #| sort -u ## remove that comment
return $r
}
Risposta accettata:
Questa è una trappola di bash ben nota, a causa di questa funzione :
Ogni comando in una pipeline viene eseguito come un processo separato (cioè in una subshell).
in modo che le variabili modificate siano locali nella subshell e non visibili una volta tornate nella genitore.
Per evitarlo, riformula il tuo codice per evitare la pipeline, con una sostituzione del processo:
for arg in "[email protected]"
do
readlink -e "$arg" || (( ++r ))
done > >(sort -u)