Estou com problemas com xargs
comandos pipe
. Aqui está um exemplo =
echo 'a' | xargs mkdir
Este comando cria um diretório cujo nome é a
. Então posso entender que este comando é equivalente amkdir a
Mas por que esse comando não funciona = echo 'a' | mkdir
?
Eu li que o pipe
comando transfere a saída do comando esquerdo como uma entrada para o direito, quando | xargs
o comando transfere a saída do comando esquerdo como um argumento para o direito.
1-Quais são as diferenças entre entrada e argumento?
2- echo 'a' | mkdir
por que este comando não funciona e o que é equivalente a este comando?
Obrigado...
Responder1
Resposta simples
Os argumentos são uma entrada.
Resposta mais longa
Existem também outros tipos de entrada.
No seu exemplo, echo 'a' | mkdir
você espera mkdir
ler sua entrada padrão. No entanto, mkdir
não foi escrito para fazer isso.
O que você está chamando de entrada é entrada padrão ( stdin
). E a saída é padrão ( stdout
). Existe todo erro padrão ( stderr
). E um código de saída.
Resposta ainda mais longa - então qual é a diferença?
Os argumentos devem estar disponíveis antes do programa ser iniciado. Normalmente é: curto; contém opções, nomes de arquivos e texto curto.
A entrada padrão pode ser gravada enquanto o programa está em execução; podem ser enviados para ele dados que não existiam quando o programa foi iniciado; Não é garantido que você possa lê-lo fora de ordem (portanto, leia-o sequencialmente); Pode ter comprimento arbitrário; Existe apenas um padrão por processo, se você precisar de mais nomes de arquivos de envio como argumentos;
Como fazer echo 'a' | xargs mkdir
semxargs
mkdir "$(echo 'a')"
Os $()
meios executam o comando contido e, em seguida, substituem $()
e seu conteúdo pela saída padrão desse comando.
Responder2
Eu também fiquei confuso sobre isso por muito tempo. Vou dar um exemplo um pouco mais simples (de longe não sou especialista em bash):
wc "test"
wc <<< "test" (same as: echo "test" | wc)
O resultado desses dois é muito diferente. O primeiro tenta ler um arquivo test
, o segundo mostra 1 1 5
.
A questão aqui é que wc "test"
obtém oargumento "test"
como entrada, enquanto wc <<< "test"
levastdin.
Então, quando você emite echo 'a' | xargs mkdir
(xargs significa: execute como argumento), você está passando umargumentopara mkdir
; é como fazer: mkdir a
.
Por outro lado, quando você emite echo 'a' | mkdir
(mais simples seria : mkdir <<< 'a'
), você passa a
como stdin.
mkdir
trata essas coisas de maneira muito diferente, daí o resultado que você vê.