49 votes

Comment puis-je associer les fichiers .sh à Cygwin ?

Je voudrais exécuter une longue commande rsync dans Cygwin en double-cliquant sur un fichier .sh dans Windows. Il doit démarrer dans le répertoire contenant le fichier (par exemple /cygdrive/c/scripts/) afin que les chemins relatifs fonctionnent. Quelqu'un a réussi à faire fonctionner cela ?

Note : Je viens de trouver ici, un paquet Cygwin qui gère les menus contextuels de Windows (Bash Prompt Here). Cela pourrait donner des pistes.

42voto

Jerph Points 2401

D'accord, j'ai trouvé quelque chose qui fonctionne. Associer un fichier de commandes comme l'a suggéré Vladimir n'a pas fonctionné, mais les arguments bash étaient essentiels.

En résumé : associez avec cette commande : "C:\cygwin\bin\bash.exe" -li "%1" %*

Version longue si vous ne savez pas comment faire :

  1. Dans l'Explorateur, allez dans Outils/Options des dossiers/Types de fichiers.
  2. J'avais déjà une entrée SH pour Script Bash. Si vous n'en avez pas, cliquez sur Nouveau et entrez "SH" pour en créer une.
  3. Avec l'extension SH sélectionnée, cliquez sur Avancé.
  4. Choisissez l'action "ouvrir" et cliquez sur éditer (ou créez l'action).
  5. Voici la commande à utiliser : "C:\cygwin\bin\bash.exe" -li "%1" %*. Notez qu'avec le -li, il renvoyait "commande introuvable" sur mes scripts.

Vous voudrez peut-être ajouter SH à votre variable d'environnement PATHEXT :

Touche Windows+Pause / Avancé / Variables d'environnement / Variables système / PATHEXT

Merci pour votre aide, les gars !

0 votes

Si vos scripts ne nécessitent pas d'interaction avec la console, vous pouvez les exécuter complètement sans fenêtre en utilisant run.exe de cygwin. Il suffit de changer la commande en C:\cygwin\bin\run.exe" bash -li "%1" %*

13 votes

Est-ce que quelqu'un sait comment faire cela sous Windows 7 ? L'option "Types de fichiers" semble manquante.

0 votes

Y a-t-il un moyen de le lancer dans la console de Cygwin plutôt que dans la console ridicule de MS, afin de pouvoir copier et coller correctement ?

16voto

Dean Toader Points 2228

Voici ma solution. Elle fonctionne bien pour mes scripts *.sh, peu importe où ils se trouvent dans la hiérarchie des répertoires. Notez que je me déplace dans le répertoire cygpath avant d'appeler bash sur le cygpath. Ça marche simplement.

assoc .sh=bashscript

ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%1")")"; bash "$(cygpath -u "%1")"'

0 votes

Je pense que c'est une bonne réponse, mais je n'ai ni assoc ni ftpye dans mon chemin. Dois-je le faire à partir d'une invite DOS?

1 votes

Oui. Dans Win XP, démarrer->exécuter cmd.

1 votes

J'ai un combo de la solution de Dragos de Jerph qui fonctionne assez bien (je lance après l'assoc). Cependant, je reçois un avertissement de chemin MS-DOS et je pense passer à la solution de Dragos. Cependant, il manque le %* à la fin qui (je crois) permet de passer des arguments aux scripts sh. Y a-t-il une raison de ne pas modifier la dernière partie du script de Dragos en : <... ; bash "$(cygpath -u "%1")" %*'> ?

6voto

eomanis Points 61

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 ?

2voto

David Points 344

Cela ne concerne pas les fichiers .sh, mais cela pourrait vous aider. J'ai commencé avec le fichier batch cygwin.bat qui lance l'invite de commandes bash Cygwin, et je l'ai modifié comme ceci :

 $ cat test.bat
@echo off

set MYDIR = C:\scripts

C:\cygwin\bin\bash --login -c "cd $MYDIR && echo 'Maintenant dans' `pwd`; sleep 15"

C'est un script jouet mais vous pourriez le modifier pour appeler rsync ou appeler un script shell séparé. J'admets que ce serait mieux s'il n'avait pas MYDIR codé en dur. Il y a probablement un moyen de le configurer automatiquement.

Oh oui, lorsque j'ai créé le fichier .bat dans une invite de commandes bash dans Cygwin, j'ai remarqué que je devais en fait exécuter "chmod +x test.bat" avant de pouvoir le lancer en double-cliquant. Je pense que cela configure les autorisations NTFS. Vous n'auriez pas besoin de le faire si vous utilisez simplement le bloc-notes.

0 votes

Oui, coder en dur le répertoire MYDIR est un peu compliqué car je veux que d'autres membres de l'équipe puissent utiliser le même script. Est-ce que quelqu'un peut le "configurer automatiquement" ? Si c'est le cas, cela semble être la solution. À ce stade, il semble que nous ayons besoin d'expertise en script DOS...

1voto

Sparr Points 5796

Vous devriez pouvoir associer les fichiers .sh avec \CYGWIN\usr\bin\bash.exe. Le script devra changer son propre répertoire de travail, je suggère de coller quelque chose comme ceci en haut :

cd `dirname "$0"`

0 votes

Le $0 est une bonne idée, peut-être, mais cela ne fonctionne pas pour moi. Je reçois une erreur à la ligne 1 : dirname: commande introuvable.

0 votes

Pour que la commande 'dirname' fonctionne, veuillez ajouter le répertoire cygwin\bin au PATH

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X