V dokumentaci Perl perlrun(1) navrhuje spouštění skriptů Perl pomocí dvojjazyčného shellu/perlovské hlavičky:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"[email protected]"}'
if 0;
Co znamená ${1+"[email protected]"} znamenat? Zkusil jsem použít "[email protected]" místo toho (pomocí Bash jako /bin/sh) a zdá se, že to funguje stejně dobře.
Upravit
Dvě odpovědi níže říkají, že by to mělo být ${1:+"[email protected]"} . Jsem si vědom ${parameter:+word} (“Použít alternativní hodnotu”) syntaxe zdokumentovaná v bash(1). Nejsem však přesvědčen, protože
-
Oba
${1+"[email protected]"}a"[email protected]"fungují dobře, i když nejsou žádné parametry. Pokud vytvořím simple.sh jako#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "[email protected]"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);a question.sh jako
#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 ${1+"[email protected]"}' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);Mohu přimět oba, aby fungovaly identicky:
$ ./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 = [ '' ]; -
Jiné zdroje na internetu také používají
${1+"[email protected]"}, včetně jednoho hackera, který, jak se zdá, ví, co dělá.
Možná ${parameter+word} je nezdokumentovaná alternativní (nebo zastaralá) syntaxe pro ${parameter:+word} ? Mohl by někdo potvrdit tuto hypotézu?
Přijatá odpověď:
To kvůli kompatibilitě s Bourne shellem. Bourne shell byl starý shell, který byl poprvé vydán s Unixem verze 7 v roce 1979 a byl stále běžný až do poloviny 90. let jako /bin/sh na většině komerčních Unices.
Je předkem většiny skořápek podobných Bourne jako ksh , bash nebo zsh .
Měl několik nepříjemných funkcí, z nichž mnohé byly opraveny v ksh a další shelly a nová standardní specifikace sh , z nichž jeden je tento:
S Bourne shellem (alespoň ty varianty, kde to nebylo opraveno):"[email protected]" Pokud je seznam pozičních parametrů prázdný, nahradí se jedním prázdným argumentem ($# == 0 ) místo žádného argumentu.
${var+something} expanduje na „něco“, pokud není $var není nastaveno. Je jasně zdokumentován ve všech shellech, ale těžko se hledá v bash dokumentaci, protože musíte věnovat pozornost této větě:
Když neprovádíte rozšiřování podřetězců, pomocí formulářů popsaných níže, bash testuje parametr, který není nastaven nebo má hodnotu null. Vynechání dvojtečky vede k testu pouze pro parametr, který není nastaven .
Takže ${1+"[email protected]"} se rozšíří na "[email protected]" pouze pokud $1 je nastaveno ($# > 0 ), který toto omezení Bourne shellu obchází.
Všimněte si, že Bourne shell je jediný shell s tímto problémem. Moderní sh s (to je sh vyhovující specifikaci POSIX sh (což Bourne shell není)) tento problém nemají. Takže to potřebujete pouze v případě, že potřebujete, aby váš kód fungoval na velmi starých systémech, kde je /bin/sh může být Bourne shell namísto standardního shellu (všimněte si, že POSIX nespecifikuje umístění standardního sh , takže například na Solarisu před Solaris 11, /bin/sh byl stále Bourne shell (ačkoli neměl tento konkrétní problém), zatímco normální/standardní sh byl na jiném místě (/usr/xpg4/bin/sh )).
V tomto perlrun je problém perldoc stránku v této $0 není však citován.
Více informací naleznete na http://www.in-ulm.de/~mascheck/various/bourne_args/.