我在Windows中使用makefile来推送Unix服务器上的一些文件(这里是一个文本文件" blob.txt"在我的makefile的同一个文件夹中)。 我的makefile脚本是:
setup:
pscp blob.txt username@hostname:/folder/
我启动命令提示符,进入blob.txt和makefile所在的文件夹并输入:
make setup
结果是:
pscp blob.txt username@hostname:/folder/
process_begin: CreateProcess(NULL, pscp blob.txt username@hostname:/folder/, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [setup] Error 2
在#fail中......如果我在命令提示符中直接输入命令:
pscp blob.txt username@hostname:/folder/
它有效......我真的很想知道为什么。
答案 0 :(得分:12)
错误
process_begin: CreateProcess(NULL, pscp blob.txt username@hostname:/folder/, ...) failed.
make (e=2): The system cannot find the file specified.
几乎肯定抱怨Windows无法找到pscp
。
这几乎可以肯定是因为当make生成shell /控制台然后手动打开时,%PATH%
(或其他)的值不同。
比较值以确认。然后使用makefile配方中pscp
的完整路径,或者确保PATH
的值已正确设置{/ 1}}。
答案 1 :(得分:6)
在我的情况下,我的%PATH%
中有git \ bin,其中包含bash.exe和sh.exe ..从%GIT_HOME%\bin
删除PATH
为我工作
答案 2 :(得分:5)
@ user3869623的解决方案适合我。我想分享一些我的细节来完成图片。
我的makefile包含以下目标:
clean:
@echo '$(OS)'
ifeq ($(OS),Windows_NT)
del /s *.o *.d *.elf *.map *.log
endif
当我运行make clean
时,我看到了这个错误:
因为它说echo
出了问题,所以我将makefile目标改为:
clean:
ifeq ($(OS),Windows_NT)
del /s *.o *.d *.elf *.map *.log
endif
这一次,make clean
给了我这个错误:
我很惊讶地看到bash
,因为我在Windows命令行中工作。
然后我检查了我的%PATH%
,我看到了这个条目:
C:\DevTools\Git\bin
该路径中有bash.exe
和sh.exe
。所以我删除了这个条目,现在工作正常。
但我仍然不知道为什么BASH会进入这个???
至于为什么C:\DevTools\Git\bin
出现在%PATH%
中,因为我使用的是Sublime,它总是要求我提供Git二进制文件:
答案 3 :(得分:4)
我知道这是一个已经回答过的老问题,但我想我和我的经历对任何人来说仍然存在。我得到了相同的神秘错误上校Beauvel(虽然使用了Windows MOVE命令,而不是pscp):
process_begin: CreateProcess(NULL, move /y foo\bar.c .\baz.c, ...) failed.
make (e=2): The system cannot find the file specified.
我们的CI运行相同的Makefile并且运行良好。原来CI正在使用mingw32-make而我正在使用GNU make。卸载GNU make(作为不相关的批量包的一部分安装)和别名mingw32-make到'make'可以很好地工作。
答案 4 :(得分:2)
以user3869623的响应为基础。
在我的情况下,我的%PATH%中包含git \ bin,其中包含bash.exe和sh.exe。从路径中删除%GIT_HOME%\ bin对我有用
尽管此建议可能允许make
运行,但可能会导致git出现问题,尤其是在makefile从git存储库中安装软件的情况下。
更好的解决方案是将%GIT_HOME%\bin
更改为%GIT_HOME%\cmd
答案 5 :(得分:1)
我不想从PATH变量中删除GIT的bin文件夹(我使用的是Windows机器),因为我经常使用它。所以我找了一个解决方法。这是:
将public class Customer: ICustomer{
public Customer(Details details){
Details = details;
}
[JsonProperty("Details",NullValueHnadling = NullValueHandling.Ignore)]
public IDetails Details {get; set;}
}
目录添加到PATH变量中。这基本上将“GIT bash”附带的其他类似linux的命令添加到您的环境中。应用此功能后,我的makefile再次正常运行。 :)
如果您对make调用的shell感到好奇,只需在makefile的开头添加<git-installation-directory>/usr/bin
即可。一旦运行make,就会将调用的shell的路径/名称打印到控制台。
答案 6 :(得分:0)
对于那些尝试从PATH
删除git bin文件夹并且它不适用于他们的人,请在PATH
变量中搜索包含bash.exe
的任何路径。
在我的情况下,我发现了一个链接到cygwin bin文件夹C:\cygwin64\bin
的变量,将其删除并且有效。
答案 7 :(得分:0)
我遇到了同样的问题,这个线程确实帮助我解决了这个问题。在我的情况下,由于git和mingw64,这是make和sh.exe之间的冲突,该冲突通过我的路径可见。为了解决我的问题,在不破坏Git的情况下,我将以下行添加到了调用make的批处理文件的顶部:
set path=%path:git\bin=;%
set path=%path:mingw64\bin=;%
set path=%path:usr\bin=;%
这仅对make实例隐藏了exstra sh.exe实例。