Question

J'aimerais exécuter une longue commande rsync dans Cygwin en double-cliquant sur un fichier .sh dans Windows. Il doit commencer dans le répertoire contenant le fichier (par exemple, / cygdrive / c / scripts /) pour que les chemins relatifs fonctionnent. Quelqu'un a-t-il pu travailler?

Remarque: je viens de trouver ici , un package Cygwin qui gère les menus contextuels de Windows (invite Bash ici). Il pourrait avoir des indices.

Était-ce utile?

La solution

Ok, j'ai trouvé quelque chose qui fonctionne. Associer un fichier batch comme suggéré par Vladimir n'a pas fonctionné, mais les arguments bash étaient la clé.

Short and sweet: associer à cette commande: "C: \ cygwin \ bin \ bash.exe" -li "% 1" % *

Version longue si vous ne savez pas comment:

  1. Dans l'Explorateur, accédez à Outils / Options des dossiers / Types de fichiers.
  2. J'avais déjà une entrée SH pour le script Bash. Si vous n'en avez pas, cliquez sur Nouveau et entrez " SH " pour en créer un.
  3. L'extension SH étant sélectionnée, cliquez sur Avancé.
  4. Choisissez le " ouvrir " action et cliquez sur Editer (ou créez l'action).
  5. C'est la commande à utiliser: "C: \ cygwin \ bin \ bash.exe" -li "% 1" % * . Notez que sans -li , la commande " n'a pas été trouvée " sur mes scripts.

Vous pouvez également ajouter SH à votre variable d'environnement PATHEXT :

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

Merci pour votre aide, les gars!

Autres conseils

Voici ma solution. Cela fonctionne bien pour mes scripts * .sh peu importe où ils se trouvent dans la hiérarchie des répertoires. Notez que je cd au répertoire cygpath avant d'appeler bash sur le cygpath. Cela fonctionne.

assoc .sh=bashscript

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

Je travaille avec la solution de Dragos depuis quelque temps déjà et je la considère comme la meilleure solution, car elle élimine la nécessité d’utiliser "cygpath -u". dans vos scripts de shell.

Je souhaitais ensuite disposer de fonctionnalités supplémentaires, telles que la prise en charge par glisser / déposer des 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 glisser-déposer de l'Explorateur Windows pour eux. Je devais éditer la commande de Dragos pour lui faire gérer un argument (le chemin d'accès à l'élément déposé dans un script shell).

Le fichier .bat se présente comme suit:

echo Registering .sh and .bash files as "bashscript"...
assoc .sh=bashscript
assoc .bash=bashscript
echo.
echo Setting the run command for the file type "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 Activating the drag^&drop capability for "bashscript" files (only 1 dropped item
echo will be passed to the script, multiple items are not supported yet)...
reg add HKEY_CLASSES_ROOT\bashscript\shellex\DropHandler /v "" /t REG_SZ /d "{60254CA5-953B-11CF-8C96-00AA00B8708C}" /f

Le " argshandler.sh " Dans la racine Cygwin, un script reprend simplement le premier argument reçu, et rien du tout s’il n’y en a pas (par exemple, si vous double-cliquez sur un fichier script):

#!/bin/bash
if [ ! "$1" == "" ]
then
    cygpath -u "$1"
fi

Tout cela fonctionne assez bien jusqu'à présent. Cependant, il reste quelques inconvénients à résoudre:

  • La commande de Dragos et sa dérivée échouent lorsqu'il s'agit de scripts situés sur des chemins UNC, par exemple. \\ myserver \ myshare \ scriptfile.sh
  • Un seul élément supprimé sera transmis au script shell.

D'une manière ou d'une autre, en ce qui concerne le problème lié à un élément supprimé, modifier le script du gestionnaire d'arguments pour obtenir quelque chose comme

"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"

et changer le configurateur 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 éléments glissés dans un script contiennent un blanc dans leur chemin, ils seront divisés en plusieurs arguments au niveau des espaces, même si chacun d'entre eux est entouré de guillemets ... bizarre.

Existe-t-il des professionnels de la ligne de commande qui ont le courage de résoudre l'un ou l'autre de ces problèmes?

Ceci n’associe pas les fichiers .sh, mais pourrait vous donner ce que vous voulez. J'ai commencé avec le fichier de commandes cygwin.bat qui lance le shell Cygwin bash et je l'ai modifié comme suit:

$ cat test.bat
@echo off

set MYDIR=C:\scripts

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

C'est un script jouet, mais vous pouvez le modifier pour appeler rsync ou un script shell séparé. J'admets que ce serait plus agréable si MYDIR n'était pas codé en dur. Il y a probablement une façon de l'obtenir pour régler cela automatiquement.

Ah oui, lorsque j'ai créé le fichier .bat dans un shell bash sous Cygwin, j'ai constaté que je devais réellement "chmod + x test.bat". avant que je puisse le lancer avec un double-clic. Je pense que cela définit les autorisations NTFS. Vous n’auriez pas besoin de faire cela si vous venez d’utiliser le bloc-notes.

C’est la commande que j’utilise:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"'

