[gull] Truc et astuces: Bash pipes, inline doc et plus... (was: Fêtons Linux le 7 oct...)

Félix Hauri felix at f-hauri.ch
Mon Oct 10 18:13:01 CEST 2011


On Sat, Oct 08, 2011 at 07:10:18PM +0200, Arnaud wrote:
> 
> * Merci à Félix Hauri pour son cours bash/shell, et ses conseils après
> le cours, bien que j'avais espéré un cours un peu plus avancé.
> Commencer avec la partie de fin aurait été un bon point de départ ;)
:-)

Je comprend ta frustration, mais voilà, ``on'' m'a demandé avec insistance
de rester ``léger'' afin de ne pas effrayer les nouveaux venus! ;-)

Si tu veux du plus ``lourd'', tu peux jetter un oeil à
  http://www.f-hauri.ch/vrac/get_ubuntu.sh

  Il s'agit d'un bash script qui va
   - chercher sur ubuntu.com le nom d'un mirroir et du fichier .iso de
       la dernière version (lts ou latest, desktop, server ou alternate
       et 32 ou 64 bits, à choix).
   - récupère le .iso (possibilité d'interropre le transfert, reprise au 
       point d'arrêt),
   - le confine sous le nom juste et corrige sa date de création,
   - le vérifie par sha1sum et enfin
   - vérifie la signature ubuntu du fichier de checksums.
  Le tout avec barres de progression, (possibilité de redimmensionner 
  la fenêtre pendant le transfert), via ncurses et sans l'utilisation
  d'un outils de progression comme ``pv'' ou ``bar''.

Mon but initial était de récupérer la dernière version sans avoir à 
chercher, après il y a eu des discutions à propos de ``pv'' et ``bar'',
puis des demandes concernant les fifos (pipes), j'ai donc étoffé le
script, essentiellement a de fins démonstatives (pour ne par dire 
didactiques).

Pour ce qui est de la différence entre:
$ cat <<eof
$(do
   something)
eof

et
$ cat < <(
  do
    something
)

Le résultat sera à priori le même, car dans le premier cas
le $() sera executé *avant* le cat, et dans le second égallement.

Cependant, la syntaxe ``<<eof'' est très ancienne et l'utilisation
de $() dans un ``inline document'' est peu standard (la syntaxe $()
est d'ailleur nettement plus récente).

Dans les fait, il s'agit d'un ``inline document'' dont une partie est
constituée d'une pseudo-varianble qui est en fait le résultat d'un fork.
A contrario, la seconde syntaxe implique un (seul et unique) fork dont 
le résultat sera transmit en entrée de la commande cat.

En fait, on peut écrire:
$ cat << eof
$(do something)
$(do something else)
eof

Ce qui générera deux forks successifs... A priori une erreur, sauf
situation particulière, ceci n'est pas possible avec la syntaxe '< <()'

Je dois reconnaitre que la nuance n'est pas évidente, elle reste
pourtant importante.

En pratique, il y a toujours plusieurs moyens d'arriver à un résultat,
dans les fait, certains seront plus rationnels et/ou plus efficaces que 
d'autres...

--
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch


More information about the gull mailing list