Je travaille avec la solution de Dragos depuis un certain temps maintenant et je la considère comme la meilleure car elle élimine le besoin d'utiliser "cygpath -u" à l'intérieur de vos scripts shell.
J'ai ensuite voulu avoir des fonctionnalités supplémentaires comme le support du glisser-déposer pour les fichiers .sh et .bash. Après quelques recherches, j'ai écrit un fichier .bat qui associe les fichiers .sh et .bash en tant que "bashscript" et active le gestionnaire de glisser-déposer de l'Explorateur Windows pour eux. J'ai dû modifier la commande de Dragos pour qu'elle gère 1 argument (le chemin de l'élément déposé sur un script shell).
Le fichier .bat ressemble approximativement à ce qui suit :
echo Enregistrement des fichiers .sh et .bash en tant que "bashscript"...
assoc .sh=bashscript
assoc .bash=bashscript
echo.
echo Configuration de la commande d'exécution pour le type de fichier "bashscript"...
ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%%1")")"; bash "$(cygpath -u "%%1")" "$(/argshandler.sh "%%2")"'
echo.
echo Activation de la capacité de glisser-déposer pour les fichiers "bashscript" (seul un élément déposé
echo sera transmis au script, les éléments multiples ne sont pas encore pris en charge)...
reg add HKEY_CLASSES_ROOT\bashscript\shellex\DropHandler /v "" /t REG_SZ /d "{60254CA5-953B-11CF-8C96-00AA00B8708C}" /f
Le script "argshandler.sh" dans la racine de Cygwin renvoie simplement en arrière le premier argument qu'il reçoit et rien du tout s'il n'y en a pas (par exemple, si vous double-cliquez simplement sur un fichier de script) :
#!/bin/bash
if [ ! "$1" == "" ]
then
cygpath -u "$1"
fi
Tout cela fonctionne assez bien jusqu'à présent. Cependant, il reste quelques inconvénients qui seraient bien de résoudre :
- La commande de Dragos et ma dérivée échouent quand il s'agit de scripts situés sur des chemins UNC, par exemple \\myserver\myshare\scriptfile.sh
- Seul un élément déposé sera transmis au script shell.
D'une manière ou d'une autre, en ce qui concerne le problème de l'unique-élément-déposé, changer le script de gestion des arguments pour renvoyer quelque chose comme
"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"
et changer le setter de la commande de Dragos en quelque chose comme
...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")'
(notez que les "" autour de la partie argshandler.sh ont disparu) ne semble pas fonctionner correctement : si certains des éléments glissés sur un script contiennent un espace dans leur chemin, ces chemins seront découpés en plusieurs arguments aux espaces même s'ils sont chacun englobés de guillemets doubles ... étrange.
Y a-t-il des professionnels de la ligne de commande prêts à résoudre l'un ou l'autre de ces problèmes ?