Lanceurs avec ls et dmenu

Objectif : tout est dit dans le titre.

dmenu est un menu optimisé pour être utilisé au clavier,
il affiche tout ce que l’on peut lui demander d’afficher
ce qui en fait un candidat de choix pour les scripts.

Pour commencer, installez dmenu si vous ne l’avez pas encore.
Paquet dwm-tools ou source,
je prefère les sources, elles sont nécessaires pour l’affichage vertical (patchage oblige)
En plus, c’est un petit programme, ça pourrait être une bonne occasion de commencer
à s’intéresser au code pour un débutant. :wink:

Le petit exemple ci-dessous est appliqué à l’édition de fichier.

Modifiez ce script à votre goût et copiez le dans ~/bin
et ajouter ~/bin à votre path s’il n’y est pas déjà : #!/bin/sh prompt=vim action="urxvt -e vim" index=`ls -A -p | grep -v / | dmenu -i -p "$PWD $prompt:"` [ -z $index ] if [ $? = 1 ]; then $action $index; actions #actions est un autre mini script qui sera vu plus loin fi
“urxvt -e vim” est à remplacer par votre éditeur préféré.

Maintenant quand on le lance, on se retrouve avec un menu listant le répertoire courant,
on selectionne l’item désiré en saisissant n’importe quel chaîne de caractère qui le compose et on appuie sur entrée.
(autant en saisir une qui le différencie des autres pour aller plus vite
(Je dis ça pour ceux qui ne connaissent pas dmenu))

Votre éditeur apparaît avec le fichier selectionné chargé.

J’encourage à détourner ce petit script de son usage.
On peut associer ls et dmenu avec n’importe quel autre programme,
par exemple en modifiant légèrement le script ci-dessus,
on peut avoir un lanceur pour choisir sur quelle page iceweasel va démarrer.
N’hésitez pas à demander si vous voulez en savoir plus.

Un autre pour se déplacer dans l’arborescence du système
dans toutes les directions en un clin d’oeil.

Encore une fois avec ls et dmenu,
il ne liste que les répertoires, je l’ai donc appelé lsd (ça aurait aussi pu être pour la contraction de ls et dmenu)

#!/bin/sh prompt=Liste action=cd index=`ls -d */ -d .*/ -U | dmenu -p "$prompt: $PWD" -i` [ -z $index ] if [ $? = 1 ]; then $action $index && lsd ; else actions fi
Tel quel, il part du répertoire utilisateur si lié à un raccourci clavier
et du répertoire courant si lancé depuis un terminal.
Les trois minis-scripts suivants lui donnent un peu plus de souplesse :

racine :#!/bin/sh cd / && lsd ; actions
home :#!/bin/sh cd ~ && lsd ; actions
parent :#!/bin/sh cd .. && lsd ; actions

Une fois arrivé dans le répertoire désiré, on appuie sur échappe,
ce qui nous fait directement passer au menu “actions”

Le script “actions”, que l’on voit dans tous les autres depuis le début
et qui fait le lien entre les scripts précédents et, comme son nom l’indique, les actions :#!/bin/sh prompt=Lance index=`ls ~/scripts/actions | dmenu -p "$PWD $prompt:"` [ -z $index ] if [ $? = 1 ]; then exec $index& fi

Dans le répertoire ~/scripts/actions,
j’ai mis des liens vers des scripts que j’ai placé dans ~/bin :
Pour commencer, tous les scripts d’au dessus, ( sauf “actions”, je ne vais pas faire un menu qui s’appelle lui-même directement…) plus quelques autres que l’on va voir en dessous.

admin_edite :#!/bin/sh sudo edite; actions avec “edite” qui est le script du premier post de la page.

html :

Comme son nom l’indique,
pour visualiser des fichiers html et consorts
attention pour que ce script fonctionne,
il faut que dmenu soit patché avec ça #!/bin/sh prompt=affiche action=iceweasel index=`ls *.html *.xhtml *.htm | dmenu -i -l 59 -p "$prompt: $PWD/"` [ -z $index ] if [ $? = 1 ]; then $action $index; else actions fi

un autre pour visualiser les docs html,
ii : #!/bin/sh iceweasel index.html&

retouche_image :

#!/bin/sh index=`ls *.png *.jpg *.jpeg *.gif *.bmp *.tiff | dmenu -i -p "gimp: $PWD/"` [ -z $index ] if [ $? = 1 ]; then gimp $index fi

