GNU/Linux >> Znalost Linux >  >> Linux

Potrubí pro výstup smyčky brání místním proměnným modifikacím?

Snažím se napsat jednoduchou bash funkci, která jako své argumenty bere řadu souborů a/nebo adresářů. Mělo by:

  1. Plně uveďte názvy souborů.
  2. Seřaďte je.
  3. Odstraňte duplikáty.
  4. Vytiskněte vše, co skutečně existuje.
  5. 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)

Linux
  1. Bash for smyčky Příklady

  2. Návratový kód sed pro žádnou shodu

  3. Jak seřadit tento výstup 1,10,11..2

  1. Bash pro průvodce smyčkou a příklady

  2. Ukládání výstupu příkazu do proměnné Shell?

  3. Jak mohu seřadit výstup du -h podle velikosti

  1. Jak přiřadit výstup příkazu Linux k proměnné

  2. Výstup kterého příkazu použitého pro vstup na CD?

  3. Seřadit výstup podle sloupce?