GNU/Linux >> Tutoriales Linux >  >> Linux

¿La tubería para la salida del lazo evita la modificación de la variable local?

Estoy tratando de escribir una función bash simple que tome, como argumentos, una cantidad de archivos y/o directorios. Debería:

  1. Califique completamente los nombres de archivo.
  2. Ordenarlos.
  3. Eliminar duplicados.
  4. Imprime todo lo que realmente existe.
  5. Retorna el número de archivos inexistentes.

Tengo un script que casi hace lo que quiero, pero falla en la clasificación. El valor de retorno de la secuencia de comandos tal como está es correcto, pero la salida no lo es (desordenada y duplicada). Si descomento el | sort -u como se indica, la salida es correcta pero el valor devuelto siempre es .

nótese bien Las soluciones más simples para resolver el problema son bienvenidas, pero la pregunta es realmente por qué ocurre esto en el código que tengo. Es decir, ¿por qué agregar la tubería aparentemente detiene el script que incrementa la variable r? ?

Aquí está el guión:

function uniqfile
{
    local r=0 

    for arg in "[email protected]"
    do  
        readlink -e "$arg" || (( ++r ))

    done #| sort -u    ## remove that comment

    return $r
}

Respuesta aceptada:

Esta es una trampa bash bien conocida, debido a esta característica :

Cada comando en una canalización se ejecuta como un proceso separado (es decir, en una subcapa).

de modo que las variables modificadas sean locales para la subcapa y no sean visibles una vez que regresen a la principal.

Para evitar eso, reformule su código para evitar la canalización, con una sustitución de proceso:

 for arg in "[email protected]"
    do  
        readlink -e "$arg" || (( ++r ))

    done > >(sort -u)

Linux
  1. Cómo asignar la salida de un comando de Linux a una variable

  2. ¿Cómo ordenar la salida Du por tamaño?

  3. Salida de qué comando utilizado para la entrada a Cd?

  4. ¿Cómo ordenar un archivo, en función de sus valores numéricos para un campo?

  5. Código de retorno de sed para ninguna coincidencia

Golpe para bucle

Comprender el bucle for en los scripts de Shell

El Bash FOR Loop explicado y simplificado

Color diferente para comando y salida

Cómo ordenar esta salida 1,10,11..2

¿Cómo puedo ordenar la salida du -h por tamaño?