No entiendo cómo funcionan las tuberías en bash.
Sé que toma una salida de un comando como entrada en otro comando.
Lo que puedo obtener es una salida porque es lo que el comando imprime en la pantalla.
Pero, ¿cómo sé qué entrada tomará un comando?
Aquí hay un ejemplo que pensé que funcionaría:
which gem | rm
Lamentablemente no fue así.
¿Qué gema se imprime /usr/bin/gem
así que esa debe ser la salida correcta?
Pensé que se le había dado a rm así que sería, rm /usr/bin/gem
pero me equivoqué.
Entonces mi pregunta es, ¿cómo sé qué entrada toma un comando?
rm /usr/bin/gem
es una idea terrible . Deje esogem
(y el intérprete de Ruby con el que va) solo e instale su intérprete de Ruby preferido (ygem
) usandorvm
: rvm.beginrescueend.comRespuestas:
"Entrada" y "argumentos de línea de comando" son cosas diferentes.
rm
elimina los archivos proporcionados como argumentos.Una tubería redirige la salida del comando de la izquierda a la entrada del comando de la derecha. No afecta los argumentos de la línea de comandos del programa de la derecha.
Para hacer lo que intenta hacer, intente usar
xargs
para convertir la entrada estándar en argumentos de línea de comandos para ejecutar un programa. Ese es su trabajo.which gem | xargs rm
, por ejemplo, eliminará elgem
en su RUTA.fuente
rm
no toma entrada, toma argumentos. Estos son diferentes Los argumentos son los modificadores y los nombres de archivo, etc., que le da a un programa en la línea de comando para afectar su comportamiento. La entrada son los datos en los que trabaja el programa. Por ejemplo,grep
toma entradas y argumentos:Hay dos argumentos allí
"foo"
yfile.txt
. La entrada es el contenido defile.txt
, no la cadena enfile.txt
sí. Dado que grep toma entrada, puede usarla con tuberías:produce la misma salida, ya que cat toma
file.txt
como argumento y produce el contenido defile.txt
como salida. Esa salida se canaliza a grep, dando el mismo efecto que grep al abrir el archivo, como en el primer ejemplo.Si desea utilizar la salida de un programa como argumento para otro, utilice las teclas de retroceso:
o esta sintaxis alternativa (específica de bash):
Editar: o
xargs
como señala otro respondedor. Muchas formas de pelar un gato con una línea de comando.fuente
cat file.txt | grep "foo"
puede ser cientos de veces más lento quegrep "foo" file.txt
.grep --help
una descripción rápida de los argumentos aceptados.Consulte las
man
páginas de comandos que le interesan. Estos programas le indicarán que leyeronstdin
(intenteman grep
con un comando popular que lea stdin).fuente
man grep | grep 'standard input'
y obtuveIf no file arguments are specified, the standard input is used.
el último partido. 👍 Tuve quegrep
probar un poco su propia medicina. 😎Todos estos son peligrosos de ejecutar si tiene un directorio en su RUTA que contiene espacio o si el nombre del comando contiene espacio:
GNU Parallel http: // www.gnu.org/software/parallel/ no tiene ese problema, por lo que esto funcionará incluso si tiene un directorio en su RUTA que contiene espacio o si el nombre del comando contiene espacio:
Mire el video de introducción de GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ
fuente