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