visualise_image :
le même que retouche_image sauf que j’ai remplacé gimp par un visionneur d’image léger.

net :

#!/bin/sh index=`ls ~/scripts/web | dmenu -p "Lance:"` [ -z $index ] if [ $? = 1 ]; then exec $index fiavec dans le répertoire ~/scripts/web, des liens vers des scripts situés
dans ~/bin et de la forme : #!/bin/sh iceweasel www.debian-fr.org/ par exemple.

stream :
comme net, avec ~/scripts/stream à la place de ~/scripts/web et des scripts de la forme

#!/bin/sh urxvt -e streamripper http://radio.freeundergroundtekno.org:8018 -r -d ~/musique/tmp actions

php :

doit être patché comme html pour fonctionner.

#!/bin/sh prompt=affiche action=iceweasel index=`ls *.php | dmenu -i -l 59 -p "$prompt:"` [ -z $index ] if [ $? = 1 ]; then $action http://localhost/$index; else actions fi

playlist :
j’en ai déjà parlé dans un autre fil,
mais bon autant que je le remette avec les autres.
comme html et php, nécessite d’être patché afin de s’aficher verticalement.

#!/bin/sh index=`mpc playlist | dmenu -i -l 59 -p "Joue:" | cut -c 2- - | cut -d")" -f1 -` [ -z $index ] if [ $? = 1 ]; then mpc play $index actions fi.

et bien sûr,
terminal :

#!/bin/sh urxvt; actions

admin :

#!/bin/sh sudo urxvt; actions

et quelques autres plus ou moins utiles mais totalement indispensables…
Tous ces scripts sont minuscules, mais mis ensemble…

Il m’arrive que le script “actions” reprennent la main juste après que j’ai lancé une action,
et monopolise la saisie clavier, il suffit d’appuyer sur échappe
pour redonner l’attention à la tâche en cours.

Tant qu’on y est, ça me ferait plaisir d’avoir le retour de ceux qui testent.

Un autre qui propose un prompt pour des recherches internet,
Ça devrait pouvoir être adapté à tous les moteurs de recherches qui transportent
les termes de la recherche dans l’url.

exemples avec le forum et ethicle :

deb_forum : #!/bin/sh prompt=Cherche_forum_debian-fr action=iceweasel index=`echo | dmenu -p "$prompt:" | sed s/\ /+/g` [ -z $index ] if [ $? = 1 ]; then $action http://forum.debian-fr.org/search.php?keywords=$index&terms=all&author=&sv=0&sc=1&sf=all&sk=t&sd=d&sr=posts&st=0&ch=300&t=0&submit=Rechercher; fi

ethicle : #!/bin/sh prompt=Cherche action=iceweasel index=`echo | dmenu -p "$prompt:" | sed s/\ /+/g` [ -z $index ] if [ $? = 1 ]; then $action http://www.ethicle.com/fr/search.php?q=$index fi

Vous avez vu le principe?
Faîtes une recherche avec un moteur, copiez l’url de la recherche dans le script, repérez ou sont insérés les termes recherchés dans l’url, remplacez les par $index.

On peut alors rassembler des liens vers les scripts de recherches
dans un répertoire et faire un scripts identique à “net” et "stream"
afin d’avoir dmenu qui nous prompte les différents moteurs de recherches.

Dans la série recherche sur internet …
En utilisant l’utilitaire sselp présent dans le paquet dwm-tools
ou dont les sources sont disponibles à ce lien :
http://code.suckless.org/dl/tools/sselp-0.2.tar.gz
dans les scripts de recherches ci-dessus fortement raccourcis,
on peut lancer une recherche directement sur la selection X,
juste selectionner, pas de copier, pas de coller.
exemple avec le forum et ethicle :

selethicle :#!/bin/sh iceweasel http://www.ethicle.com/fr/search.php?q=`sselp | sed s/\ /+/g`

Pour le forum :#!/bin/sh iceweasel http://forum.debian-fr.org/search.php?keywords=`sselp | sed s/\ /+/g`&terms=all&author=&sv=0&sc=1&sf=all&sk=t&sd=d&sr=posts&st=0&ch=300&t=0&submit=Rechercher