Il l'exécute à la menthe, agrandi, définit le titre de la fenêtre sur le script en cours d'exécution (chemin d'accès Windows), modifie le répertoire dans lequel se trouve le script, l'exécute et reste ouvert après son exécution.

Sinon, le titre sera défini comme le chemin cygwin vers le script:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%1")\007" && cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"'

Scripts par lots pour définir l'association à votre place:

Chemin de Windows dans le titre:

@echo off
assoc .sh=shellscript
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"'
pause

Et le chemin cygwin dans le titre:

@echo off
assoc .sh=shellscript
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%%1")\007" ^&^& cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"'
pause

Vous devriez pouvoir associer des fichiers .sh à \ 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 "<*>"`
    Windows Registry Editor Version 5.00
    ;File:ConfigureShToBeRunUnderExplorer.reg v:1.0 docs at the end
    [HKEY_CLASSES_ROOT\Applications\bash.exe] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell]

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open]

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command]
    @="C:\\cygwin\\bin\\bash.exe -li \"%1\" %*"

    ; This is a simple registry file to automate the execution of sh via cygwin on windows 7, might work on other Windows versions ... not tested 
    ; you could add this setting by issueing the following command: reg import ConfigureShToBeRunUnderExplorer.reg 
    ; Note the path of your bash.exe
    ; Note that you still have to add the .sh to your %PATHTEXT%
            ; usage: double - click the file or reg import file 

Après avoir parcouru différents endroits. Ce que j’ai réussi à faire, c’est d’abord de sélectionner C: \ cygwin64 \ bin \ mintty.exe dans la fenêtre "Ouvrir avec ...". dialogue Puis modifiez la valeur de registre de

[Computer\HKEY_CLASSES_ROOT\Applications\mintty.exe\shell\open\command]

à,

C:\cygwin64\bin\mintty.exe -t "%1" /bin/bash -l -i -c "v1=\"$(cygpath -u \"%0\" -a)\" && v2=\"$(dirname \"$v1\")\" && cd \"$v2\" ; exec bash  \"%1\" %*"  

Une solution efficace consiste à créer un fichier .bat qui ouvrira cygwin et exécutera votre script.

Le script pour exécuter le script go.sh situé dans mon répertoire personnel:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i ./go.sh

Je ne me suis pas dérangé. J'ai associé les fichiers .sh à Crimson Editor (car je passe autant de temps à corriger les bogues qu'à les exécuter). Maintenant, il suffit d’obtenir le bon " ouvrir avec / éditer avec " combinaison pour travailler dans les types de fichiers > avancés. Si je connaissais le code DDE utilisé par Crimson Editor, cela faciliterait les choses; à ce poste, je n'ai pas réussi à le trouver, cependant.

Cela me rappelle ma période Mac (1993-2008) lorsque j’essayais de numériser des applications pour des possibilités de script AppleScript plus rudimentaires.

BZT

J'utilise PuttyCyg (un mastic impressionnant dans la fenêtre Cygwin). Voici comment tout se mettre en place:

Créez un script batch, par exemple. sur ma machine j'ai utilisé

C:\Dev\scripts\cygbashrun.bat

avec contenu

SET CYGWIN=nodosfilewarning
C:\Cygwin\bin\putty.exe -cygterm /bin/bash.exe %1

Évidemment adapter pour contenir les chemins de votre installation de PuttyCyg.

Ensuite, dans l'Explorateur de fichiers Windows, accédez à Outils - Options des dossiers - Types de fichiers

Créez un " .sh " entrée s'il n'y a pas déjà (ou .bash selon ce que vous voulez que vos scripts aient) .. puis Avancé ..

[étape facultative] changez l'icône et sélectionnez l'icône Cygwin dans votre installation

Ensuite:

  1. Nouveau ..
  2. Action = Exécuter Bashscript ..
  3. Application utilisée pour effectuer cette action = C: \ Dev \ scripts \ cygbashrun.bat "quot% 1"

Fonctionne comme un charme pour moi: O)

J'ai développé un script .bat (qui ne provient pas de la réponse d'un autre utilisateur) pour associer un type de fichier (par exemple * .cygwin) à ouvrir avec ce fichier .bat, comme suit:

=== fichier run-script-with-Cygwin-in-same-dir.bat ===

@echo off
REM   Info: A script created by Johnny Wong.  (last modified on 2014-7-15)
REM   It is used to pass a file argument to run a bash script file.  The current directory is setting to the path of the script file for convenience.
REM   Could be copied to C:\cygwin;  and then you manually associate .cygwin file extension to open with this .bat file.
set CYGWIN=nodosfilewarning

C:\cygwin\bin\bash --login -i -c 'cd "`dirname "%~1"`"; exec bash "%~1" %2 %3 %4 %5 %6 %7 %8 %9'

REM finally pause the script (press any key to continue) to keep the window to see result
pause

=== fichier run-script-with-Cygwin-in-same-dir.bat ===

Explications détaillées sur la syntaxe utilisée (si vous êtes intéressé):

  1. % 1 est "..." cité si associé un fichier à ouvrir avec ce .bat. Pour faire glisser un fichier dans ce fichier .bat, il s'agit de "...". cité seulement si le chemin du fichier a des espaces.
  2. % ~ 1 est identique à% 1 avec les guillemets adjacents éliminés s'ils existent
  3. pour supprimer les guillemets autour de% p%, utilisez pour %% a in (% p%) définir p = %% ~ a
  4. vous devez utiliser "% ~ 1" pour forcer le chemin du fichier de script entre guillemets, de sorte que les séparateurs de dossier '\' (dans% 1) ne soient pas supprimés par bash lorsque être traité comme des personnages d'échappement. Sinon, cela ne fonctionnera pas si vous faites glisser un fichier, sans espaces dans son chemin, vers ce fichier .bat.
  5. " exec bash " peut être juste "bash", le premier sert à économiser des ressources pour un processus supplémentaire.

Jouit:)

Regardez les commandes assoc et ftype dans une boîte à dos. Voici un exemple pour .jpg sur ma machine

c:\>assoc .jpg
.jpg=jpegfile

c:\>ftype jpegfile
jpegfile="C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHOTOED.EXE" "%1"

assoc .sh=bashscript

ftype bashscript="c:\cygwin\bin\bash.exe" "%1"

Assurez-vous de changer le chemin d'accès en bash dans la commande ftype afin qu'il corresponde à l'emplacement où vous avez cygwin installé

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top