significa script read que para for ask shell

shell - script - ${1:+"$ @"} en/bin/sh



shell ask for input (3)

Me he dado cuenta de que a veces los scripts de envoltura usarán ${1:+"$@"} para los parámetros en lugar de solo "$@" .

Por ejemplo, http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh usa

exec "$binary" $opts ${1:+"$@"}

¿Puede alguien romper ${1:+"$@"} en inglés y explicar por qué sería una ventaja sobre el simple "$@" ?


''Pasas histéricas'', también conocidas como Razones históricas.

La explicación de JesperE (o la página de manual de Bash) es precisa para lo que hace:

Si $ 1 existe y no es una cadena vacía, sustituya la lista de argumentos citada.

Hace aproximadamente 20 años, algunas variantes menores rotas de Bourne Shell sustituyeron una cadena vacía "" por "$ @" si no existían argumentos, en lugar del correcto, el comportamiento actual de no sustituir nada. Si alguno de estos sistemas todavía está en uso está abierto a debate.

[Hmm: esa expansión no funcionaría correctamente para:

command '''' arg2 arg3 ...

En este contexto, la notación correcta es:

${1+"$@"}

Esto funciona correctamente si $ 1 es un argumento vacío o no. Entonces, alguien recordó la notación incorrectamente, introduciendo accidentalmente un error.]


Para citar la parte relevante de man bash para la información a la que se refirió Jonathan Leffler en su comentario:

Cuando no se realiza la expansión de subcadenas, bash prueba para un parámetro que está desarmado o nulo ; omitir los dos puntos da como resultado una prueba solo para un parámetro que está desarmado .

(énfasis mío)


Desde la página del hombre bash:

${parameter:+word} Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted.

Por lo tanto, se sustituye "$@" menos que $1 esté desactivado. No veo por qué no pudieron haber usado "$@" .