使用optparse-applicative从命令行参数中读取换行符

Gui*_*rel 1 shell haskell

下面是一个程序的示例,该程序采用一个可选参数a,该参数具有换行符的默认值.该程序仅打印唯一参数的值.因此,调用没有参数或使用的程序-a '\n'应该给出相同的值,但它不会:

$ ./myProg


$ ./myProg -a '\n'
\n
Run Code Online (Sandbox Code Playgroud)

问题是当从命令行参数中读取时,换行符会被转义.是否可以使两个调用表现相同?

import Options.Applicative

data Options = Options String

optsParser :: Parser Options
optsParser = Options
    <$> strOption
         ( short 'a'
        <> metavar "A"
        <> value "\n" )

opts :: IO Options
opts = execParser $ info (helper <*> optsParser) ( fullDesc )

main = do
    Options a <- opts
    putStrLn $ a
Run Code Online (Sandbox Code Playgroud)

mel*_*ene 5

问题不在于换行符被转义; 问题是你首先没有换行符.

就shell而言,'\n'字面上是一个双字符串(反斜杠,n),这就是传递给你的程序的东西.

如何在命令行上传递文字换行符取决于您的shell,但请尝试以下操作:

$ ./myProg -a '
> '
Run Code Online (Sandbox Code Playgroud)

(>里面有一个辅助shell提示符.你键入的是什么' Return '.)

或者在bash中:

$ ./myProg -a $'\n'
Run Code Online (Sandbox Code Playgroud)