每当我使用变量将显式参数传递给
runhaskell
命令时,为了使特定包可见,例如:
#!/bin/bash
args="'-package pandoc'"
runhaskell --ghc-arg="$args"<<EOF
import Text.Pandoc
main :: IO ()
main = print $ "Hello World"
EOF
我得到错误:
:错误:找不到“-package pandoc” *** 异常:ExitFailure 1
但是,如果我明确输入该变量的内容:
#!/bin/bash
runhaskell --ghc-arg='-package pandoc'<<EOF
import Text.Pandoc
main :: IO ()
main = print $ "Hello World"
EOF
脚本按预期工作。有人知道为什么会这样吗?
你第二次通过了这个转义。你应该与:
一起工作#!/bin/bash
args="-package pandoc" # no quotations in the string
runhaskell --ghc-arg="$args"<<EOF
import Text.Pandoc
main :: IO ()
main = print $ "Hello World"
EOF
通过使用
"$args"
已经很清楚您将其用作单个参数,但是如果您在字符串中使用单引号 ,这些将作为参数的 content 传递。换句话说,您将使用 ghc-arg
作为第一个参数的 content来调用
'-package pandoc'
,因此 shell 不解释单引号,而是提供给 runhaskell
可执行文件。由于这 not 以连字符 (-
) 开头,解释器可能会假定它是要运行的文件的名称而不是标志,因此会在工作目录中查找具有该名称的文件。
echo
命令可以例如显示参数的content:
$ echo 'foo'
foo
$ echo '"foo"'
"foo"
$ echo "foo"
foo
$ echo "'foo'"
'foo'
“外部”引号(无论是
'
还是 "
)因此由 shell 解释,但内部引号(如果存在)作为参数值传递。