如果参数以变量的形式传递,“runhaskell”则无法查看包

`runhaskell` can't see packages if the arguments are passed in the form of a variable

提问人:F. Zer 提问时间:3/15/2023 最后编辑:CyrusF. Zer 更新时间:3/15/2023 访问量:38

问:

每当我使用变量将显式参数传递给命令时,为了使特定包可见,例如: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 命令行参数 引用 runhaskell

评论


答:

1赞 willeM_ Van Onsem 3/15/2023 #1

你第二次通过这个逃脱了。您应该与以下人员合作:

#!/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

通过使用它,您已经清楚地将其用作单个参数,但是如果您在字符串中使用单引号,则这些引号将作为参数的内容传递。换句话说,您将调用第一个参数的内容,因此单引号不是由 shell 解释的,而是提供给可执行文件的。由于它不是以连字符 () 开头的,因此解释器可能会假设它是要运行的文件的名称而不是标志,因此在工作目录中查找具有该名称的文件。"$args"ghc-arg'-package pandoc'runhaskell-

您还可以传递多个参数,不带引号:$args

#!/bin/bash
args="-package=pandoc -package=pandoc-types"  # no quotations in the string

runhaskell -- $args <<EOF

import Text.Pandoc

main :: IO ()
main = print $ "Hello World"
EOF

例如,该命令可以显示参数的内容echo

$ echo 'foo'
foo
$ echo '"foo"'
"foo"
$ echo "foo"
foo
$ echo "'foo'"
'foo'

因此,“外部”引号(无论 或 )由 shell 解释,但内部引号(如果存在)作为参数值传递。'"

评论

0赞 F. Zer 3/15/2023
非常感谢!+1 如果我必须使用多个软件包会怎样?我给出了最小的可重现示例,但通常我使用多个示例。
0赞 F. Zer 3/15/2023
args="-package pandoc -package pandoc-types"
0赞 F. Zer 3/15/2023
无法解析软件包标志:pandoc -package pandoc-types
0赞 willeM_ Van Onsem 3/15/2023
@F.Zer:它需要一个参数,所以我认为?--ghc-arg="-package p1" --ghc-arg="-package p2"
0赞 willeM_ Van Onsem 3/15/2023
@F.Zer:但我认为你首先不需要,你可以使用我认为?--ghc-argrunhaskell -- -package p1 -package p2