web-dev-qa-db-fra.com

Cygwin - exécuter le script en mode silencieux à partir de "exécuter la commande"

J'ai un script qui permet de dire:

C:\foo.bsh

Je veux pouvoir exécuter cette commande via la commande windows run:

Start -> Run
Windows Key + R

et tapez quelque chose de petit comme 'foo' et appuyez sur retour.

Cependant, je ne veux pas qu'une invite cmd soit visible. Ce script effectue un prétraitement pour un IDE. Je ne veux pas que l'invite cmd soit ouverte pendant la durée de vie du processus IDE.

J'ai essayé:

1) Création d'un fichier bat avec le contenu suivant:

c:\cygwin\bin\bash --login "C:\foo.bsh" (this fails because it keeps a cmd open)

2) Conversion du fichier bat ci-dessus en un exe en utilisant bat_2_exe_converter (ne rend pas le cmd silencieux)

pensées?

EDIT: La solution jusqu'à présent suggère quelque chose à taper à partir d'un shell cygwin réel. J'essaie d'obtenir une solution plus rapide en ayant quelque chose de court que je peux taper dans la commande d'exécution de Windows. Également Nohup command; exit ne tue pas automatiquement la boîte - cependant je peux la tuer manuellement sans tuer le processus IDE. La commande run accepte les raccourcis (.lnk's), bat's, exe's).

35
Russ

Essayez la commande run.exe de cygwin . C'est une grosse installation, un environnement Unix complet pour votre machine Windows. Supposons que vous l'ayez installé à c:\cygwin\.

Ouvrez le shell (bash) et tapez man run.

Pas de mystère, lancez simplement c:\cygwin\bin\run.exe <your command here> et vous obtiendrez votre exécution sans fenêtre.

Vous pouvez l'exécuter à partir de n'importe quelle fenêtre DOS (exécutez cmd.exe dans le menu Démarrer). Vous n'avez pas besoin de l'exécuter à partir de cygwin.

Pour vous faciliter la tâche, ajoutez C:\cygwin\bin à votre% PATH% env var (Poste de travail → Propriétés → Avancé → Variables d'environnement) (bravo à Felipe Alvarez commentaire).

Maintenant, vous pouvez simplement taper

run "C:\foo.bsh"

Voici la page de manuel de la commande run:

$ man run
RUN(1)                             run 1.3.0                            RUN(1)

NAME
       run - start programs with hidden console window

SYNOPSIS
       run [ -p path ] command [ -wait ] arguments

       runcommand [ -p path ] [ -wait ] arguments

DESCRIPTION
       Windows  programs  are  either  GUI  programs or console programs. When
       started console  programs  will  either  attach  to an existing console
       or  create a new one. GUI programs can  never attach to an exiting con‐
       sole. There is no way to attach to an existing console but hide  it  if
       started as GUI program.

       run  will  do this for you. It works  as intermediate and starts a pro‐
       gram but makes the console window hidden.

       With -p path you can add path to the PATH environment variable.

       Issuing -wait as first program  argument will make run wait for program
       completition, otherwise it returns immediately.

       The  second  variant  is  for   creating wrappers. If the executable is
       named runcommand (eg runemacs), run will try  to start the program  (eg
       emacs).

EXAMPLES
       run -p /usr/X11R6/bin xterm

       run emacs -wait
       runemacs -wait

       run make -wait

AUTHORS
       Charles S. Wilson

       Harold L Hunt II

       Jehan Bing

       Alexander Gottwald

Version 1.3.0                    November 2005                          RUN(1)
38
neves

Vous pouvez utiliser soit ...

c:\cygwin\bin\bash -l /path/to/script_to_interpret.sh

...ou...

c:\cygwin\bin\bash -l -c /path/to/executable_script.sh

Remarque: le -l flag indique à bash "d'agir comme s'il avait été directement invoqué par la connexion" et d'utiliser Bash Startup Files . Ceci est important car il définit votre $ PATH et d'autres éléments sur lesquels vous comptez lorsque vous lancez un terminal cygwin. Si vous n'incluez pas -l ou --login vous obtiendrez "commande introuvable" lorsque vous essayez d'appeler quoi que ce soit, à l'exception d'une commande bash intégrée.

La différence entre les 2 est comme la différence entre faire ...

bash script_to_interpret.sh

...et...

./executable_script.sh

... dans * nix. Le premier interprète le script en utilisant bash. Ce dernier exécute le script (uniquement s'il a chmod +x executable_script.sh) et l'interprète selon sa ligne "Shebang" . Cette dernière méthode est également ce que vous voulez faire si votre exécutable n'est pas du tout un script, comme un binaire * nix compilé à partir de la source.)

17
Felipe Alvarez

Cela me dérange depuis un moment, je n'ai pas trouvé la solution pour cela, mais j'ai finalement trouvé le bon mélange.

Vous pouvez simplement faire ce qui suit si vous avez cygwin sur votre CHEMIN:
run bash test.js

Si cygwin n'est pas sur votre chemin, vous pouvez le faire:
c:\cygwin\bin\run.exe -p /bin bash test.js

Si vous recherchez plus de contrôle sur la fenêtre créée (maximiser, etc.), il semble que vous pouvez également utiliser cygstart.

Sources:
- neves répond plus haut (bien que cela ne soit pas suffisant en soi pour que je puisse le comprendre)
- http://cygwin.com/ml/cygwin/2008-09/msg00156.html

10
studgeek

Comme le terminal ne peut pas se fermer pendant que votre script est toujours en cours d'exécution, essayez la commande:

"Nohup C:\foo.bsh; exit" 

De cette façon, votre script sera mis en arrière-plan et détaché du terminal, et il devrait se fermer rapidement pour que le terminal disparaisse. Je pense que la fenêtre peut toujours "clignoter" avec cette approche, mais les résultats devraient être meilleurs que ce que vous obtenez.

4
Dana the Sane

J'exécute Cygwin64 et le lien du serveur xwin pointe vers:

C:\cygwin64\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe

Cela crée une icône ET une notification sur la barre des tâches. Je n'aime pas ça. L'icône est plutôt inutile, la notification a toutes vos options de menu de .XWinrc.

Alors ... j'ai écrit un script .vbs pour exécuter silencieusement cette commande et faire disparaître l'icône:

Set objShell = CreateObject("WScript.Shell")
objShell.Run("C:\cygwin64\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe"), 0
3
brlinton

Une autre possibilité imparfaite consiste à exécuter le script via un raccourci et à définir l'option Exécuter du raccourci sur "minimisé".

2
anon

Allez dans le répertoire où vous avez installé cygwin (sur ma machine c'est c:/cygwin64/bin) Une fois là simplement tapez "bash.exe"

0
Serge_k