Windows下Perl反引号无法执行MD命令的问题咨询
问题解答
核心问题解析
- 能否像CMD.exe那样用反引号调用Windows命令?
可以,但得明确指定让Perl调用Windows的cmd.exe来执行命令,不能直接写md这类CMD专属命令。 - 当前是否处于bash环境?
是的。你安装的x86_64-msys-thread-multi版本Perl是基于Git自带的msys环境构建的,它默认会用msys的sh(类bash的shell)来处理反引号、system()这类系统调用,所以报错里会出现sh: line 1的提示。 - 是始终处于还是特定情况触发?
对于这个版本的Perl来说,始终会用msys的shell处理系统命令,除非你手动指定调用cmd.exe或者其他程序。
错误原因说明
- 第一个错误
Can't exec "md": No such file or directory:
msys的sh里没有md命令(它用mkdir创建目录),而你的Perl默认把反引号里的命令交给sh执行,所以找不到md。 - 第二个错误
sh: line 1: md: command not found:
同样是因为命令被交给msys的sh执行,sh不认识Windows的md命令,直接报错。
解决方法
方法1:用Perl内置的mkdir函数(推荐,跨平台)
完全不需要调用系统命令,直接用Perl自带的函数创建目录,兼容性更好:
perl -e 'use warnings; mkdir $ARGV[0] or die "创建失败: $!";' test12
方法2:显式调用cmd.exe执行Windows命令
如果非要用md这类CMD命令,得让Perl调用cmd /c来执行(/c表示执行完命令后退出CMD):
perl -e 'use warnings; `cmd /c md $ARGV[0]`;' test12
带路径的情况也适用:
perl -e 'use warnings; `cmd /c md $ARGV[0]`;' test12\b4
方法3:用msys环境的mkdir命令替代md
既然你在msys环境里,直接用sh支持的mkdir命令:
perl -e 'use warnings; `mkdir $ARGV[0]`;' test12
内容的提问来源于stack exchange,提问作者Matthias Ronge
相关产品推荐
相关产品推荐

