如果参数以变量的形式传递,`runhaskell` 看不到包

问题描述 投票:0回答:1

每当我使用变量将显式参数传递给

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

脚本按预期工作。有人知道为什么会这样吗?

bash shell command-line-arguments quotes runhaskell
1个回答
0
投票

你第二次通过了这个转义。你应该与:

一起工作
#!/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 解释,但内部引号(如果存在)作为参数值传递。

© www.soinside.com 2019 - 2024. All rights reserved.