You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用变量传递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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:33:38