Команда find
полностью отличается в Windows и Unix. В Windows это fgrep
-подобная утилита, отображающая совпадающие строки в файле; на Unix - и на Cygwin - он перечисляет имена файлов, соответствующие некоторым критериям.
Cygwin bash добавляет свои стандартные каталоги к текущему пути, поэтому внутри bash $PATH
обычно /bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS
.
Начать обновление, чтобы предоставить дополнительную информацию
Например, у меня есть много скриптов, которые используют команду gnu find
- например, скрипты для очистки деревьев каталогов, которые не содержат файлов:
purge-empty-dirs.sh
find . -depth -type d -empty | xargs rmdir -p
У меня также есть файл bat, чтобы начать сборку, в которой используется команда find find, которая ищет строки, соответствующие строке (аналогично gnu grep
).
build.bat
...
dir | find "target"
if errorlevel = 1 goto no_target_dir
...
Теперь для работы bash script мне нужно /bin
находиться в пути до c:\windows\system32
. Но для запуска моего bat файла мне нужно c:\windows\system32
находиться в пути до /bin
В общем случае мы можем утверждать, что все файлы bat должны выполняться с исходным окружением, унаследованным bash, а не измененным. Это имеет смысл?
Окончательное обновление
Это как должно быть, но разбивает файлы bat, выполненные из bash. Каков наилучший способ решить эту проблему?
Есть ли способ заставить Cygwin выполнять файлы bat (или даже все исполняемые файлы Windows) с средой, с которой она начиналась? Я думаю о start /i
поведении cmd.exe. Я подумываю написать свою собственную утилиту cygstart
, которая делает это, сохраняя среду (или, по крайней мере, $PATH
) в .bash_profile
/.bashrc
. Имеет ли это смысл?
Любые другие предложения?
Изменить: см. также Запустить новую среду cmd.exe и НЕ наследовать