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
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.
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.