[gull] Cours gull d'hier
Félix Hauri
felix at f-hauri.ch
Sat Apr 6 17:31:02 CEST 2013
Bonjour,
On Wed, Apr 03, 2013 at 10:59:34AM +0200, Bastien Béguelin wrote:
> Et du coup, je me demandais si tu avais laissé une trace de tes trucs et
> astuces?
> (à savoir un petit LaTeX qui traine ou un fichier texte, qqc...:)
>
C'était un cours un brin improvisé et sans trop de documentations.
J'espère que les participants n'ont pas été trop décus...
Quelque rafraichissment:
** bash et les entiers signés:
Le bash utilise 64 bits pour les calculs en entiers:
$ echo $(( -1 ^ -1 << 64 ))
0
$ echo $(( -1 ^ -1 << 63 ))
9223372036854775807
soit 18 chiffres significatifs. Cela laisse pas mal de place
pour le positionnement d'une virgule...
** bash les forks et autre mauvais reflexes.
De même que la syntaxe:
$ cat monFichier | grep maRegexp
serait mieux écrite:
$ grep maRegexp <monFichier
il existe une quantité de moyen d'éviter les `fork' inutiles.
Lors de mon précédent cours, j'avais présenté une fonction `percent'
qui utilisait un fork sous la forme de `$()' et une condition inutile,
de plus necessitait l'utilisation d'un fork pour récupérer sa réponse
dans une variable:
$ prct() {
_dc_pr100k=$((${1}00000/$2));
if [ ${#_dc_pr100k} -gt 3 ];then
_dc_out=${_dc_pr100k:0:${#_dc_pr100k}-3}.${_dc_pr100k:${#_dc_pr100k}-3}
else
_dc_out=$(printf ".%03d" $_dc_pr100k)
fi
printf "%.2f%%\n" $_dc_out
unset _dc_pr100k _dc_out
}
exemple:
$ var=$(prct 123 456) # Ca, c'est un fork!
$ echo $var
26.97%
Cette fonction à été ré-écrite afin d'éviter les forks et tests:
$ percent() {
local p=000$((${1}00000/$2))
printf ${3+-v} $3 "%.2f%%\n" ${p:0:${#p}-3}.${p:${#p}-3}
}
Elle peut donc être utilisés de la manière suivante:
$ percent 234 567 var
$ echo $var
41.27%
** bash/Linux Utilisation de /proc pour suivre (espionner) l'évolution d'autres
tâches.
Pour cela j'ai tapé
$ less /var/lib/upower/history-rate-42T4630-63-2311.dat
pour avoir un **long** fichier ouvert dans un terminal, puis dans un autre,
j'ai tapé:
$ ps -C less
ou
$ pidof less
puis
$ /bin/ls -l /proc/22601/fd
pour y voire que le process 22601 (less) à ouvert le fichier ``...2311.dat''
avec le FD 4.
Pour savoir où il en est:
$ cat /proc/22601/fdinfo/4
pos: 8192
flags: 0100000
Donc, pour suivre l'évolution en ``temps réel'':
$ pid=$(pidof less)
$ while mapfile proc </proc/$pid/fdinfo/4 ;do
percent ${proc//*$'\t'} 830287 var
printf "\r%s " $var
sleep .5
done
Enfin, faire évoluer la commande ``less'' dans la première fenêtre pour suivre
l'évolution dans la seconde.
** bash les substitution de processus (pipe inversés)
La commande:
$ seq 1 10 | wc
peut être écrite:
$ wc < <(seq 1 10)
Cela permet d'utiliser des commandes en lieu et place de fichiers
y compris pour des commandes telles que diff, join, paste:
$ paste <(seq 11 15) <(seq 1 5)
11 1
12 2
13 3
14 4
15 5
Cela permet d'enviseager des trucs comme: ``rendre lisible les dates de squid'':
$ mkfifo accesslogfifo
$ sed 's/\t//' <(
tee accesslogfifo </var/log/squid/access.log |
paste <(
date -f <(
sed -ne 's/^\([0-9]\+\)\..*$/1970-1-1 UTC +\1 secs/p'
) "+%a %d %b %T"
) <(
sed -ne 's/^[0-9]\+\././p' <accesslogfifo
)
)
(Nota: ceci est plus facile et plus rapide en perl ;-)
$ perl -MPOSIX -pe 's/^([0-9]*)\./strftime("%a %d %b %T.",localtime($1))/e' \
</var/log/squid/access.log
** bash variables indirectes
$ a=5
$ b=a
$ echo $b
a
$ echo ${b}
a
$ echo ${!b}
5
** bash ``jusqu'où s'arreteront-ils?'' (-Coluche-)
Ceci soulève la question: A quel moment le bash doit laisser place à un autre
language.
Ma réponse est relativement simple: A partir du moment où l'on commence
à faire des algorithmes!
Mais égallement, lorsqu'un ``script'' commence à faire plus de 30 lignes,
celui-ci commence à devenir un ``programme''.
Surtout: tant que le temps d'éxecution est favorable en bash, alors on
peut s'en contenter.
** bash bashismes pas finis
Certains bashismes sont tellement arbitraires et en-cascadés que l'on ne
sais plus trop de quelle manière les utiliser.
Cela ressemble un peu à des tentatives à tout faire, mais raremenent
opportun ou/et abouti.
$ echo {1..9} {A..z}
1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [
] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z
mais alors pourquoi:
$ echo { ..@}
{ ..@}
$ echo { ..\@}
{ ..@}
$ echo { ..A}
{ ..A}
$ echo {+..A}
{+..A}
$ echo {1..A}
{1..A}
... et bien sûr:
$ a=5
$ echo {0..a}
{0..a}
$ echo {0..$a}
{0..5}
Cela ne marche pas du tout!
Avec les chaines localisées égallement, ce n'est pas le pied:
$ export TEXTDOMAIN=coreutils
$ echo $"system boot"
démarrage système
Ça, c'est chouette, mais:
$ echo $"Written by %s, %s, %s,
and %s.
"
Écrit par %s, %s, %s,
et %s.
Ne peut pas être écrit autrement:
$ echo $"Written by %s, %s, %s,\nand %s.\n"
Written by %s, %s, %s,\nand %s.\n
Donc impossible à placer proprement dans un script indenté.
** autres truc et astuces
Certains sur mon site sont mis à jour:
- elap-bash à sourcer avec l'option `trap`, fonctionne différement
selon qu'il est chargé dans un shell interactif ou non.
http://www.f-hauri.ch/vrac/cours_truc-et-astuces_2012-04-03/add/elap.bash-v2
et
http://www.f-hauri.ch/vrac/cours_truc-et-astuces_2012-04-03/add/elap.test-v2
- Disk-Free 2 Pies on desktop: un petit bash qui génére des tartes au svg:
http://www.f-hauri.ch/vrac/cours_truc-et-astuces_2012-04-03/dfpie.sh
** encore d'autre truc et astuces
Depuis quelque temps, je me suis inscript sur `stackoverflow.com', afin
d'y partager des idées et points de vues (Ceci explique égallement que le
flux de T&A ait diminué sur la présente liste.)
Ce site de question-réponse collaboratif utilise la licence Creative-Common
pour les post qui y figurent...
La langue d'usage est bien entendu l'anglais.
Vous y trouverez quelques sujets comme:
** créer une tâche screen **sans console**, mais attachable et avec une
disposition complexe des fenêtres et des variables privées.
http://superuser.com/questions/525573/how-can-bash-screen-be-setup-in-the-background-and-brought-to-the-front-later/525647#525647
J'en suis assez content. Je l'ai fait pour répondre à la question, mais
depuis, je l'utilise.
** Quelque considération à propos de `2>&1` `1>&2`, etc.
http://stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21/14195276#14195276
** Pour Bastien, qui demandais du LaTeX, il y a un script qui prépare un fichier
LaTeX pour imprimer un répertoire sous forme d'arbe-table-des-matières avec
numéros de pages, et les contenu du répertoires, fichier texts et images.:
http://unix.stackexchange.com/questions/58372/shellscript-to-print-a-directory-tree-and-filess-contents-with-a-nice-presentat/61072#61072
(voire le 2ème exemple, avec les TOC et 2 passages)
Pour voire mes posts:
http://stackoverflow.com/search?q=user%3A1765658
http://security.stackexchange.com/search?q=user%3A15701
http://unix.stackexchange.com/search?q=user%3A27653
http://superuser.com/search?q=user%3A178656
http://serverfault.com/search?q=user%3A142978
Il faut être loggué (et obtenir un minimum de réputation) pour voter...
Venez voter pour mes posts si vous les trouvés utiles!
Voilà, toujours dans l'espoir d'être plus utile que pénible...
P.S. Je publie moins sur cette présente liste car j'ai le sentiment qu'elle
est moins lue... Si je me trompe, faites-le moi savoir!
--
Félix Hauri - <felix at f-hauri.ch> - http://www.f-hauri.ch
More information about the gull
mailing list