ft (#zsh@freenode) vient de me faire découvrir le + de la commande exec.
Ma joie est telle que je tiens à vous la faire partager.
pour ceux qui découvrent find:
http://wooledge.org:8000/UsingFind
Résumé des épisodes précédents:
find -zupercriter -exec rm '{} \;
c’est lent parceque ca exec autant de rm qu’il y a de fichiers. Même problème pour la boucle.
est tout sauf fiable.
Après avoir cherché avec mon ami sp3ce, j’utilise
find -zupercriter -print0 | xargs -0
depuis des années.
mais ft++ me dit que les
respectant POSIX ont un xargs
inside. Il suffit d’ajouter + après les arguments du exec.
ce petit plus a mis très longtemps à arriver dans le find du bovin lourd
et lent et tarde à venir a nous maintenant que GNU find est compatible
POSIX.
GNU find a aussi une option -execdir. Pas POSIX mais fort pratique.
un truc que je trouve enervant dans sqlite est qu’il ne propose pas de readline_name, il n’est alors pas possible de faire des ajouts conditionnels dans son .inputrc
du genre:
$if sqlite
$include sql_abbr
$endif
je viens d’envoyer ce patch pour src/shell.c sur la liste dev.
38a39,43
> void initialize_readline(void) {
> rl_readline_name = "sqlite";
> rl_attempted_completion_function = NULL;
> rl_basic_word_break_characters = "\t\n@$><=;|&{( ";
> }
2070a2076
> initialize_readline();
En attendant que ca arrive dans debian:
apt-get source sqlite
cd **/src
patch shell.c monpatch
cd ..
dpkg-buildpackage -rfakeroot -us -uc
cd ..
dpkg -i *deb
et voilà
Cowsay est un utilitaire exceptionnel, qui permet de générer des messages à la manière d’un personnage de bande dessinée s’exprimant dans une bulle :
exemple :
$ cowsay hello
_______
< hello >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||--WWW |
|| ||
Mais cowsay peut faire bien plus :
$ cowsay hello | ssh user@serveur "cat | wall"
N’est-ce pas une magnifique méthode de faire des annonces à ses utilisateurs en ajoutant une touche de bonne humeur ?
Si vous n’êtes toujours pas convaincus, sachez que cowsay fournit des templates pour remplacer
la vache par d’autres animaux plus…exotiques.
Pour voir tous les animaux :
for template in /usr/share/cowsay/cows/*.cow ; do echo $template ; cowsay -f $template ; done | less
Dernières infos : c’est codé en Perl, et Debian fournit des paquets.
Problème : Je suis root. Je veux contrôler le screen d’un utilisateur qui n’a pas explicitement autorisé le multiuser.
Solution :
[list]
[*] Je repère le screen de mon utilisateur :
~# ls /var/run/screen/S-monuser
pid.pts-1.machine
[*]et je le récupère :
~# sudo -u monuser screen -x pid.pts-1.machine
Cannot open your terminal '/dev/pts/0' - please check.
[*]Arg, il faut que j’ajoute les droits nécessaires à mon tty :
~# chmod go+rw /dev/pts/0
~# sudo -u monuser screen -x pid.pts-1.machine
Voilà !
[*]Et on oublie pas de remettre les droits appropriés quand on a terminé :
[/list]
Voilà, si quelqu’un connaît une méthode plus propre…
Parfois avant de commiter du code sur un depot subversion, je me retrouve avec des fichiers temporaires. Pour les supprimer rapidement, j’utilise cette commande :
for I in $(svn status|awk '$1 == "?" { print $2 }'); do rm -rf $I; done
C'est assez bourrin, et ça ne pardonne pas si on a oublier de versioner un fichier
lsof permet de visualiser les fichiers ouverts (par qui? pourquoi? comment?).
Les sockets ayant un FD au même titre que les fichiers du FS, il est possible
de visualiser les connexions en cours. c’est un beau melange de ps, netstat et
d’autres … en mieux:
Le root voit des choses:
> echo `lsof -i |wc -l` `sudo lsof -i |wc -l`
7 19
exemple: afficher les fichiers ouverts par la commande squid (
)
sur le domaine Internet (
).
ne fonctionne pas comme nous l’attendons: il sélectionne l’un ou l’autre.
le et logique s’écrit (
)
Nous voulons ensuite recupérer les infos sans avoir a deduire les colonnes
(
) et ne garder que les infos relatives au domaine internet
(
).
De ces données relatives au domaine internet, seul l’état nous intéresse:
(
). Nous obtenons donc:
Voilà une petite fonction qui affiche uniquement les PIDs des processus en
écoute sur le domaine Internet:
# use the lsof's -F output to show PIDs that are listening
# on a internet port.
lsof_listening_pids () {
sed -n '
# when a line starts with p,
# store the rest of the line (the PID in fact)
# in the hold space
/^p/ {
s/^p//
h
}
# when the line is
/^TST=LISTEN$/ {
# so call the PID back to the pattern space
# and print it
g
p
}
'
sudo lsof -csquid -ai -FT -Ts |
lsof_listening_pids
maintenant j’ai confiance !
je donne souvent cet exercice en cours de C: affichez une table de vignere a l’écran.
en zsh:
# creer un tableau de a a z
a=({a-z})
# repeter autant de fois qu'il y a d'element dans le tableau
repeat $#a {
# afficher le tableau
print $a;
# le premier devient le dernier
a+=$a[1];
# je supprime l'ancien premier
a[1]=()
}
oui … c’est vrai, perl a shift, unshift, pop et push …
mais en zsh on a la meme en utilisant les sous-tableaux:
a=( this is a )
# pop
a[-1]=()
# push
a[-1]=( $a[-1] test )
# shift
a[1]=()
# unshift
a[1]=( yeah, $a[1] )
Il m’arrive souvent d’écrire dans mon shell des lignes qui feraient de bons exos pratiques. Je ne les note jamais … Mais tout ca va changer … je vais m’améliorer .. je commence a blogger les CS pour code snippets.
soit une liste de fichiers et de repertoires (exemple: le resultat d’une commande dpkg -L ) , je veux en extraire les commandes.
Les commandes sont des fichiers ( -f ), ils sont executables ( -x ) et le nom de la commande est le basename du chemin ( $F[-1] si le separateur par defaut est ‘/’ ( -F/ -a )).
au final :
dpkg -L iproute |
perl -F/ -lane '-f && -x && print $F[-1]'
sous debian, ssh-agent utiliise dbus et on s’habitue vite au confort de ne devoir tapper son mdp une seule fois par jour. Sous windows, c’est idem lorsqu’on lance puuty-agent au demarrage de la session.
sous les autres os, il faut faire ca a la mimine. en attendant mieux, voilà de quoi donner a manger a .profile, .zshenv et .xsession:
# does $SSH_AGENT_PID exists and is it
# correctly set ?
# use it as boolean ...
# exemple: ssh_agent_right_pid && echo ok
# tested: dash, zsh
ssh_agent_right_pid () {
# if pid exists, there are 2 lines
# so the second read returns 0
local a b
[ -n "$SSH_AGENT_PID" ] &&
ps -p $SSH_AGENT_PID | {
read a
read b
}
}
# if ssh-agent command is available on the system
# tries to launch and load a key
# in .xsession, source it before exec yourwm
if which ssh-agent > /dev/null; then
ssh_agent_right_pid || source ~/.today_agent > /dev/null
ssh_agent_right_pid || {
ssh-agent > ~/.today_agent
source ~/.today_agent > /dev/null
# open it in a term if you use this script in your .xesssion
ssh-add
}
ssh_agent_right_pid || {
echo « can’t launch agent » >&2
false
}
fi