Make e 2 не удается найти указанный файл
Я использую make-файл в Windows для отправки некоторых файлов на сервер Unix (здесь текстовый файл «blob.txt» в той же папке, что и мой make-файл). Мой скрипт makefile:
Я запускаю командную строку, захожу в папку, где находятся blob.txt и makefile, и набираю:
Работает. Мне правда интересно, почему.
Проверьте значение PATH (или эквивалентное) при запуске из make и при запуске вручную. Бьюсь об заклад, они отличаются включением пути к pscp .
Это только начало происходить и со мной. Процесс make больше не может «видеть» определенные файлы в моей системе. Я установил GNU make с Chocolatey, и он работал безотказно в течение многих лет. Сегодня вдруг такие файлы, как bash.exe и wsl.exe, скрыты от процесса make.
Почти наверняка жалуется, что Windows не может найти pscp .
Это почти наверняка связано с тем, что значение %PATH% (или что-то еще) отличается, когда make порождает оболочку/консоль, чем когда вы открываете ее вручную.
Сравните значения, чтобы убедиться в этом. Затем либо используйте полный путь к pscp в рецепте make-файла, либо убедитесь, что значение PATH установлено правильно для использования make .
Arf прошу прощения, но на самом деле это не решает ошибку. Я создал команду @echo $(PATH) в моем make-файле, и она содержит путь к папке, где лежит pscp.
@echo $(PATH) расширяет значение переменной make PATH . Вместо этого попробуйте использовать переменную пути оболочки. @echo $$PATH или @echo %PATH% или что-то еще.
Я знаю, что это старый вопрос, на который был дан ответ, но я подумал, что и мой опыт для тех, кто все еще сталкивается с этим. Я получал ту же загадочную ошибку полковника Бовеля (хотя с командой Windows MOVE, а не с pscp):
Наш CI запускал тот же Makefile и работал отлично. Оказывается, CI использовал mingw32-make, а я использовал GNU make. Удаление GNU make (который был установлен как часть несвязанного массового пакета) и псевдоним mingw32-make для make работает отлично.
Я не хотел удалять папку bin GIT из переменной PATH (я использую машину с Windows), так как использую ее довольно часто. Итак, я искал обходной путь, и вот он:
Также добавьте каталог /usr/bin в переменную PATH. Это в основном добавляет в вашу среду остальные linux-подобные команды, которые поставляются с «GIT bash». После применения этого мои make-файлы снова заработали нормально. :)
Если вам интересно, какую оболочку вызывает make, просто добавьте $(info $(SHELL)) в начало make-файла. Путь/имя вызываемой оболочки выводится на консоль, как только вы запускаете make.
Я знаю, что очень опаздываю на вечеринку, но я должен сказать, что ответ Рикардо Алехоса в дополнение к ответу Этана Рейснера - отличное решение, если не лучшее решение здесь. Это связано с тем, что если вы используете bash.exe или какую-либо версию bash через git, вам действительно следует хранить все эти программы (по крайней мере, bin) в переменной среды PATH. Я не потерял никакой функциональности ни с одним из вещей, которые я делаю между Mac, Linux (дистрибутив Debian) и Windows 10.
В моем случае у меня был git\bin в моем %PATH% , который содержит bash.exe и sh.exe.
Удаление %GIT_HOME%\bin из PATH сработало для меня.
Решение @ user3869623 работает для меня. Я хотел бы поделиться некоторыми моими подробностями, чтобы завершить картину.
Мой makefile содержит следующую цель:
Когда я запускаю make clean , я вижу эту ошибку:
Поскольку он говорит, что что-то пошло не так с echo , поэтому я меняю цель make-файла на следующую:
На этот раз make clean выдает мне эту ошибку:
Я удивлен, увидев bash здесь, так как я работаю в командной строке Windows.
Затем я проверил свой %PATH% , я вижу эту запись:
В этом пути есть bash.exe и sh.exe . Поэтому я удалил эту запись, и теперь она работает нормально.
НО Я ДО СИХ ПОР НЕ ПОНИМАЮ, ПОЧЕМУ БЭШ ЗАНИМАЕТСЯ ЭТИМ.
10 Answers 10
is almost certainly complaining that Windows cannot find pscp .
This is almost certainly because the value of %PATH% (or whatever) is different when make spawns a shell/console then when you have it open manually.
Compare the values to confirm that. Then either use the full path to pscp in the makefile recipe or ensure that the value of PATH is set correctly for make 's usage.
arf I am sorry but actually it does not solve the error . I created a command @echo $(PATH) in my makefile and it contains the path of the folder where pscp lies .
@echo $(PATH) is expanding the value of the make PATH variable. Try using the shell path variable instead. @echo $$PATH or @echo %PATH% or whatever.
I know this is an old question that has been answered, but thought I'd and my experiences for anyone still running into this. I was getting the same cryptic error Colonel Beauvel (though with the windows MOVE command, not pscp):
Our CI was running the same Makefile and working perfectly. Turns out CI was using mingw32-make and I was using GNU make. Uninstalling GNU make (which got installed as part of an unrelated bulk package) and aliasing mingw32-make to 'make' works perfectly.
I didn't want to remove GIT's bin folder from the PATH variable (I am using a Windows machine), as I use it quite often. So I looked for a workaround, and here it is:
Add the /usr/bin directory to your PATH variable too. This basically adds the rest of the linux-like commands that come with the "GIT bash" to your environment. After applying this, my makefiles ran normally again. :)
If you are curious about what shell is being invoked by make, just add $(info $(SHELL)) at the beginning of your makefile. The path/name of the shell being invoked is printed to the console as soon as you run make.
I've got a docker-compose.yaml file that looks like this:
And my Makefile looks like this
When I run this from the GitBash command line:
I get the following output
docker-compose run terraform init
process_begin: CreateProcess(NULL, docker-compose run terraform init, . ) failed.
make (e=2): The system cannot find the file specified.
make: *** [init] Error 2
I've seen other posts relating to this, and understand this to be a problem with the values on my PATH environment variable, however I'm not sure how to correct the problem.
Please let me know if I can provide any more information
Update
I have confirmed that:
- docker-compose is installed
- the docker-compose.exe exists on my PATH environment variable (see below)
My PATH environment variable:
Update 2
If I modify the makefile so it explicitly states the path to the docker-compose.exe file, it works:
Update 3 - Solution
So my full Makefile actually looked like this:
Running make .env creates a .env file , which included a PATH env var
Deleting the PATH line from this file solve it for me :)
Your screen shot seems to imply that it's installed at C:\ProgramData\DockerDesktop\version-bin\docker-compose.exe - can you confirm that this is indeed the case? (Really ProgramData not Program Files ?) What happens if you use the full path in the Makefile ? (Your Makefile would not happen to override PATH in a part you are not showing?)
@tripleee, yes, if i explicitly state the path to docker-compose.exe (which is in the location stated in the screenshot), it works. Will update the question
So does your Makefile muck with PATH ? Or does it get lost somehow (what happens if you add echo "$$PATH" on a separate tab-indented line after init: )?
ДОБАВИТЬ 1
Что касается того, почему C:\DevTools\Git\bin появляется в моем %PATH% , потому что я использую Sublime, и он всегда запрашивает у меня двоичные файлы Git:
2 ответа
Если ваш Makefile каким-то образом манипулирует переменной PATH , так что каталог, в котором установлен docker-compose , больше не находится в нем, это может вызвать симптомы такого рода.
Для устранения неполадок попробуйте добавить
(с отступом на вкладке, конечно) непосредственно перед ошибочной командой, и проверьте, подтверждает ли результат ваши ожидания.
(В этом контексте знак доллара необходимо удвоить, чтобы передать буквальный знак доллара из make в базовую оболочку.)
Это означает, что docker-compose не найден при выполнении docker-compose run terraform init в Makefile.
Если вы не выполните make , просто docker-compose , вы также не сможете найти docker-compose .
Б) Если вы установили docker-compose , вам нужно знать, где вы его устанавливаете. Для моего сайта я установил его в: C:\Program Files\Docker\Docker\Resources\bin , поэтому перед выполнением make init я добавлю это в PATH:
Кроме того, если вы хотите окончательно добавить путь docker-compose в env, вы можете сослаться на это, чтобы сделать это.
Я запускаю командную строку, захожу в папку, в которой находятся blob.txt и make-файл, и набираю:
Это работает . Мне правда интересно, почему.
Проверьте значение PATH (или эквивалент) при запуске из make и при запуске вручную. Держу пари, они отличаются включением пути к pscp .
Это только начало происходить и со мной. Процесс make больше не может "видеть" определенные файлы в моей системе. Я установил GNU make с Chocolatey, и он работал безупречно в течение многих лет. Совершенно неожиданно сегодня такие файлы, как bash.exe и wsl.exe, скрыты от процесса make.
почти наверняка жалуется, что Windows не может найти pscp .
Это почти наверняка потому, что значение %PATH% (или что-то еще) отличается, когда make создает оболочку / консоль, чем когда вы открываете ее вручную.
Сравните значения, чтобы подтвердить это. Затем либо используйте полный путь к pscp в рецепте make-файла, либо убедитесь, что значение PATH установлено правильно для make использования.
arf Прошу прощения, но на самом деле это не решает ошибку . Я создал команду @echo $(PATH) в моем make-файле, и она содержит путь к папке, в которой находится pscp .
@echo $(PATH) расширяет значение PATH переменной make . Попробуйте вместо этого использовать переменную пути оболочки. @echo $$PATH или @echo %PATH% что-то еще.
Я знаю, что это старый вопрос, на который был дан ответ, но я подумал, что я и мой опыт для тех, кто все еще сталкивается с этим. Я получал ту же загадочную ошибку, полковник Бовель (правда, с помощью команды Windows MOVE, а не pscp):
Наш CI запускал тот же Makefile и работал отлично. Оказалось, что CI использовал mingw32-make, а я использовал GNU make. Удаление GNU make (которое было установлено как часть несвязанного массового пакета) и присвоение псевдонима mingw32-make для make работает отлично.
В моем случае у меня был git \ bin, %PATH% содержащий bash.exe и sh.exe.
Удаление %GIT_HOME%\bin из PATH работал для меня.
Я не хотел удалять папку bin GIT из переменной PATH (я использую машину с Windows), так как я использую ее довольно часто. Итак, я искал обходной путь, и вот он:
Также добавьте /usr/bin каталог в свою переменную PATH. Это в основном добавляет в вашу среду остальные команды, подобные Linux, которые поставляются с "GIT bash". После этого мои make-файлы снова работали нормально. :)
Если вам интересно, какая оболочка запускается программой make, просто добавьте ее $(info $(SHELL)) в начало вашего make-файла. Путь / имя вызываемой оболочки выводится на консоль, как только вы запускаете make.
Я знаю, что очень опаздываю на вечеринку, но должен сказать, что ответ Рикардо Алехоса в дополнение к ответу Этана Рейснера - отличное решение, если не лучшее решение здесь. Это связано с тем, что если вы используете bash.exe или какую-либо версию bash через материалы git, вам действительно следует сохранить все эти программы (по крайней мере, bin) в переменной среды PATH. Я не потерял никакой функциональности ни с одним из вещей, которые я делаю между Mac, Linux (дистрибутив debian) и Windows 10.
Решение @ user3869623 работает для меня. Для полноты картины хочу поделиться некоторыми своими подробностями.
Мой make-файл содержит следующую цель:
Когда я бегу make clean , я вижу эту ошибку:
Поскольку в нем говорится, что что-то пошло не echo так, я меняю цель make-файла на ниже:
На этот раз make clean дает мне эту ошибку:
Я удивлен, увидев bash здесь, так как я работаю в командной строке Windows.
Потом проверил %PATH% , вижу такую запись:
Там есть bash.exe и sh.exe в этом пути. Я удалил эту запись, и теперь она работает нормально.
НО Я ВСЕ ЕЩЕ НЕ ЗНАЮ, ПОЧЕМУ BASH ЗАНЯТ ЭТО .
2 Answers 2
If your Makefile somehow manipulates the PATH variable so that the directory where docker-compose is installed is no longer on it, that would cause this kind of symptom.
For troubleshooting, try to add
(indented by a tab, of course) just before the failing command, and examine whether the result confirms your expectations.
(The dollar sign needs to be doubled in this context to pass a literal dollar sign from make to the underlying shell.)
This means docker-compose not found when execute docker-compose run terraform init in Makefile.
If you not execute make , just docker-compose , you also cannot find docker-compose .
b) If you have installed docker-compose , you need to know where you install it. For my site, I installed it in: C:\Program Files\Docker\Docker\Resources\bin , so before execute make init , I add this to PATH:
Also, if you want to permanently add the docker-compose path to env, you can reference this to do it.
У меня есть docker-compose.yaml файл, который выглядит следующим образом:
И мой Makefile выглядит так
Когда я запускаю это из командной строки GitBash:
Я получаю следующий результат
docker-compose run terraform init
process_begin: Ошибка CreateProcess (NULL, docker-compose run terraform init, . ).
make (e = 2): система не может найти указанный файл.
make: *** [init] Ошибка 2
Пожалуйста, дайте мне знать, если я могу предоставить больше информации
Обновить
Я подтвердил, что:
- docker-compose установлен
- docker-compose.exe существует в моей переменной окружения PATH (см. ниже)
Моя переменная окружения PATH:
Обновление 2
Если я изменю make-файл, чтобы он явно указывал путь к файлу docker-compose.exe , он работает:
Обновление 3 - решение
Так что мой полный Makefile на самом деле выглядел так:
Запуск make .env создает .env file , который включает переменную PATH env
Удаление строки PATH из этого файла решит это для меня :)
ДОБАВИТЬ 1
Что касается того, почему C:\DevTools\Git\bin отображается в моем %PATH% , потому что я использую Sublime, и он всегда запрашивает у меня двоичные файлы Git:
Некоторые версии make смотрят на вашу переменную SHELL , чтобы решить, какую оболочку запустить. Другие, вероятно, имеют sh -совместимую оболочку, жестко закодированную, чтобы избежать поломки Makefile для пользователей с забавными нестандартными оболочками. Кстати, какой make вы используете?
Чтобы основываться на ответе пользователя 3869623.
В моем случае у меня был git\bin в моем% PATH%, который содержит bash.exe и sh.exe. У меня сработало удаление% GIT_HOME%\bin из PATH
Хотя эта рекомендация может позволить запустить make , она, скорее всего, вызовет проблемы для git, особенно если make-файл устанавливает программное обеспечение из репозитория git.
Лучшее решение — просто заменить %GIT_HOME%\bin на %GIT_HOME%\cmd .
Для тех, кто пытался удалить папку git bin из PATH и у них это не сработало, найдите в переменных PATH любые пути, содержащие bash.exe .
В моем случае я нашел переменную, ссылающуюся на папку cygwin bin C:\cygwin64\bin , удалил ее, и все заработало.
У меня была такая же проблема, и эта тема действительно помогла мне ее решить. В моем случае это был конфликт между make и sh.exe, который был виден по моему пути из-за git и mingw64. Чтобы решить мою проблему, не нарушая работу Git, я добавил эти строки в начало своего пакетного файла, который вызывает make:
Это скрывает дополнительные экземпляры sh.exe от make только для этого экземпляра.
I am using a makefile in windows to push some files on a Unix server (here a text file "blob.txt" in the same folder of my makefile). My makefile script is:
I start a command prompt, go in the folder where blob.txt and the makefile are present and type:
Which results in:
It works . I really wonder why.
Check the value of PATH (or equivalent) when run from make and when run manually. I'm betting they differ in the inclusion of the path to pscp .
This just started happening for me as well. The make process can no longer "see" certain files on my system. I've installed GNU make with Chocolatey and it has worked flawlessly for years. All of a sudden today, files such as bash.exe and wsl.exe are hidden from the make process.
Читайте также: