使用变量传递runhaskell参数时无法识别指定包,直接传入正常,求原因
Bash脚本中变量传递runhaskell参数失败的原因
问题场景
你尝试在Bash脚本中通过变量向runhaskell传递--ghc-arg参数以加载pandoc包时遭遇错误:
失败的脚本
#!/bin/bash args="'-package pandoc'" runhaskell --ghc-arg="$args"<<EOF import Text.Pandoc main :: IO () main = print $ "Hello World" EOF
执行后报错:
: error: Can't find '-package pandoc'
*** Exception: ExitFailure 1
正常运行的脚本
直接将参数写死在命令中则可以正常执行:
#!/bin/bash runhaskell --ghc-arg='-package pandoc'<<EOF import Text.Pandoc main :: IO () main = print $ "Hello World" EOF
原因解析
这是Bash引号解析机制的差异导致的:
- 直接写
--ghc-arg='-package pandoc'时,单引号仅作为Bash的语法标记,告诉Bash不解析引号内的内容,最终传递给runhaskell的实际参数是-package pandoc(不包含外层单引号)。 - 而赋值
args="'-package pandoc'"时,变量args存储的内容是包含外层单引号的完整字符串:'-package pandoc'。当用"$args"引用变量时,Bash会把整个带引号的字符串作为一个整体传递给--ghc-arg,此时runhaskell接收到的参数是'-package pandoc'(包含单引号),它会把这个带引号的字符串当作包名去查找,自然找不到对应的包,因此报错。
正确的写法
要通过变量传递参数,不需要给变量内容加外层引号,直接赋值即可:
#!/bin/bash args="-package pandoc" runhaskell --ghc-arg="$args"<<EOF import Text.Pandoc main :: IO () main = print $ "Hello World" EOF
这里用"$args"包裹变量是更稳妥的写法,能避免参数中包含空格或特殊字符时被Bash错误分割。
内容的提问来源于stack exchange,提问作者F. Zer
相关产品推荐
相关产品推荐

