En la documentación de Perl, perlrun(1) sugiere ejecutar secuencias de comandos de Perl utilizando un encabezado bilingüe de Shell/Perl:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"[email protected]"}'
if 0;
¿Qué significa ${1+"[email protected]"}
¿significar? Intenté usar "[email protected]"
en su lugar (usando Bash como /bin/sh), y parece funcionar igual de bien.
Editar
Dos respuestas a continuación dicen que se supone que es ${1:+"[email protected]"}
. Soy consciente del ${parameter:+word}
(“Usar valor alternativo”) sintaxis documentada en bash(1). Sin embargo, no estoy convencido, porque
-
Ambos
${1+"[email protected]"}
y"[email protected]"
funciona bien, incluso cuando no hay parámetros. Si creo simple.sh como#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "[email protected]"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
y question.sh como
#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 ${1+"[email protected]"}' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
Puedo hacer que ambos funcionen de manera idéntica:
$ ./question.sh $VAR1 = []; $ ./question.sh a $VAR1 = [ 'a' ]; $ ./question.sh a 'b c' $VAR1 = [ 'a', 'b c' ]; $ ./question.sh "" $VAR1 = [ '' ]; $ ./simple.sh $VAR1 = []; $ ./simple.sh a $VAR1 = [ 'a' ]; $ ./simple.sh a 'b c' $VAR1 = [ 'a', 'b c' ]; $ ./simple.sh "" $VAR1 = [ '' ];
-
Otras fuentes en Internet también usan
${1+"[email protected]"}
, incluido un hacker que parece saber lo que hace.
Quizás ${parameter+word}
es una sintaxis alternativa no documentada (u obsoleta) para ${parameter:+word}
? ¿Alguien podría confirmar esa hipótesis?
Respuesta aceptada:
Eso es por compatibilidad con el shell Bourne. El shell Bourne era un shell antiguo que se lanzó por primera vez con la versión 7 de Unix en 1979 y aún era común hasta mediados de los 90 como /bin/sh
en la mayoría de Unices comerciales.
Es el antepasado de la mayoría de las conchas tipo Bourne como ksh
, bash
o zsh
.
Tenía algunas características extrañas, muchas de las cuales se han solucionado en ksh
y los otros shells y la nueva especificación estándar de sh
, uno de los cuales es este:
Con el shell de Bourne (al menos aquellas variantes en las que no se ha solucionado):"[email protected]"
se expande a un argumento vacío si la lista de parámetros posicionales está vacía ($# == 0
) en lugar de ningún argumento.
${var+something}
se expande a "algo" a menos que $var
está desarmado. Está claramente documentado en todos los shells pero es difícil de encontrar en bash
documentación ya que debe prestar atención a esta oración:
Cuando no realice la expansión de subcadena, utilizando los formularios documentados a continuación, bash prueba un parámetro que no está establecido o es nulo. Omitir los dos puntos da como resultado una prueba solo para un parámetro que no está establecido .
Así que ${1+"[email protected]"}
se expande a "[email protected]"
solo si $1
está establecido ($# > 0
) que soluciona esa limitación del shell Bourne.
Tenga en cuenta que el shell Bourne es el único shell con ese problema. sh
moderno s (que es sh
conforme a la especificación POSIX de sh
(que el shell Bourne no es)) no tienen ese problema. Entonces solo necesita eso si necesita que su código funcione en sistemas muy antiguos donde /bin/sh
podría ser un shell Bourne en lugar de un shell estándar (tenga en cuenta que POSIX no especifica la ubicación del sh
estándar , por ejemplo en Solaris antes de Solaris 11, /bin/sh
seguía siendo un shell Bourne (aunque no tenía ese problema en particular) mientras que el sh
normal/estándar estaba en otra ubicación (/usr/xpg4/bin/sh
)).
Hay un problema en eso perlrun
página perldoc en ese $0
aunque no se cita.
Consulte http://www.in-ulm.de/~mascheck/various/bourne_args/ para obtener más información.