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.