Nella documentazione Perl, perlrun(1) suggerisce di lanciare script Perl usando un'intestazione shell/Perl bilingue:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"[email protected]"}'
if 0;
Che cosa significa ${1+"[email protected]"}
significare? Ho provato a utilizzare "[email protected]"
invece (usando Bash come /bin/sh), e sembra funzionare altrettanto bene.
Modifica
Due risposte di seguito dicono che dovrebbe essere ${1:+"[email protected]"}
. Sono a conoscenza del ${parameter:+word}
sintassi ("Usa valore alternativo") documentata in bash(1). Tuttavia, non sono convinto, perché
-
Entrambi
${1+"[email protected]"}
e"[email protected]"
funzionano bene, anche quando non ci sono parametri. Se creo simple.sh come#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "[email protected]"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
e question.sh come
#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 ${1+"[email protected]"}' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
Posso far funzionare entrambi allo stesso modo:
$ ./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 = [ '' ];
-
Anche altre fonti su Internet utilizzano
${1+"[email protected]"}
, incluso un hacker che sembra sapere cosa sta facendo.
Forse ${parameter+word}
è una sintassi alternativa (o obsoleta) non documentata per ${parameter:+word}
? Qualcuno potrebbe confermare questa ipotesi?
Risposta accettata:
Questo è per la compatibilità con la shell Bourne. La shell Bourne era una vecchia shell rilasciata per la prima volta con Unix versione 7 nel 1979 ed era ancora comune fino alla metà degli anni '90 come /bin/sh
sulla maggior parte degli Unici commerciali.
È l'antenato della maggior parte dei conchiglie tipo Bourne come ksh
, bash
o zsh
.
Aveva alcune caratteristiche imbarazzanti, molte delle quali sono state risolte in ksh
e le altre shell e la nuova specifica standard di sh
, uno dei quali è questo:
Con la shell Bourne (almeno quelle varianti in cui non è stato corretto):"[email protected]"
si espande in un argomento vuoto se l'elenco dei parametri posizionali è vuoto ($# == 0
) invece di nessun argomento.
${var+something}
si espande in "qualcosa" a meno che $var
non è impostato. È chiaramente documentato in tutte le shell ma è difficile da trovare in bash
documentazione in quanto è necessario prestare attenzione a questa frase:
Quando non si esegue l'espansione della sottostringa, utilizzando i moduli documentati di seguito, bash verifica un parametro non impostato o nullo. L'omissione dei due punti determina un test solo per un parametro non impostato .
Quindi ${1+"[email protected]"}
si espande in "[email protected]"
solo se $1
è impostato ($# > 0
) che aggira questa limitazione della shell Bourne.
Si noti che la shell Bourne è l'unica con questo problema. sh
moderno s (ovvero sh
conforme alla specifica POSIX di sh
(che la shell Bourne non è)) non hanno questo problema. Quindi ne hai bisogno solo se hai bisogno che il tuo codice funzioni su sistemi molto vecchi dove /bin/sh
potrebbe essere una shell Bourne invece di una shell standard (nota che POSIX non specifica la posizione dello standard sh
, ad esempio su Solaris prima di Solaris 11, /bin/sh
era ancora una shell Bourne (sebbene non avesse quel particolare problema) mentre il normale/standard sh
era in un'altra posizione (/usr/xpg4/bin/sh
)).
C'è un problema in quel perlrun
perldoc in quel $0
non è citato però.
Vedi http://www.in-ulm.de/~mascheck/various/bourne_args/ per maggiori informazioni.