Shell 使用optpass applicative从命令行参数读取换行符

Shell 使用optpass applicative从命令行参数读取换行符,shell,haskell,Shell,Haskell,下面是一个程序示例,它使用一个可选参数a,该参数的默认值为换行符。程序只打印唯一参数的值。因此,不带参数或使用-a'\n'调用程序时应给出相同的值,但它不会: $ ./myProg $ ./myProg -a '\n' \n 问题是,当从命令行参数读取换行符时,换行符被转义。是否可以使两个调用的行为相同 import Options.Applicative data Options = Options String optsParser :: Parser Options optsPa

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

$ ./myProg


$ ./myProg -a '\n'
\n
问题是,当从命令行参数读取换行符时,换行符被转义。是否可以使两个调用的行为相同

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
导入选项。应用程序
数据选项=选项字符串
optsParser::解析器选项
optsParser=选项
斯特罗普顿
(简称"a")
metavar“A”
值“\n”)
选项::IO选项
opts=execParser$info(helper optsParser)(fullDesc)
main=do

选项a问题不在于换行符被转义;问题是你一开始没有换行符

就shell而言,
'\n'
实际上是一个两个字符的字符串(反斜杠,n),这就是传递给程序的内容

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

$ ./myProg -a '
> '
(其中的
有一个辅助shell提示符。您键入的是“Return”。)

或者在bash中:

$ ./myProg -a $'\n'

问题不在于换行符被转义;问题是你一开始没有换行符

就shell而言,
'\n'
实际上是一个两个字符的字符串(反斜杠,n),这就是传递给程序的内容

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

$ ./myProg -a '
> '
(其中的
有一个辅助shell提示符。您键入的是“Return”。)

或者在bash中:

$ ./myProg -a $'\n'

很好的澄清。有没有什么简单的方法可以让optparse将作为命令行参数给出的“\n”解释为换行符?@GuillaumeChérel您必须自己完成并实现自己的转义语法。很好的说明。有没有简单的方法可以让optparse将作为命令行参数给出的“\n”解释为换行符?@GuillaumeChérel您必须自己完成并实现自己的转义语法。