change linux unix pipe ls

change - ls linux



Unix pipe en ls (3)

Como ls -l no recibe ninguna entrada, no hace nada con respecto a la salida de which studio . Lo importante aquí es entender la diferencia entre la entrada estándar y los argumentos. La entrada estándar es un archivo especial que se lee mediante el procedimiento scanf (por ejemplo, por un programa en C), y los argumentos a un programa se pasan al procedimiento principal como los parámetros argv y argc . argv es una matriz de matrices terminadas en nulo de char, y argc es la longitud de esa matriz.

Pensé que había entendido * nix pipe hasta ahora ... Tengo un ejecutable llamado studio que tiene enlaces simbólicos a mi instalación de Android Studio y asumí que podía obtener la ubicación vinculada a

which studio | ls -l

Pero eso no funciona. Lo que me da es equivalente a haber ejecutado ls -l en el directorio actual.

Si ejecuto which studio , obtengo /home/me/bin/studio . Y si ejecuto ls -l /home/me/bin/studio obtengo la salida esperada que me muestra la ubicación del enlace simbólico.

Entonces, ¿por qué no funciona la versión canalizada? ¿Qué es lo que no he oído sobre tuberías?


Para hacer eso necesitas xargs :

which studio | xargs ls -l

De man xargs :

xargs - construir y ejecutar líneas de comando desde la entrada estándar

Para comprender completamente cómo funcionan las tuberías, puede leer ¿Qué es una explicación simple de cómo funcionan las tuberías en BASH? :

Un conducto Unix conecta el descriptor de archivo STDOUT (salida estándar) del primer proceso al STDIN (entrada estándar) del segundo. Lo que sucede entonces es que cuando el primer proceso escribe en su STDOUT, ese resultado puede leerse inmediatamente (desde STDIN) mediante el segundo proceso.


ls no lee sus argumentos desde la entrada estándar, sino desde la línea de comandos. Para obtener el directorio en la línea de comandos, debe usar la sustitución de comandos:

ls -l "$( which studio )"

(Las comillas dobles son necesarias si la ruta puede contener espacios en blanco).