Estoy tratando de leer la salida de un comando en bash usando a while loop
.
while read -r line
do
echo "$line"
done <<< $(find . -type f)
La salida que obtuve
ranveer@ranveer:~/tmp$ bash test.sh
./test.py ./test1.py ./out1 ./test.sh ./out ./out2 ./hello
ranveer@ranveer:~/tmp$
Después de esto intenté
$(find . -type f) |
while read -r line
do
echo "$line"
done
pero genera un error test.sh: line 5: ./test.py: Permission denied
.
Entonces, ¿cómo lo leo línea por línea porque creo que actualmente está sorbiendo toda la línea a la vez?
Salida requerida:
./test.py
./test1.py
./out1
./test.sh
./out
./out2
./hello
while read
parte, vea Comprender IFS y las preguntas vinculadas allí.find
, vea ¿Cómo puedo usar dos comandos bash en -exec del comando find? o Ejecutar la función definida por el usuario en una llamada find -exec (de la cual esta pregunta es principalmente un duplicado).Respuestas:
Hay un error, es necesario
< <(command)
no<<<$(command)
< <( )
es una sustitución de proceso ,$()
es una sustitución de comando y<<<
es una cadena aquí .fuente
$( )
todo! Esa es la sintaxis para la sustitución de comandos , que es solo una forma de usar la salida de comandos. Las tuberías y la sustitución de procesos y las cadenas aquí son otras, y todas tienen una sintaxis diferente, naturalmente. No debería analizar los nombres de archivo de todos modos a menos que realmente sepa lo que está haciendo.Process Substitution
.Tenga en cuenta que no hay nada que impida que los nombres de archivo contengan caracteres de nueva línea. La forma canónica de ejecutar un comando para cada archivo encontrado por find es.
Y si quieres que las cosas se hagan en bash:
Además, la forma canónica de llamar al comando "leer" en los scripts (si no desea que realice un procesamiento adicional en la entrada) es:
-r
es para dejarread
de tratar los caracteres de barra invertida especialmente (como un carácter de escape para separadores y nueva línea), e IFS = para establecer la lista de separadores en la cadena vacíaread
(de lo contrario, si algún carácter de espacio en blanco estuviera en esa lista, se eliminarían del principio y fin de la entrada).Por lo general, usar bucles en shells es una mala idea (no cómo se hacen las cosas en shells donde haces que varias herramientas funcionen de manera colectiva y simultánea para una tarea en lugar de ejecutar una o más herramientas cientos de veces en secuencia).
fuente