
He estado luchando con este problema por un tiempo y realmente agradecería que alguien pudiera aclararmelo. Supongamos que estoy intentando conectar los dos comandos. readlink
ycat
readlink Command output
$ readlink -f SUService.log
/cygdrive/c/SUService.log
Ahora si intento algo como esto (falla)
$ readlink -f SUService.log | cat
Si bien algo como esto funcionará
$ readlink -f SUService.log | xargs cat
¿Quería saber por qué es eso? he leídoestepublicación aquí en la que el OP tenía una pregunta similar yestepublicación que intenta explicar la diferencia entre un argumento y una entrada, sin embargo, todavía no puedo entender las respuestas aceptadas. Por lo que tengo entendido, readlink
devuelve el resultado a la salida estándar, que es la pantalla del terminal, mientras cat
quiere una entrada como argumento. Esto, a cambio, me lleva a preguntar ¿cómo puedo saber si la salida de un comando (como localizar o leer enlace) puede funcionar como argumento o no para el siguiente comando? He estado leyendo más y resulta que me gustaría saber cuándo debería usar el comando xarg.
Respuesta1
Tu ejemplo es bastante confuso.
Normalmente no envías cualquier personaje a cat.
Normalmente envías un archivo a cat.
Sin embargo, cuando envías algunos caracteres a cat, los imprime.
$ echo abc12123 | cat
abc12123
Normalmente envías un nombre de archivo a cat.
$ cat abc12123
cat: abc12123: No such file or directory
Entonces, observe que el gato en sí trata de manera diferente los personajes divertidos que se le envían, en lugar de pasarlos como parámetro.
$ cat b.b
textofb.b
$ echo b.b | cat
b.b
$ cat b.b
textofb.b
Usaré un ejemplo más simple que el tuyo.
$ echo b.b | xargs cat
textofb.b
Vea que imprime el contenido de bb porque asdfasdfs | xargs cat
enviará la salida de asdfasdfs como parámetro a cat.
Entonces
echo b.b | xargs cat
=
cat b.b
Mientras que echo b.b | cat
no es lo mismo quecat b.b
Respuesta2
El siguiente comando hacenofallar. Simplemente hace algo que no esperabas:
readlink -f SUService.log | cat
Cuando cat
se le proporciona stdin, lo copia a stdout. No busca nombres de archivos en él.
Alternativamente, esto leerá del archivo nombrado:
cat "$(readlink -f SUService.log)"
xargs
también pondrá el nombre en la cat
línea de comando, arrojando el mismo resultado:
readlink -f SUService.log | xargs cat
Respuesta3
Eche un vistazo a las páginas de manual de cat y xargs para ver qué hacen.
man cat
cat - concatenate files and print on the standard output
Y:
man xargs
xargs - build and execute command lines from standard input
Aquí hay una pequeña demostración.
Creemos un archivo de prueba:
echo "a" > test
echo "b" >> test
echo "c" >> test
gato
cat test
Lee el archivo y da:
a
b
c
eco | gato
echo test | cat
Según man cat
, esto hace lo mismo que:
echo test | cat -
Que se conecta test
a la entrada estándar de cat y le dice a cat que lea desde la entrada estándar.
eco | gato xargs
echo test | xargs cat
Genera y ejecuta el siguiente comando:
cat test
El resultado de esto ya lo hemos mostrado.
si corremos
<test xargs -n1 cat
Xargs ve esto en la entrada:
a
b
c
Y genera los siguientes comandos:
cat a
cat b
cat c
Lo que debería resultar en tres errores ya que esos archivos no existen.
Porqué el -n1
?
Según man xargs
, -n1
le dice a xargs que use un argumento (leído de la entrada estándar) en cada comando que genera.
Si usamos -n2
en su lugar, generamos lo siguiente que usa hasta dos parámetros por comando:
cat a b
cat c
Y si usamos -n3
o superior, o simplemente omitimos -n
:
< test xargs cat
Obtenemos:
cat a b c