`runhaskell` не видит пакеты, если аргументы передаются в виде переменной

Всякий раз, когда я передаю явные параметры в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

Скрипт работает как положено. Кто-нибудь знает, почему это так?

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

Используя"$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

The echoкоманда может, например, показать содержимое параметра:

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

«Внешние» кавычки (будь то'или"), таким образом, интерпретируются оболочкой, но внутренние кавычки (если они присутствуют) передаются как значение параметра.

Другие вопросы по тегам