Предотвратить getArgs в Haskell от разбора глобальных выражений - PullRequest
4 голосов
/ 07 июля 2011

Я использую getArgs в моей программе на Haskell для анализа аргументов из командной строки.Однако я заметил, что у меня возникают проблемы, когда я называю свою программу следующим образом:

runhaskell Main *.hs .

Как вы можете себе представить, Main просматривает *.hs файлы в каталоге ..

Но есть проблема.Код ниже не ведет себя так, как я ожидал.

import System

main :: IO ()
main = do
    args <- getArgs
    print args

Я хочу видеть

args = ["*.hs","."]

, но вместо этого я вижу

args = ["file1.hs","file2.hs","file3.hs","."]

Моя программаНужно расширить собственное выражение glob, потому что оно делает это в нескольких каталогах.Но как я могу getArgs вернуть необработанный список аргументов вместо того, чтобы пытаться быть волшебным, и выполнить сам анализ?

Ответы [ 2 ]

15 голосов
/ 07 июля 2011

Это не haskell, это ваша оболочка.

Обычно файловые глобусы (например, *.hs) интерпретируются оболочкой перед передачей команды в haskell.

Чтобы увидеть это, попробуйте запустить

 runhaskell Main '*.hs' .

Одинарные кавычки не позволят вашей оболочке интерпретировать глобус и передадут аргумент как есть runhaskell.

8 голосов
/ 07 июля 2011

getArgs не анализирует выражение glob - getArgs никогда не видит выражение glob. Выражение glob анализируется и раскрывается вашей оболочкой еще до запуска вашей программы.

Внутри вашей программы вы ничего не можете сделать, чтобы предотвратить это - ваш единственный вариант - экранировать глобус в оболочке (добавив обратную косую черту, например, перед * или окружив аргумент одинарными кавычками).

...