Como os xargs sabem quando uma entrada stdin termina, para que ela possa começar a processá-la? [duplicado]

7

Depois de ler a resposta de Stephen Kitt , xargs espera receber a entrada stdin antes de processar qualquer entrada, como dividir em argumentos.

Como os xargs sabem quando uma entrada stdin termina, para que ela possa começar a processá-la?

-E é usado para especificar o final de uma entrada stdin?

Sem ele, como o xargs sabe quando termina? Existe algum tempo limite?

    
por Ben 24.11.2018 / 23:51

2 respostas

13

Para ler sua entrada, xargs usa a função read (consulte também a página de manual do Linux correspondente ).

read lê os próximos dados disponíveis de um descritor de arquivos em uma área de memória especificada pelo programa de chamada. Conforme usado por xargs , read aguarda até que os dados estejam disponíveis ou ocorra um erro ou determina que não haverá mais dados disponíveis. Ele retorna respectivamente um inteiro positivo, -1 ou 0 em cada um desses casos.

Para determinar quando terminar de ler sua entrada (sua entrada padrão ou a entrada especificada pela opção -a ), xargs procurará o marcador de fim de arquivo especificado (se a opção -E tiver sido usada ), ou um valor de retorno 0 de read .

Você pode ver isso em ação executando

printf '%s ' {1..1024} | strace -e read xargs -s 2048 -x
    
por 25.11.2018 / 00:11
1

How does xargs know when a stdin input ends, so that it can start processing it?

xargs não aguarda o final do stdin antes de começar a processá-lo:

$ while date +%H:%S; do sleep 1; done | xargs -n2 echo
16:51 16:52
16:53 16:54
16:55 16:56
16:57 16:58
^C

xargs sabe que o stdin terminou como qualquer outro programa, por exemplo. cat (1) ou tee (1), verificando o valor de retorno de read (2), chamando feof (3), etc. xargs também tratará um erro de leitura em stdin como um fim de arquivo. / p>     

por 25.11.2018 / 16:09

Tags