Me gustaría redirigir el contenido de un archivo a la ls
entrada del comando:
ls -l < /home/john/1.txt
donde 1.txt
el contenido es solo:
/etc
Esperaba ls
enumerar el contenido del archivo definido en /home/jonh1.txt
, es decir, /etc
directorio, pero parece ignorar el flujo de entrada; todavía enumera el contenido del directorio actual en lugar del /etc
directorio tal como se define en /home/jonh1.txt
el archivo.
Respuesta1
parece ignorar el flujo de entrada
Sí. El ls
programanuncausa el flujo de entrada, porque no fue escrito para leer nada del flujo de entrada. Esto no es algo que viene automáticamente con ningún programa Unix; debe implementarse por separado.
No confunda el flujo de entrada (stdin) con los argumentos de la línea de comandos (argv); el primero es una secuencia real que se puede leer línea por línea, mientras que el segundo es una simple matriz de palabras de solo lectura. En su caso, ambos están presentes y contienen datos diferentes.
(¿Por qué no debería ser automático para todos los programas? Bueno, tomemosclasificarogatoogrepcomo ejemplo. Estos programas aceptan diferentes tipos de valores: nombres de archivos como argumentos, pero texto como contenido estándar. Por lo tanto, puede canalizar cualquier comando a | sort
y ordena la entrada. Pero si la entrada estándar y la línea de comandos fueran lo mismo, ya no se podría canalizar nada | sort
porque pensaría que la entrada de canalización era una lista de nombres de archivos. O viceversa, no podría darle nombres de archivos porque simplemente ordenaría los nombres).
Para una versión alternativa, consulteesta explicación en StackOverflow(que ya tienes en los comentarios).
Respuesta2
Intente usar xargs:
xargs ls -l < /home/john/1.txt
Respuesta3
Si escribe cualquier programa de línea de comando que reciba información del usuario, verá muy claramente lo que está sucediendo. Si un programa tiene una instrucción read/readLine (diferentes idiomas pueden darle un nombre diferente), entonces, el programa solicita al usuario información, entonces también puede canalizar o redirigir esa entrada usando |
o<
Si observa un programa que recibe entradas, verá como con more
o less
, si lo escribe sin entradas $more<ENTER>
, entonces solicitará entradas. Al canalizarle datos, deja de solicitar entrada. Si ejecutamos sed sin parámetros, $sed<ENTER>
entonces seguro que da un error y no podemos hacer $echo abc|sed<ENTER>
ninguna de las dos cosas. Pero si lo hacemos $sed 's/a/b/'<ENTER>
, solicitará información. Y por eso echo abc|sed 's/a/b/'<ENTER>
funciona.
Puedes ver esto si escribes un programa incluso tan simple como Hola Mundo, pero que requiere información como si el programa solicitara una palabra y si la persona escribe "abc", dice "Hola abc". Podrás conectarte a ese programa. No se necesita ninguna programación adicional para que funcionen las tuberías y la redirección de entradas. Si el programa acepta la entrada del teclado por parte del usuario, la canalización y la redirección funcionarán y luego el programa no solicitará la entrada.
Respuesta4
Editar
Como Kamil Maciorowski señaló en un comentario a continuación, lo siguiente no es el camino correcto a seguir.
Si
/home/john/1.txt
se garantiza que contiene exactamente una ruta, entoncesdefinitivamente deberías poner comillas dobles. Si el archivo puede contener más de una ruta y usted confía deliberadamente en la división de palabras, entonces esta no es la forma correcta de proporcionar rutas arbitrarias.
Publicación original (mal ejemplo)
Puedes utilizar lo siguiente:
ls -l $(cat /home/john/1.txt)
Mira > man bash
la secciónSustitución de comando.