Ls y redirección de entrada

Ls y redirección de entrada

Me gustaría redirigir el contenido de un archivo a la lsentrada del comando:

ls -l < /home/john/1.txt

donde 1.txtel contenido es solo:

/etc

Esperaba lsenumerar el contenido del archivo definido en /home/jonh1.txt, es decir, /etcdirectorio, pero parece ignorar el flujo de entrada; todavía enumera el contenido del directorio actual en lugar del /etcdirectorio tal como se define en /home/jonh1.txtel archivo.

Respuesta1

parece ignorar el flujo de entrada

Sí. El lsprogramanuncausa 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 | sorty 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 | sortporque 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 moreo 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.txtse 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 bashla secciónSustitución de comando.

información relacionada