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

xienkqul  于 2023-03-19  发布在  Shell
关注(0)|答案(1)|浏览(123)

每当我使用变量将显式参数传递给runhaskell命令时,为了使特定的包可见,例如:

#!/bin/bash
args="'-package pandoc'"

runhaskell --ghc-arg="$args"<<EOF

import Text.Pandoc

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

我得到错误:
:错误:找不到'-package pandoc'***异常:退出故障1
但是,如果显式输入该变量的内容:

#!/bin/bash

runhaskell --ghc-arg='-package pandoc'<<EOF

import Text.Pandoc

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

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

wgx48brx

wgx48brx1#

您将第二次通过此转义。您应该使用:

#!/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 传递。换句话说,您将使用'-package pandoc'作为第一个参数的 content 来调用ghc-arg,其中单引号不会被shell解释。因为它 * 不是 * 以连字符(-)开头,解释器可能会假设它是要运行的文件的名称,而不是标志,因此在工作目录中查找具有该名称的文件。
您还可以传递多个参数,$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命令可以显示参数的 content

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

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

相关问题