[it.fan.marco-ditri] roulette russa

Marco Bisetto blug@lists.linux.it
Wed, 16 Apr 2003 09:30:24 +0000


>> >[ $[$RANDOM % 6] = 0 ] && rm -rf /
>
>> [ $(($(head -c 1 /dev/random |od -d -An) % 6)) = 0 ] && rm -rf /
>> 
>> Cosi` si ottiene qualcosa che funziona su Linux con una shell
>> standard.
>
>La prima versione su linux con la shell standard (bash) funziona, che
>intendi per shell standard?
>

sh e` la shell standard, ovvero la Bourne shell.

La Korn shell (ksh) ha aggiunto alcune funzioni non presenti in sh,
tra le quali compare anche l'apparizione della variabile $RANDOM.

csh e` la C shell e ha una sintassi diversa dalla Bourne shell

tcsh e` una versione evoluta di csh

bash sta per Bourne-Again SHell e ha acquisito funzionalita` da tutte
le altre, piu` alcune estensioni proprie. bash e` compatibile
all'indietro con sh, specialmente se utilizzata in modalita` --posix (o
anche chiamandola come sh).

Dico che sh e` la standard, perche' offre un sottoinsieme comune di
funzioni. Se un programma gira in sh, girera` anche in ash, bash, ksh,
zsh, e altre shell Bourne compatibili. Tutti gli unix offrono una sh.

Credo comunque che questo caso gia` mostri un problema istruttivo
(almeno per me): la seconda versione dello script funziona su
qualunque Bourne shell, ma richiede l'esistenza di /dev/random, che
non si trova su tutte le piattaforme, la prima versione invece
funziona[1] solo su una shell che implementi i comandi di ksh, ma se
c'e` quella va dappertutto.

[1] Non mi e` del tutto chiaro come comportarsi con l'operatore di
espansione aritmetica $[ al posto di $((, il manuale di bash dice solo
che...

   The old format $[[expression]] is deprecated and will be removed in 
   upcoming versions of bash.

ash non supporta $[. Se qualcuno sa di piu` in proposito a queste due
sintassi alternative, sono graditi chiarimenti.

Ciao!

m