Resposta simples

Resposta simples

Estou com problemas com xargscomandos 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 pipecomando transfere a saída do comando esquerdo como uma entrada para o direito, quando | xargso 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' | mkdirpor 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' | mkdirvocê espera mkdirler sua entrada padrão. No entanto, mkdirnã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 mkdirsemxargs

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 acomo stdin.

mkdirtrata essas coisas de maneira muito diferente, daí o resultado que você vê.

informação relacionada