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 "$@"
.