Cygwin - запустить скрипт без вывода сообщений из "команды запуска"
У меня есть сценарий, скажем:
C:\foo.bsh
Я хочу иметь возможность выполнить эту команду с помощью команды Windows Run:
Start -> Run
Windows Key + R
и наберите что-нибудь маленькое, например "foo", и нажмите "return".
Однако я не хочу, чтобы приглашение cmd было видно. Этот скрипт выполняет некоторую предварительную обработку для IDE. Я не хочу, чтобы приглашение cmd было открыто на время существования процесса IDE.
Я пытался:
1) Создание bat-файла со следующим содержимым:
c:\cygwin\bin\bash --login "C:\foo.bsh" (this fails because it keeps a cmd open)
2) Преобразование вышеуказанного файла bat в исполняемый файл с помощью bat_2_exe_converter (не делает cmd молчать)
мысли?
РЕДАКТИРОВАТЬ: Решение до сих пор предлагает что-то набрать из реальной оболочки Cygwin. Я пытаюсь получить более быстрое решение, имея что-то короткое, что я могу набрать в команде запуска Windows. Так же nohup command; exit
не убивает автоматически окно - однако я могу убить его вручную, не убивая процесс IDE. Команда run принимает ярлыки (.lnk), bat, exe's.
7 ответов
Попробуйте команду run.exe в cygwin. Это большая установка, полная среда Unix для вашего компьютера с Windows. Предположим, вы установили его на c:\cygwin\
,
Откройте оболочку (bash) и введите man run
,
Никаких загадок, просто беги c:\cygwin\bin\run.exe <your command here>
и у вас будет исполнение без окна.
Вы можете запустить его из любого окна DOS (запустите cmd.exe из меню "Пуск"). Вам не нужно запускать его из Cygwin.
Чтобы было проще, добавьте C:\cygwin\bin
на ваш%PATH% env var (Мой компьютер → Свойства → Дополнительно → Переменные среды) (слава Фелипе Альваресу).
Теперь вы можете просто набрать
run "C:\foo.bsh"
Вот справочная страница команды 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)
Вы можете использовать либо...
c:\cygwin\bin\bash -l /path/to/script_to_interpret.sh
...или же...
c:\cygwin\bin\bash -l -c /path/to/executable_script.sh
Примечание: -l
флаг говорит bash "действовать так, как если бы он был напрямую вызван при входе в систему" и использовать файлы запуска Bash. Это важно, потому что он устанавливает ваш $PATH и другие вещи, на которые вы полагаетесь при запуске терминала cygwin. Если вы не включите -l
или же --login
вы получите "команду не найдена", когда попытаетесь вызвать что-либо, кроме встроенного в bash.
Разница между двумя похожа на разницу между выполнением...
bash script_to_interpret.sh
...а также...
./executable_script.sh
... в *nix. Первый интерпретирует скрипт, используя bash. Последний выполняет сценарий (только если он chmod +x executable_script.sh
) и интерпретирует его в соответствии с линией "Шебанг". Последний метод - это то, что вы хотите сделать, если ваш исполняемый файл вообще не является скриптом, как двоичный файл *nix, скомпилированный из исходного кода.)
Некоторое время меня это беспокоило, я не мог найти решение для этого, но я, наконец, собрал правильное сочетание.
Вы можете просто сделать следующее, если у вас есть cygwin в вашей PATH:run bash test.js
Если Cygwin не на вашем пути, вы можете сделать это:c:\cygwin\bin\run.exe -p /bin bash test.js
Если вы ищете больший контроль над созданным окном (развернуть и т. Д.), Похоже, вы можете использовать cygstart
также.
Источники:
- ответ выше neves (хотя это было само по себе недостаточно, чтобы я лично понял это)
- http://cygwin.com/ml/cygwin/2008-09/msg00156.html
Поскольку терминал не может закрыться, пока ваш скрипт еще работает, попробуйте команду:
"nohup C:\foo.bsh; exit"
Таким образом, ваш сценарий будет заземлен и отделен от терминала, и он должен быстро выйти, чтобы терминал ушел. Я думаю, что при таком подходе окно все еще может "мигать", но результаты должны быть лучше, чем то, что вы получаете.
Я использую Cygwin64 и ссылка на сервер xwin указывает на:
C: \ cygwin64 \ bin \ run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe
Это создает значок и уведомление на панели задач. Мне это не нравится Значок довольно бесполезный, в уведомлении есть все ваши пункты меню из.XWinrc.
Итак... Я написал сценарий.vbs, чтобы выполнить эту команду без вывода сообщений и убрать иконку:
Set objShell = CreateObject("WScript.Shell")
objShell.Run("C:\cygwin64\bin\run.exe /usr/bin/bash.exe -l -c /usr/bin/startxwin.exe"), 0
Еще одна несовершенная возможность - запустить скрипт с помощью ярлыка и установить для параметра "Запуск" ярлыка значение "свернутый".
Перейдите в каталог, где вы установили Cygwin(на моей машине это c:/cygwin64/bin). Просто введите "bash.exe".