cygwin下Windows上getArgs的行为不正确
我试图将引号中的星号符号作为命令行参数传递到我的控制台应用程序中,当我使用cygwin下Windows上getArgs的行为不正确,windows,haskell,command-line,cygwin,Windows,Haskell,Command Line,Cygwin,我试图将引号中的星号符号作为命令行参数传递到我的控制台应用程序中,当我使用System.Environment.getArgs获得它时,我实际上得到了当前目录中的文件列表。这是错误的,因为我把星号用引号括起来,所以引号中的文本不应该被替换。在cygwin下的Windows中,如何在没有这种替换的情况下获取命令行参数?如果将其括在单引号中,'*'它不会展开,但两个倒逗号会进入getArgs的结果中(请参见下文),因此以后需要删除它们 在windows中展开“*”的原因是,由于空格的缘故,倒逗号作为
System.Environment.getArgs
获得它时,我实际上得到了当前目录中的文件列表。这是错误的,因为我把星号用引号括起来,所以引号中的文本不应该被替换。在cygwin下的Windows中,如何在没有这种替换的情况下获取命令行参数?如果将其括在单引号中,'*'
它不会展开,但两个倒逗号会进入getArgs
的结果中(请参见下文),因此以后需要删除它们
在windows中展开“*”的原因是,由于空格的缘故,倒逗号作为全局文件名的一部分是合法的。您可能希望在某个时候删除“temp file*.dat”
module ListArgs where
import System.Environment
main = getArgs >>= print
给出:
[1 of 1] Compiling ListArgs ( ListArgs.hs, ListArgs.o )
Linking ListArgs.exe ...
D:\Files\Andrew\prog\haskell\utils>ListArgs.exe *
["HereDoc.hs","IOutils.lhs","SugaredApplicative.hs","ListArgs.exe","ListArgs.hi","ListArgs.hs","ListArgs.o"]
D:\Files\Andrew\prog\haskell\utils>ListArgs.exe "*"
["HereDoc.hs","IOutils.lhs","SugaredApplicative.hs","ListArgs.exe","ListArgs.hi","ListArgs.hs","ListArgs.o"]
D:\Files\Andrew\prog\haskell\utils>ListArgs.exe '*'
["'*'"]
D:\Files\Andrew\prog\haskell\utils>ListArgs.exe '*
["'*"]
D:\Files\Andrew\prog\haskell\utils>ListArgs.exe -*
["-*"]
这似乎更像是windows的问题,而不是Haskell的问题。您使用单引号还是双引号?这是shell的问题,而不是
getArgs
的问题。Globbing是在将任何参数发送到您的程序之前执行的。@valderman这在Windows上不一定是真的,在Windows上,程序应该自己执行glob扩展(cmd.exe
不扩展globs,它只是一个字符串;C运行时在输入main
)之前对其进行解析。噢。我想我被困在尼克斯岛有点太久了,忘了这一点。:)AndrewC,谢谢你的回答,单引号在cmd.exe中非常有效。然而,在cygwin下,它不起作用,我仍然得到当前目录中的文件列表。-*使用前缀和单引号是一种变通方法,显然不适合用户。开发人员还应该记住Windows中的这种行为,并以某种方式从输入中消除不需要的符号。我更喜欢一个不做这种替换的函数。但是Haskell平台似乎没有提供这样的功能。很遗憾,我已经好几年没用cygwin了。我将添加一个标签以扩大受众。