Creemos un archivo de prueba:

Creemos un archivo de prueba:

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. readlinkycat

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, readlinkdevuelve el resultado a la salida estándar, que es la pantalla del terminal, mientras catquiere 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 catenviará 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 catse 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)"

xargstambién pondrá el nombre en la catlí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 testa 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, -n1le dice a xargs que use un argumento (leído de la entrada estándar) en cada comando que genera.

Si usamos -n2en su lugar, generamos lo siguiente que usa hasta dos parámetros por comando:

cat a b
cat c

Y si usamos -n3o superior, o simplemente omitimos -n:

< test xargs cat

Obtenemos:

cat a b c

información relacionada