Estoy tratando de escribir una función bash simple que tome, como argumentos, varios archivos y / o directorios. Debería:
- Califique completamente los nombres de archivo.
- Clasifícalos.
- Eliminar duplicados.
- Imprime todo lo que realmente existe.
- Devuelve el número de archivos inexistentes.
Tengo un script que casi hace lo que quiero, pero se cae en la clasificación. El valor de retorno del script tal como está es correcto, pero el resultado no lo está (sin clasificar y duplicados). Si descomento la | sort -u
declaración como se indica, la salida es correcta pero el valor de retorno es siempre 0
.
NB 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 la secuencia de comandos que incrementa la variable r
?
Aquí está el guión:
function uniqfile
{
local r=0
for arg in "$@"
do
readlink -e "$arg" || (( ++r ))
done #| sort -u ## remove that comment
return $r
}
for arg in "$@"
afor arg
. "Si 'en PALABRAS ...;' no está presente, entonces se asume 'en "$ @"' ". - ayuda paraRespuestas:
Este es un error conocido de bash, debido a esta característica :
para que las variables modificadas sean locales a la subshell y no sean visibles una vez en el padre
Para evitar eso, reformule su código para evitar la canalización, con una sustitución de proceso:
fuente
>(..command..)
construcción. Yo creo que sé cómo funciona, pero siento que debería leer un poco más lejos.Esto
| sort -u
obliga a que el bit anterior (por lo tanto, el ciclo for for) se ejecute en un subproceso (bash necesita un 'STDOUT' para redirigirse alsort
'STDIN'. (Internet parece pensarksh
ybash
manejar este caso de manera ligeramente diferente ... primero o último comando en la secuencia de la tubería se pone en una subshell?)Este hilo pasa por un problema similar y tiene una solución ordenada al final: http://ubuntuforums.org/showthread.php?t=312017
extractofuente