manuel :
Un prompt pour consulter les pages de man#!/bin/sh prompt=man action="urxvt -e man" index=`ls /bin /usr/bin /sbin /usr/sbin | dmenu -i -p "$prompt:"` [ -z $index ] if [ $? = 1 ]; then $action $index ; actions fiedite : la version ci-dessus est inutilement longue, voir plus bas
pour quelque chose de plus propre.

Bonsoir!
Je vais encore t’embêter. Je voulais en fait m’inspirer de tes scripts pour avoir dans dmenu une liste des videos présentes dans un dossier sélectionné par défaut, et que lorsque l’on choisir un fichier video, elle soit lancé avec mplayer, et si on sélectionne un dossier, on soit envoyé dedans.
J’ai cependant du mal à comprendre tes scripts.
Donc si desfois tu as du temps pour m’expliquer un peu plus en détail les lignes que tu utilises. PAr exemple le $PWD, je ne sais pas du tout d’où cette variable vient!
Merci.
Je me replonge dans la lecture de la page, des fois que…

j’ai fait un petit truc qui marche, mais j’aimerais bien comprendre tout quand même. Il me manque la possibilité de rentrer dans les dossiers. Ou bien existe-t-il un ls récursif?

[code]#!/bin/sh
prompt=mplayer

cd ~/Videos/
index=ls -p | grep -v / | dmenu -i -p "$PWD $prompt:"
[ -z $index ]
if [ $? = 1 ]; then
mplayer $index;
actions #actions est un autre mini script qui sera vu plus loin
fi[/code]

edit :
Oui, ça se fait avec ls -R, mais ensuite, dmenu n’a pas le chemin entier du fichier. Et là je bloque…

find /chemin/absolu/vers/dossier -type f ??

Bonjour, la variable $PWD, c’est juste pour me reperer quand je circule dans les répertoires, pour avoir le répertoire courant dans le prompt.
Pour ce que demandes pour les videos, j’utiliserais lsd jusqu’à être
dans le bon répertoire et un lanceur pour mplayer accessible depuis le menu actions.[quote=“thuban”]ls -p | grep -v /[/quote] avec cette ligne dans ton script les répertoires ne seront pas listés donc quoi que tu rajoutes dans ton script ce sera difficile de rentrer dans les répertoires. :wink: .

[quote=“eol”]Un prompt pour consulter les pages de man#!/bin/sh prompt=man action="urxvt -e man" index=`ls /bin /usr/bin /sbin /usr/sbin | dmenu -i -p "$prompt:"` [ -z $index ] if [ $? = 1 ]; then $action $index ; actions fi[/quote]

Bon, le script du dessus était un premier jet,
en y repensant, il a moyen de faire beaucoup plus simple : #!/bin/sh exe=`dmenu_path | dmenu ${1+"$@"}` && exec urxvt -e man $exe Cette simple ligne a le même résultat et est beaucoup plus propre.

C’est une simple copie du script dmenu_run, celui qui transforme dmenu en lanceur d’application, où a été intercalé "urxvt -e man"
entre exec et $exe.

Ceux qui se plaignent de ne pas pouvoir lancer d’applis de console directement à partir de dmenu, peuvent eux aussi
fare une copie de dmenu_run et intercaler “urxvt (ou votre émulateur de terminal préféré) -e” entre exec et $exe
et utiliser dmenu_run d’origine pour les applis graphiques et le dmenu_run modifié pour les applis consoles.

Bonjour, je vous propose de patcher dmenu pour rendre les scripts du dessus plus efficaces.
pour obtenir les dernières sources : $ wget http://dl.suckless.org/tools/dmenu-4.0.tar.gzDécompression des sources : $ tar -xzf dmenu-4.0.tar.gzJe n’ai pas réussi à joindre le patch, je vais donc le coller ci-dessous :[code]— a/config.h 2009-04-18 13:50:04.000000000 +0200
+++ b/config.h 2009-09-26 18:50:22.000000000 +0200
@@ -1,9 +1,9 @@
/* See LICENSE file for copyright and license details. */

