¿Por qué se utiliza el comando "shift" en este caso?

¿Por qué se utiliza el comando "shift" en este caso?

Estoy reescribiendo debootstrap para adaptarme a mí y a la educación. ¿Por qué el comando "cambiar" en un fragmento de código de interacción en el archivo "funciones"? No se envían tantos argumentos para usar "shift" y, como sé, los argumentos de función solo son accesibles en función.

Ejemplo:

error () {
# <error code> <name> <string> <args>
local err="$1"
local name="$2"
local fmt="$3"
shift; shift; shift
if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
    (echo "E: $name"
    for x in "$@"; do echo "EA: $x"; done
    echo "EF: $fmt") >&4
else
    (printf "E: $fmt\n" "$@") >&4
fi
exit $err
}

Respuesta1

Los tres turnos eliminan el código de error, el nombre y la cadena de los argumentos para que el resto de los argumentos queden convenientemente en $@el forbucle de la línea nueve del script.

información relacionada