Cygwin - run script silenty from “run command”

你说的曾经没有我的故事 提交于 2019-11-27 06:58:12

Try the run.exe command of cygwin. It is a big install, a complete unix environment for your Windows machine. Suppose you installed it at c:\cygwin\.

Open the shell (bash) and type man run.

No mystery, just run c:\cygwin\bin\run.exe <your command here> and you will have your no dos window execution.

You can run it from any DOS window (run cmd.exe from the start menu). You don't need to run it from cygwin.

To make it easier, append C:\cygwin\bin to your %PATH% env var (My Computer → Properties → Advanced → Environment Variables) (Kudos to Felipe Alvarez comment).

Now you can just type

run "C:\foo.bsh"

Here is the man page of the runcommand:

$ 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)
Felipe Alvarez

You can use either...

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

...or...

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

Note: the -l flag tell bash to "act as if it had been directly invoked by login" and use Bash Startup Files. This is important in that it sets your $PATH and other things you rely on when you launch a cygwin terminal. If you don't include -l or --login you will get "command not found" when you try to call anything except of a bash builtin.

The difference between the 2 is like the difference between doing...

bash script_to_interpret.sh

...and...

./executable_script.sh

...in *nix. The former interprets the script using bash. The latter executes the script (only if it has chmod +x executable_script.sh) and interprets it according to its "shebang" line. The latter method is also what you want to do if your executable is not a script at all, like a *nix binary compiled from source.)

It has been bugging me for a while I couldn't find the solution for this, but I finally got the right mix together.

You can simply do the following if you have cygwin on your PATH:
run bash test.js

If cygwin is not on your path, you can do this:
c:\cygwin\bin\run.exe -p /bin bash test.js

If you are looking for more control over the created window (maximize, etc) it looks like you can use cygstart also.

Sources:
- neves answer above (though that wasn't enough by itself for me personally to figure it out)
- http://cygwin.com/ml/cygwin/2008-09/msg00156.html

As the terminal can't close while your script is still running, try the command:

"nohup C:\foo.bsh; exit" 

This way your script will be backgrounded and detached from the terminal, and it should exit quickly so the terminal goes away. I think that the window may still 'flash' with this approach, but the results should be better than what you're getting.

I'm running Cygwin64 and the xwin server link points to:

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

This creates an icon AND a notification on the taskbar. I don't like that. The icon is rather useless, the notification has all your menu options from .XWinrc.

So... I wrote a .vbs script to silently run this command and make the icon go away:

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

Another imperfect possibility is to run the script via a shortcut and set the shortcut's Run option to "minimized".

Go to the directory where you have installed cygwin(on my machine it is c:/cygwin64/bin) Once there simply type "bash.exe"

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!