Créer un fichier batch pour lancer cygwin et exécuter une commande spécifique

Je veux créer un fichier batch qui démarre cygwin et exécute une commande spécifique (la commande consiste à lire un fichier bash et à exécuter des commandes à l’intérieur).

C’est le fichier batch que j’ai développé, il fonctionne dans une certaine mesure. le terminal cygwin s’ouvre et tente de lire le fichier bash, mais ne peut pas exécuter les commandes à l’intérieur:

@ECHO OFF C:\cygwin64\bin\mintty.exe -li /cygdrive/c/(path-to-bash-file-location)/(MyBashFile) PAUSE 

Comment puis-je faire ce travail?

Depuis votre fichier de commandes, lancez le shell bash de Cygwin et utilisez l’indicateur de connexion. Cela fournit une base pour définir des variables de chemin d’access et d’environnement via vos fichiers .bash_profile ou .bashrc . Je crois que cela peut être la source de vos difficultés.

 @ echo off C:\cygwin64\bin\bash --login -c "cd ~/path/to/desired; ./mybashfile.sh" 

Si vous fournissez plus de détails sur la nature de votre fichier bash, je peux être plus précis. Bonne chance.

La réponse utile de Pasortingck Kelly souligne que le fait de ne pas exécuter bash tant que shell de connexion dans Cygwin peut être la source du problème.

En effet: exécutez toujours Cygwin bash comme un shell de connexion , car les initialisations cruciales n’auront pas lieu autrement ; Notamment, la variable $PATH ne contiendra pas /usr/local/bin:/usr/bin et les parameters régionaux ne seront pas définis correctement.

Pour que bash démarre un shell de connexion , l’ exécutable bash doit passer l’option -l (ou son alias plus long, --login ).

  • Pour exécuter votre script:

    • Dans la fenêtre de la console actuelle , voir la réponse de Pasortingck .

      • Notez que si le script cible ne s’appuie pas sur un répertoire de travail particulier, l’utilisation de -c avec des commandes séparées de cd et d’exécution n’est pas ssortingctement nécessaire. quelque chose comme ce qui suit fera:

         C:\cygwin64\bin\bash -lc:\path\to\your\script 
    • dans mintty.exe , l’application de terminal fournie par Cygwin (comme vous l’avez essayé):

       C:\cygwin64\bin\mintty /bin/bash -lc:\path\to\your\script 
      • Notez que l’exécution de mintty partir d’une invite de commandes ou d’un fichier de commandes ouvre invariablement une nouvelle fenêtre de console et le fait de manière asynchrone .

Notez comment un chemin de style Windows peut (alternativement) être utilisé pour spécifier le script cible (ce qui signifie que vous auriez pu utiliser c:\cygwin64\bin\bash au lieu de /bin/bash ).

Plus important encore, notez comment une référence explicite à l’exécutable bash est requirejse dans les deux cas, ce qui contraste avec ce que vous avez essayé :


Les options que vous transmettez à mintty.exe sont spécifiques – elles ne sont pas transmises à bash . Plus précisément, les options de mintty.exe que vous utilisez sont (voir toutes en exécutant mintty --help ):

  • -l, --log FILE|- … Consigne la sortie dans un fichier ou stdout
  • -i, --icon FILE[,IX] … Charger l’icône de la fenêtre à partir du fichier, éventuellement avec l’index

Par conséquent, -li crée un fichier journal nommé i dans le répertoire en cours, car i est interprété comme le l d’option de l, et non comme une option séparée i .

Le script spécifié ( /cygdrive/c/... ) s’exécute quand même, mais surtout, pas dans un shell de connexion .

Ce que vous vouliez faire nécessite un appel explicite à l’exécutable bash , comme démontré ci-dessus, afin que les options soient interprétées par Bash :

 C:\cygwin64\bin\mintty /bin/bash -li c:\path\to\your\script 

En outre, comme indiqué, l’exécution de mintty.exe partir d’un fichier de commandes crée invariablement une nouvelle fenêtre de console et le fait de manière asynchrone , c’est-à-dire que la commande ne pas.

De toute évidence, tout ce qui sort dans cette nouvelle fenêtre ne sera pas visible dans la fenêtre d’origine.


Lecture facultative: interaction avec une fenêtre mintty.exe :

Avertissement : mintty.exe s’exécute de manière asynchrone même si vous utilisez l’approche habituelle de start /wait partir d’un fichier de commandes; en d’autres mintty.exe , la tentative suivante de bloquer un fichier de commandes / une invite de commande jusqu’à mintty.exe que mintty.exe termine ne fonctionne pas :

 start /wait "" "c:\cygwin64\bin\mintty" # !! DOES NOT WORK - still asynchronous 

Lorsqu’un script / commande est passé, la session Bash créée par mintty.exe fermera invariablement à la fin du script , car bash – même quand il est passé -i pour indiquer une session interactive – se fermera automatiquement dans ce cas.

Si tout ce dont vous avez besoin est d’ inspecter la sortie après la fin du script , exécutez:

 c:\cygwin64\bin\mintty -h always /bin/bash -l /cygdrive/c/path/to/bash-script 

Notez qu’aucun shell n’est exécuté dans cette fenêtre une fois le script terminé, vous ne pouvez donc qu’inspecter la sortie du script – rien de plus.

Pour garder un shell ouvert , vous avez besoin d’une solution de contournement :

 c:\cygwin64\bin\mintty /bin/bash -lc "/cygdrive/c/path/to/bash-script; exec /bin/bash" 

Notez que cela crée une nouvelle instance de shell après la fermeture du script.