
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. readlink
ecat
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 readlink
retorna o resultado para stdout que é a tela do terminal enquanto cat
deseja 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 cat
enviará 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 cat
recebe 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)"
xargs
também colocará o nome na cat
linha 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 test
entra 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
, -n1
diz 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 -n3
ou superior, ou simplesmente omitirmos -n
:
< test xargs cat
Nós temos:
cat a b c