/* appearance /
-static const char font = "--terminus-medium-r-normal-
-14-------";
-static const char normbgcolor = “#cccccc”;
-static const char normfgcolor = “#000000”;
-static const char selbgcolor = “#0066ff”;
+static const char font = "-misc-fixed-medium-r--
-14-
-
-
----";
+static const char *normbgcolor = “#000000”;
+static const char *normfgcolor = “#00ff00”;
+static const char *selbgcolor = “darkgreen”;
static const char selfgcolor = “#ffffff”;
static unsigned int spaceitem = 30; /
px between menu items */
— a/dmenu.c 2009-04-18 13:50:04.000000000 +0200
+++ b/dmenu.c 2009-09-26 18:50:58.000000000 +0200
@@ -69,6 +69,8 @@ static int textw(const char text);
/
variables */
static char *maxname = NULL;
static char *prompt = NULL;
+static Bool autoconfirm = False;
+static Bool flautoconfirm = False;
static char text[4096];
static int cmdw = 0;
static int promptw = 0;
@@ -514,6 +516,18 @@ match(char *pattern) {
}
curr = prev = next = sel = item;
calcoffsets();
+

  • if(autoconfirm && item && !item->right) {
  •   fprintf(stdout, "%s", item->text);
    
  •   fflush(stdout);
    
  •   running=False;	
    
  • }
  • if(flautoconfirm && item && item==itemend) {
  •   fprintf(stdout, "%s", item->text);
    
  •   fflush(stdout);
    
  •   running=False;
    
  • }
    }

