[gull] Truc et astuces: bash: jouons avec les variables et eval

Jean-Pierre Rupp jpierre at xeno-genesis.com
Sat Nov 5 14:02:28 CET 2011


Bon,

Tu as là quelque chose qui ressemble un peu du obfuscated code.

Peut-être tu pourras quelque chose de plus lisible avec Perl, mas ça ne 
serait pas assez « fun » :-)

Le 05. 11. 11 10:57, Félix Hauri a écrit :
> On Thu, Nov 03, 2011 at 11:01:30PM +0100, Jean-Pierre Rupp wrote:
>> Nice hacks!
> Merci, mais je me disais qu'on *doit* pouvoir faire plus ``simple''...
> (sed est un outil puissant!)
>
>> Le 2 novembre 2011 15:26, Félix Hauri<felix at f-hauri.ch>  a écrit :
>>> $ eval $(
>>>     env LANG=fr_CH date +"$(
>>>         date --help |
>>>             sed -ne '/^  %[^ %]\{1,4\} .*$/{
>>>                 s/^  %\([^ ]*\) .*$/\1/;
>>>                 y|:|_|;
>>>                 p;
>>>                 y|_|:|;
>>>                 p}' |
>>>         xargs printf "DATE_%s=\"%%%s\" "
>>>         )"
>>>     )
>>> ...
>>> $ echo $DATE_{x,X}
>>> 02. 11. 11 15:14:39
> $ eval $(
>      env LANG=fr_CH date +"$(
> 	date --help |
> 	    sed -ne '/^  %[^ %]\{1,4\} .*$/{
>                  s/^ *%\([^ ]*\) .*$/DATE_\1=\"%\1\"/;
> 		:l;
> 		/[^:%]:/{
> 		    s/:/_/;
> 		    tl};
> 		p}'
> 	)"
>      )
> $ echo $DATE_{x,X}
> 05. 11. 11 10:33:40
>
> Au passage, vous aviez bien sûr compris que si ``LANG=C'' au lieu
> de ``LANG=fr_CH'', alors:
> $ echo $DATE_{x,X}
> 11/05/11 10:31:26
> de même que si ``LANG=fr_CH.UTF-8'', alors $DATE_B pourrait donner:
> ``février'', en particulier dans une console en Latin-1:
>
> $ eval $(env LANG=fr_CH.UTF-8 date -d '2000/02/01 12:34:56' +"$(date --help |
>      sed -ne '/^  %[^ %]\{1,4\} .*$/{s/^ *%\([^ ]*\) .*$/DATE_\1=\"%\1\"/;
>               :l;/[^:%]:/{s/:/_/;tl};p}')")
>
> $ echo $DATE_{A,d,B,Y,T}
> mardi 01 février 2000 12:34:56
>
> (Dois-je préciser que j'utilise le charset Latin-1!?)
>



More information about the gull mailing list