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/.