Как xargs узнает, когда заканчивается ввод stdin, чтобы начать его обработку? [дубликат]

Si scriptAllama a scriptBcomo

scriptB "$@"

, los argumentos de la línea de comando que se usaron para invocar scriptAse pasarán a scriptBsiempre que no se hayan modificado antes de la llamada.

Lo mismo para la llamada de scriptBa scriptC.

Siempre que scriptAy scriptBno intente interpretar, cambiar o mutar el contenido de$@(o los parámetros posicionales individuales $1, $2, $3, etc. ), los argumentos de la línea de comando se pasarán a scriptCpara que los analice con getopt.


Ejemplo usando funciones en lugar de scripts (funciona de la misma manera):

#!/bin/sh

scriptC () {
    printf 'Arg: %s\n' "$@"
}

scriptB () {
    scriptC "$@"
}

scriptA () {
    scriptB "$@"
}

scriptA -param1 -param2

Esto producirá la salida

Arg: -param1
Arg: -param2

Haciendo la llamada como

scriptA "hello world" --param1 /etc/passwd --param2

producirá

Arg: hello world
Arg: --param1
Arg: /etc/passwd
Arg: --param2

Es decir, los parámetros se pasarán a scriptCsin modificación. Entonces se deja a scriptCinterpretar los parámetros usando getopt, getoptso por algún otro medio.

7
25.11.2018, 00:51
2 ответа

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

xargsне ждет ли окончания стандартного ввода перед началом его обработки:

$ 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знает, что стандартный ввод завершился, как и любая другая программа, например. cat (1 )или tee (1 ), проверив возвращаемое значение read (2 ), вызов feof (3 )и т. д. xargsтакже будет рассматривать ошибку чтения на стандартном вводе как конец -файла -.

1
27.01.2020, 20:15

Чтобы прочитать свой ввод, xargsиспользует функциюread(см. также соответствующую справочную страницу Linux).

readсчитывает следующие доступные данные из дескриптора файла в область памяти, указанную вызывающей программой. Как используется xargs, readожидает, пока либо данные не будут доступны, либо не произойдет ошибка, либо не будет определено, что больше никаких данных больше не будет. Он возвращает соответственно положительное целое число, -1 или 0 в каждом из этих случаев.

Чтобы определить, когда он закончил считывание своего ввода (, своего стандартного ввода или ввода, заданного опцией -a),xargsищет указанный конец -маркера файла -(, если была использована опция -E), или возвращаемое значение 0 из read.

Вы можете увидеть это в действии, запустив

printf '%s ' {1..1024} | strace -e read xargs -s 2048 -x
13
27.01.2020, 20:15

Теги

Похожие вопросы