Uwaga na applnk-2.2.0-1 [zemsta baszystów]

Tomasz Pala gotar at polanet.pl
Thu Feb 24 23:25:00 CET 2011


On Thu, Feb 24, 2011 at 21:38:26 +0100, Arkadiusz Miskiewicz wrote:

>> > * /bin/zsh
>> > [arekm w t400 ~]$ unset COKOLWIEKTEST
>> > [arekm w t400 ~]$ /bin/zsh
>> > [arekm w t400 ~]$ [ "${COKOLWIEKTEST+X}" = "X" ] && echo set  || echo unset
>> > zsh: exit 1
>> > unset
>> 
>> SOA#1
>> 
>> ~:  unset COKOLWIEKTEST
>> ~:  [ "${COKOLWIEKTEST+X}" = "X" ] && echo set  || echo unset
>> unset
> 
> Ok ale co tu niby testujesz?

No to samo co Ty wyżej (exit 1 jakiś masz), copy&paste.

> daj unset COKOLWIEKTEST; export COKOLWIEKTEST i wtedy testuj

Taak? O tym później;) [1]

Nie widzę tam wyżej export, widzę exit 1, którego u mnie nie ma. Natomiast po
wyeksportowaniu pokazałem niżej, jaki jest rezultat z prawidłową
składnią - nie wiem, zauważyłeś różnicę?

~:  [ "${COKOLWIEKTEST+X}" = "X" ] && echo set  || echo unset
~:  [ "${COKOLWIEKTEST:+X}" = "X" ] && echo set  || echo unset

A może rozwinę tu bardziej przyczynę:

zsh:
$  unset A; echo $A ${A+1} ${A:+2}

$  export A; echo $A ${A+1} ${A:+2}
1
$  export A=; echo $A ${A+1} ${A:+2}
1

bash:
$  unset A; echo $A ${A+1} ${A:+2}

$  export A; echo $A ${A+1} ${A:+2}

$  export A=; echo $A ${A+1} ${A:+2}
1

pdksh:
$  unset A; echo $A ${A+1} ${A:+2}

$  export A; echo $A ${A+1} ${A:+2}

$  export A=; echo $A ${A+1} ${A:+2}
1

I z dokumentacji do zsh:

export [ NAME[=VALUE] ... ]
[...] If a parameter specified does not already exist, it is created in the global scope.

[1] Natomiast tego kawałka brakuje w bash i ksh. Krótko mówiąc - niby sam
coś eksportowałeś, ale tak na prawdę w tych 2 shellach nie robiłeś tego.
Zadałbym tutaj pytanie: "Ok ale co tu niby testujesz? Daj export i wtedy testuj" :>

>> ...cóż to za cudaczna składnia? Wymyślona przez tę samą ekipę, która
>> stosuje test ==?
> 
> Portable składnia,

OK, nie o to mi chodziło, ale też to ja akurat źle spojrzałem.

> autoconf jej używa od zarania dziejów.

GNU/autocrapów to proszę mi nie dawać za przykład, źle na nie reaguję.

>> ~:  export COKOLWIEKTEST
>> ~:  [ "${COKOLWIEKTEST:+X}" = "X" ] && echo set || echo unset
>> unset
>> 
>> > zsh zachowuje się inaczej niż pdksh, bash
>> 
>> Przy niepoprawnym kodzie ma prawo. Ale szczególnie mnie śmieszy ten
>> test, wymyślony chyba przez GNU/bashów, którzy nigdy nie słyszeli o
>> [ "$COKOLWIEL" ].
> 
> Twój test nie zadziała dla A=. Powie, że nieustawione mimo, że jest ustawione 
> na pusty string.

Dokładnie takie samo znaczenie ma ${var:+..} i jak zrozumiałem z
kontekstu (ustawianie pustego HOME_ETC) to właśnie tego należy unikać.

Tam gdzie faktycznie ma być test samego ustawienia parametru, a nie
możemy korzystać z takiego ${+var} z zsh, to dokumentacja sugeruje
stosowanie składni prependowanej ze względu na możliwe rozwinięcia
operatora (chociaż jak tak sprawdzam to na tym co mam i tak się nie
rozwijają, ale kto tam wie jak się inne shelle zachowują).

-- 
Tomasz Pala <gotar w pld-linux.org>


More information about the pld-devel-pl mailing list