`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'
«Внешние» кавычки (будь то'
или"
), таким образом, интерпретируются оболочкой, но внутренние кавычки (если они присутствуют) передаются как значение параметра.