GNU/Linux >> Linux Esercitazione >  >> Linux

Le tubazioni per l'uscita del circuito impediscono la modifica delle variabili locali?

Sto cercando di scrivere una semplice funzione bash che prenda, come argomenti, un numero di file e/o directory. Dovrebbe:

  1. Qualifica completamente i nomi dei file.
  2. Ordinali.
  3. Rimuovi i duplicati.
  4. Stampa tutto ciò che effettivamente esiste.
  5. 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)

Linux
  1. Come ordinare l'output per dimensione?

  2. Parallelizzare un Bash For Loop?

  3. Esempi di Bash For Loop e While Loop

  4. Esempi di Bash for loop

  5. Come ordinare un file, in base ai suoi valori numerici per un campo?

Come assegnare l'output di un comando Linux a una variabile

Bash For Loop

Comprendere il ciclo for negli script della shell

Il ciclo Bash FOR spiegato e semplificato

Ciclo for nidificato

Come posso ordinare du -h output per dimensione