void
@@ -674,6 +688,10 @@ main(int argc, char *argv[]) {
fstrncmp = strncasecmp;
fstrstr = cistrstr;
}

  •   else if(!strcmp(argv[i], "-a"))
    
  •   	autoconfirm = True;
    
  •   else if(!strcmp(argv[i], "-fl"))
    
  •   	flautoconfirm = True;
      else if(!strcmp(argv[i], "-b"))
      	topbar = False;
      else if(!strcmp(argv[i], "-fn")) {
    

— a/dmenu.1 2009-04-18 13:50:04.000000000 +0200
+++ b/dmenu.1 2009-09-26 18:50:49.000000000 +0200
@@ -5,6 +5,8 @@ dmenu - dynamic menu
.B dmenu
.RB [ -i ]
.RB [ -b ]
+.RB [ -a ]
+.RB [ -fl]
.RB [ -fn " "]
.RB [ -nb " "]
.RB [ -nf " "]
@@ -26,6 +28,14 @@ makes dmenu match menu entries case inse
.B -b
defines that dmenu appears at the bottom.
.TP
+.B -a
+makes dmenu autoconfirm, useful on recursive script.
+.TP
+.B -fl
+similar to -a but doesn’t care of substring,
+you have to type from first letter to match.
+Decrease the number of item faster on non-similar-begin item list.
+.TP
.B -fn
defines the font.
.TP[/code]Maintenant, qu’est-ce que fait ce patch?

Comme on peut s’y attendre d’après le nom, il permet à dmenu d’autoconfirmer nos choix,
il rajoute deux options à dmenu, une police par défaut qui affiche correctement les accents et
les couleurs que j’ai sur le mien. :slightly_smiling:
pour activer l’autoconfirmation, rajouter -a ou -fl dans les scripts en option à dmenu,

-a fonctionne comme dmenu le fait normalement et ne rajoute que l’autoconfirmation,
on peut sélectionner les items depuis le début ou à partir d’une sous chaîne.

-fl fonctionne presque comme -a à part qu’il désactive la recherche dans les sous-chaînes,
il faut donc taper à partir de la première lettre, mais dans une liste
où les éléments ne commencent pas par les mêmes lettres,
cette option réduit les possibilités beaucoup plus vite
que le fonctionnement traditionnel de dmenu.

À vous de choisir l’option qui convient le mieux selon vos listes.
Quelqu’un qui parle bien anglais pourrait-il regarder le man, surtout l’expression avec “non-similar-begin”,
je voyais pas comment formuler ça autrement mais ça m’a l’air bancal.
Merci à Donald Chai qui m’a bien aidé. :smiley: (Ben oui, je suis totalement débutant en programmation).

Coucou eol!
Je me suis remis à tous tes jolis scripts. Cependant je rencontre un souci (eh oui encore :slightly_smiling: ). Bon, je m’explique, j’ai copié la plupart des scripts comme expliqué dans un dossier, et je les ai aussi copié dans /usr/bin .
Bref, je teste le script retouche_image, mais j’ai droit à une erreur :

[xavier@Lothlorien Images]$ retouche_image 
ls: ne peut accéder *.png: Aucun fichier ou dossier de ce type
ls: ne peut accéder *.jpeg: Aucun fichier ou dossier de ce type
ls: ne peut accéder *.gif: Aucun fichier ou dossier de ce type
ls: ne peut accéder *.bmp: Aucun fichier ou dossier de ce type
ls: ne peut accéder *.tiff: Aucun fichier ou dossier de ce type
/usr/bin/retouche_image: line 5:   : commande introuvable

Je ne comprend pas très bien, la ligne 5 est la suivante :
gimp $index

où me suis-je trompé?

ps : je me demandais s’il n’était pas possible de faire 1 seul script qui s’appellerait “lanceur”, et éxécuterait une action en fonction de l’extension de fichier? bon, quand j’aurais réussi à fait marcher tes scripts déja, je m’y mettrai.

[quote=“thuban”]Coucou eol!
Je me suis remis à tous tes jolis scripts. Cependant je rencontre un souci (eh oui encore :slightly_smiling: ). Bon, je m’explique, j’ai copié la plupart des scripts comme expliqué dans un dossier, et je les ai aussi copié dans /usr/bin .
Bref, je teste le script retouche_image, mais j’ai droit à une erreur :

[xavier@Lothlorien Images]$ retouche_image 
ls: ne peut accéder *.png: Aucun fichier ou dossier de ce type
ls: ne peut accéder *.jpeg: Aucun fichier ou dossier de ce type
ls: ne peut accéder *.gif: Aucun fichier ou dossier de ce type
ls: ne peut accéder *.bmp: Aucun fichier ou dossier de ce type
ls: ne peut accéder *.tiff: Aucun fichier ou dossier de ce type
/usr/bin/retouche_image: line 5:   : commande introuvable

Je ne comprend pas très bien, la ligne 5 est la suivante :
gimp $index

où me suis-je trompé?[/quote]Aucune idée, je viens de vérifier, le mien est exactement le même que celui de cette page et je n’ai pas ton erreur finale à l’execution.
L’as tu testé dans un répertoire où se trouve des images? :mrgreen:
Il est plus utile dans ce cas.
Sinon, à tout hasard, as tu installé gimp et si oui, est-il bien dans ton path? :mrgreen:

[quote=“thuban”]ps : je me demandais s’il n’était pas possible de faire 1 seul script qui s’appellerait “lanceur”, et éxécuterait une action en fonction de l’extension de fichier? bon, quand j’aurais réussi à fait marcher tes scripts déja, je m’y mettrai.[/quote]Puisque tu est sur Archlinux, cherche donc “dmen file manager” sur le forum approprié, je suis sûr que tu trouveras quelquechose qui t’intéresse. :wink:
Pour ma part, je préfère en avoir plein de petits, accessibles depuis un script parent, qui listent chacun un ou quelques types d’extension particulier, ça enlève du listage tous ceux qui ne m’intéresse pas à un moment précis.

ben je ne vois pas où je me suis planté. je vais continuer de chercher de mon côté, en tout cas ça ne vient sûrement pas de ton script.
J’ai testé dans un répertoir où il y a des images, elles apparaissent bien dans le dmenu.
J’ai essayé d’enlever le “$index”, c’est la même erreur, donc je ne sais pas d’où ça vient. J’ai bien gimp d’installé pourtant. J’ai même remplacé par le chemin complet, i.e /usr/bin/gimp, mais j’ai la même erreur.
Ceci dit, j’ai ce message d’erreur pour tous les petits scripts, pas seulement pour gimp. J’ai encore du rater quelque chose dans la compréhension des scripts.
bon sang, ce que je me sens boulet parfois… il faut que j’aille faire un tour sur ubuntu-fr (humour!) .

[quote=“thuban”]ben je ne vois pas où je me suis planté. je vais continuer de chercher de mon côté, en tout cas ça ne vient sûrement pas de ton script.
J’ai testé dans un répertoir où il y a des images, elles apparaissent bien dans le dmenu.
J’ai essayé d’enlever le “$index”, c’est la même erreur, donc je ne sais pas d’où ça vient. J’ai bien gimp d’installé pourtant. J’ai même remplacé par le chemin complet, i.e /usr/bin/gimp, mais j’ai la même erreur.
Ceci dit, j’ai ce message d’erreur pour tous les petits scripts, pas seulement pour gimp. J’ai encore du rater quelque chose dans la compréhension des scripts.
bon sang, ce que je me sens boulet parfois… il faut que j’aille faire un tour sur ubuntu-fr (humour!) .[/quote]commande introuvable c’est ce que le shell dit quand j’essaie par exemple une commande qui requiert des droits que j’ai oublié de m’octroyer.x@eol:~$ ifconfig bash: ifconfig: command not foundSinon, simplifie les scripts, la condition n’est peut-être pas vraiment nécessaire, on pourrait tranformer #!/bin/sh index=`ls *.png *.jpg *.JPG *.jpeg *.gif *.bmp *.tiff | dmenu -i` [ -z $index ] if [ $? = 1 ]; then gimp $index fien#!/bin/sh exec gimp `ls *.png *.jpg *.JPG *.jpeg *.gif *.bmp *.tiff | dmenu -i` || exit 0

ça fonctionne avec le script simplifié! mais je ne comprend pas pourquoi ça ne passait pas avant. Il n’y a aucune commande dont je n’aurais pas les droits. Et puis les test pourraient être pratiques tout de même.
Enfin je voudrais simplement comprendre, et là, je ne vois pas. Parce que au final, à part les tests, c’est exactement la même commande qui est exécutée, sauf que au départ on passe par la “variable” index.

[quote=“thuban”]ça fonctionne avec le script simplifié! mais je ne comprend pas pourquoi ça ne passait pas avant. Il n’y a aucune commande dont je n’aurais pas les droits. Et puis les test pourraient être pratiques tout de même.
Enfin je voudrais simplement comprendre, et là, je ne vois pas. Parce que au final, à part les tests, c’est exactement la même commande qui est exécutée, sauf que au départ on passe par la “variable” index.[/quote]Peut-être un problème de copier/coller?
À moins que tu utilises un shell exotique qui n’apprécie pas ma syntaxe?

je crois avoir trouvé. Il n’aimais pas le petit espace qui s’intégrait lors du copier coller devant la commande.
Je vais rééditer tout ça dès que possible!

tout fonctionne vraiment bien désormais. La seule chose que je trouve dommage, c’est d’être obligé de créer un lien des scripts dans /usr/bin. Je trouve ça pas super propre. Mais bon, tout ça peut s’arranger plus ou moins je pense.
En fait, j’ai mis le script actions dans un dossier, puis tous les autres dans un sous dossier. Ils sont tous liés sauf le action (j’ai modifié le chemin vers action dans chaque petit script pour que ça fonctionne).
Dans action, on liste les fichiers dispos dans le sous dossier, puis on éxécute leur nom. ne serait-il pas possible de récupérer avec ls le chemin complet des fichiers? j’ai cherché les options mais rien de tel. Enfin, ça se bidouille dans le script sinon, en indiquant directement le chemin à la main.

[quote=“thuban”]tout fonctionne vraiment bien désormais. La seule chose que je trouve dommage, c’est d’être obligé de créer un lien des scripts dans /usr/bin. Je trouve ça pas super propre. Mais bon, tout ça peut s’arranger plus ou moins je pense. [/quote]Si tu ne veux pas faire de lien ou de copie, tu peux rajouter le répertoire contenant les scripts à ton PATH.

[quote=“thuban”]Dans action, on liste les fichiers dispos dans le sous dossier, puis on éxécute leur nom. ne serait-il pas possible de récupérer avec ls le chemin complet des fichiers? j’ai cherché les options mais rien de tel. Enfin, ça se bidouille dans le script sinon, en indiquant directement le chemin à la main.[/quote]Si tu écris le nom des fichiers $PWD/fichier, tu as le chemin complet.

c’est vrai que c’est aussi simple. Mais si je lance les scripts à partir du home, le $PWD ne donnera pas le chemin voulu. Finalement j’ai préféré écrire dans chaque script le chemin complet de actions et autres.
Après les partiels, je pense que je ferais un “lanceur” universel pour tous types de fichiers.
Il faut aussi que je rajoute un script pour ouvrir le dossier dans thunar.

Merci pour toutes ces merveilles eol!

ps : pour veux qui voudrait utiliser les scripts, éditez ce que vous aurez copié collé avec vim, vous verrez peut-être un signe bizarre devant une ligne, qui ne se voit pas forcément avec un éditeur graphique. Il faut le supprimer pour que le script s’exécute.

Est-ce que pour toi aussi,lorsque tes noms de fichiers contiennent des espace ça ne passe pas? ça peut sans doute s’arranger avec un coup de sed, mais je ne sais pas encore faire.
Peut-être un patch à dmenu arrange ça?