2017-02-01 2 views
1

Ну идея идет как следует,Run «./» Баш/пакетный файл с Cygwin

У меня есть файл Баш для Linux, то я, очевидно, запустить его, сделав ./my_run. Проблема в том, что я в Windows, поэтому я загрузил и установил cygwin. Я добавил cygwin bin в Enviromental Variables и проверю, что по крайней мере «ls» работает, поэтому я догадался, что сделал это хорошо. Когда я пытаюсь запустить его с CMD он показывает:

'.' is not recognized as an internal or external command, 
operable program or batch file. 

Как будто Cygwin переменные не были установлены правильно (как я сказал, что я пытался Лс работы). Затем я попробовал это прямо с cygwin и, когда делаю ./my_run, я получил его, чтобы работать правильно.

Так как же я могу использовать некоторые команды, такие как ls, но при выполнении ./ это не работает на cmd? Как я могу это исправить?

+2

Не могли бы вы разместить содержание сценария? – chrootzius

+0

Извините, скрипт теперь работает, дело в том, когда я перешел на my_run.bat, а затем я вернулся к my_run, файл был «поврежден», поэтому у меня были проблемы. При загрузке исходного файла снова из git он начал работать, но ТОЛЬКО на cygwin. Теперь я просто хочу, почему это не работает на cmd. PS: спасибо! это был быстрый ответ –

+2

Вау, вопрос, который _actually_ нуждается в обоих байтах и ​​тегах пакетного файла. Тем не менее, эти два языка совершенно разные, и вам нужно либо преобразовать новые строки Windows в новые строки Unix (любой подходящий текстовый редактор имеет этот параметр), либо полностью переписать сценарий в пакетном режиме. – SomethingDark

ответ

2

Ну, cygwin - это только общая библиотека и множество материалов (программ), использующих ее (см. Cygwin doc). cygwin.dll изменяет разрешение внутренней линии / символов, чтобы вы могли сказать ./my_script и преобразовывали его в .\my_script перед выполнением фактического вызова Windows, а также добавили правильное расширение для исполняемых файлов, чтобы он мог выполнять двоичные файлы Windows. Эта магия сохраняется до тех пор, пока вы ее используете. cmd.exe - это командная оболочка Microsoft Windows, которая полностью не знает об общей библиотеке Cygwin и по этой причине не использует ее, поэтому она не будет называть ее для перевода маршрута, даже если вы заполняете среду zetabytes. Когда вы запустите на терминале Cygwin, вы используете оболочку bash, которая является исполняемым файлом Cygwin, связанная с cygwin.dll. Ему удается использовать библиотеку Cygwin для всех эмуляций системных вызовов unix, поэтому, когда вы передаете их, например, до exec("./my_script", ...);, он внутренне преобразует это, чтобы попробовать ./my_script, затем .\my_script, ./my_script.exe, ... и то же самое для .com и .bat.

Этот факт часто заставляет некоторых людей сказать, что Cygwin не является хорошей, эффективной средой. Но цель заключалась не в том, чтобы быть эффективной (и это, поскольку она кэширует записи и делает все возможное, чтобы быть эффективными), но чтобы быть совместимыми.

В вашем примере ls является исполняемым файлом Cygwin, который имитирует исполняемый файл /bin/ls из систем unix. Он использует библиотеку Cygwin, поэтому все разрешения пути будут правильно выполнены (ну, при некоторых ограничениях, как вы увидите после некоторого тестирования), и все будет работать нормально. Но вы не можете притворяться, что все ваши приложения Windows внезапно трансформируются и начинают работать так, как если бы они находились в другой среде. Для этого требуется некоторый подход к попыткам и ошибкам, которые вы должны попробовать самостоятельно. И прочитайте документацию Cygwin, это очень хорошо и охватывает все, что я сказал здесь.

0

Если вы откроете Cygwin и запустите команду там, вы должны быть в порядке.

+0

, но почему cmd не работает? Я имею в виду ... Если есть странная причина, почему добавление переменных env не должно работать? ... если так ... как может быть, что я использую ls? –

+1

'. /' Не является переменной среды. Это относится к вашему текущему каталогу. Он работает, когда вы вводите 'bash my_file' в cmd? – PinkFluffyUnicorn

+0

Он работает с bash my_file !!! Большое спасибо! –