防止Haskell的getArgs解析glob表达式

Ell*_*ron 4 console haskell arguments

我正在使用getArgs我的Haskell程序来解析命令行中的参数.但是,当我调用我的程序时,我注意到我遇到了问题:

runhaskell Main *.hs .
Run Code Online (Sandbox Code Playgroud)

可以想象,Main查看*.hs目录中的.文件.

但是有一个问题.下面的代码表现不像我期望的那样.

import System

main :: IO ()
main = do
    args <- getArgs
    print args
Run Code Online (Sandbox Code Playgroud)

我想看看

args = ["*.hs","."]
Run Code Online (Sandbox Code Playgroud)

但相反,我明白了

args = ["file1.hs","file2.hs","file3.hs","."]
Run Code Online (Sandbox Code Playgroud)

我的程序需要扩展glob表达式本身,因为它在多个目录中完成.但是我如何才能getArgs返回原始的参数列表而不是试图变得神奇并且自己进行解析呢?

ram*_*ion 15

这不是haskell,这是你的shell.

通常,*.hs在将命令传递给haskell之前,shell会解释文件globs(like ).

要看到这个尝试运行

 runhaskell Main '*.hs' .
Run Code Online (Sandbox Code Playgroud)

单引号将阻止shell解释glob,并按原样传递参数runhaskell.


sep*_*p2k 8

getArgs不解析glob expressison - getArgs永远不会看到glob表达式.在程序启动之前,您的shell将解析和扩展glob表达式.

在程序中你无法做任何事情来防止这种情况 - 你唯一的选择是逃避shell中的glob(通过在*例如之前添加反斜杠或用单引号包围参数).