Vamos criar um arquivo de teste:

Vamos criar um arquivo de teste:

Estou lutando com esse problema há algum tempo e agradeceria muito se alguém pudesse esclarecê-lo para mim. Suponha que eu esteja tentando unir os dois comandos. readlinkecat

readlink Command output
$ readlink -f SUService.log
/cygdrive/c/SUService.log

Agora, se eu tentar algo assim (falha)

$ readlink -f SUService.log | cat

Embora algo assim funcione

$ readlink -f SUService.log | xargs cat

Eu queria saber por que isso acontece? eu liessepost aqui em que o OP tinha uma pergunta semelhante eessepostagem que tenta explicar a diferença entre um argumento e uma entrada, mas ainda não consegui entender as respostas aceitas. Pelo que entendi é que readlinkretorna o resultado para stdout que é a tela do terminal enquanto catdeseja uma entrada como argumento. Em troca, isso me leva a perguntar como posso saber se a saída de um comando (como localizar ou readlink) pode funcionar como argumento ou não para o próximo comando? Tenho lido mais e gostaria de saber quando devo usar o comando xarg.

Responder1

seu exemplo é bastante confuso.

Você normalmente não envia qualquer personagem para cat.

Você normalmente envia um arquivo para cat.

No entanto, quando você envia alguns caracteres para cat, ele imprime os caracteres.

$ echo abc12123 | cat
abc12123

Normalmente você envia um nome de arquivo para cat

$ cat abc12123
cat: abc12123: No such file or directory

Portanto, observe que o gato em si lida de maneira diferente com personagens engraçados transmitidos a ele, em vez de ser passado como parâmetro.

$ cat b.b
textofb.b

$ echo b.b | cat
b.b

$ cat b.b
textofb.b

vou usar um exemplo mais simples que o seu

$ echo b.b | xargs cat
textofb.b

veja que ele imprime o conteúdo de bb porque asdfasdfs | xargs catenviará a saída de asdfasdfs como parâmetro para cat.

Então

echo b.b | xargs cat   
=  
cat b.b

Considerando que echo b.b | cat não é o mesmo quecat b.b

Responder2

O seguinte comando faznãofalhar. Simplesmente faz algo que você não esperava:

readlink -f SUService.log | cat

Quando catrecebe stdin, ele o copia para stdout. Ele não procura nomes de arquivos nele.

Como alternativa, isso será lido no arquivo nomeado:

cat "$(readlink -f SUService.log)"

xargstambém colocará o nome na catlinha de comando, produzindo o mesmo resultado:

readlink -f SUService.log | xargs cat

Responder3

Dê uma olhada nas páginas de manual de cat e xargs para ver o que eles fazem.

man cat

cat - concatenate files and print on the standard output

E:

man xargs

xargs - build and execute command lines from standard input

Aqui está uma pequena demonstração

Vamos criar um arquivo de teste:

echo "a" > test
echo "b" >> test
echo "c" >> test

gato

cat test

Lê o arquivo e dá:

a
b
c

eco | gato

echo test | cat

De acordo com man cat, isso faz o mesmo que:

echo test | cat -

Que testentra no stdin do gato e diz ao gato para ler o stdin.

eco | gato xargs

echo test | xargs cat

Gera e executa o seguinte comando:

cat test

A saída disso já mostramos.

Se corrermos

<test xargs -n1 cat

Xargs vê isso na entrada:

a
b
c

E gera os seguintes comandos:

cat a
cat b
cat c

O que deve resultar em três erros, já que esses arquivos não existem.

Porque o -n1?

De acordo com man xargs, -n1diz ao xargs para usar um argumento (lido do stdin) em cada comando que ele gera.

Se usarmos -n2, geramos o seguinte que usa até dois parâmetros por comando:

cat a b
cat c

E se usarmos -n3ou superior, ou simplesmente omitirmos -n:

< test xargs cat

Nós temos:

cat a b c

informação relacionada