Si scriptA
llama a scriptB
como
scriptB "$@"
, los argumentos de la línea de comando que se usaron para invocar scriptA
se pasarán a scriptB
siempre que no se hayan modificado antes de la llamada.
Lo mismo para la llamada de scriptB
a scriptC
.
Siempre que scriptA
y scriptB
no 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 scriptC
para 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 scriptC
sin modificación. Entonces se deja a scriptC
interpretar los parámetros usando getopt
, getopts
o por algún otro medio.
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
также будет рассматривать ошибку чтения на стандартном вводе как конец -файла -.
Чтобы прочитать свой ввод, xargs
использует функциюread
(см. также соответствующую справочную страницу Linux).
read
считывает следующие доступные данные из дескриптора файла в область памяти, указанную вызывающей программой. Как используется xargs
, read
ожидает, пока либо данные не будут доступны, либо не произойдет ошибка, либо не будет определено, что больше никаких данных больше не будет. Он возвращает соответственно положительное целое число, -1 или 0 в каждом из этих случаев.
Чтобы определить, когда он закончил считывание своего ввода (, своего стандартного ввода или ввода, заданного опцией -a
),xargs
ищет указанный конец -маркера файла -(, если была использована опция -E
), или возвращаемое значение 0 из read
.
Вы можете увидеть это в действии, запустив
printf '%s ' {1..1024} | strace -e read xargs -s 2048 -x