2012-09-05 7 views
1

J'essaie de placer un symbole astérisque entre guillemets dans mon application de console en tant qu'argument de ligne de commande, et lorsque je l'obtiens en utilisant System.Environment.getArgs, j'obtiens la liste des fichiers dans le répertoire courant. C'est faux, parce que je place un astérisque entre guillemets, donc le texte entre guillemets ne devrait pas être substitué. Comment obtenir des arguments de ligne de commande sans une telle substitution dans Windows sous cygwin?Comportement incorrect de getArgs sous Windows sous cygwin

+2

Cela ressemble plus à une question qui concerne les fenêtres de Haskell de. –

+0

Utilisez-vous des guillemets simples ou des guillemets doubles? –

+0

C'est un problème avec votre shell, pas avec 'getArgs'. Globbing est effectuée avant que tous les arguments sont envoyés à votre programme. – valderman

Répondre

2

Si vous l'entourez de guillemets simples, '*', il n'est pas développé, mais les deux guillemets inversés passent au résultat de getArgs (voir ci-dessous), vous devrez donc les supprimer plus tard.

La raison "*" est élargie dans Windows est que les guillemets sont légitimes dans le cadre d'un nom de fichier globbable, en raison des espaces. Vous voudrez peut-être del "temp file *.dat" à un moment donné.

module ListArgs where 
import System.Environment 
main = getArgs >>= print 

donne:

[1 of 1] Compiling ListArgs    (ListArgs.hs, ListArgs.o) 
Linking ListArgs.exe ... 

D:\Files\Andrew\prog\haskell\utils>ListArgs.exe * 
["HereDoc.hs","IOutils.lhs","SugaredApplicative.hs","ListArgs.exe","ListArgs.hi","ListArgs.hs","ListArgs.o"] 

D:\Files\Andrew\prog\haskell\utils>ListArgs.exe "*" 
["HereDoc.hs","IOutils.lhs","SugaredApplicative.hs","ListArgs.exe","ListArgs.hi","ListArgs.hs","ListArgs.o"] 

D:\Files\Andrew\prog\haskell\utils>ListArgs.exe '*' 
["'*'"] 

D:\Files\Andrew\prog\haskell\utils>ListArgs.exe '* 
["'*"] 

D:\Files\Andrew\prog\haskell\utils>ListArgs.exe -* 
["-*"] 
+0

AndrewC, merci pour votre réponse, les guillemets simples fonctionnent vraiment dans cmd.exe. Cependant, sous cygwin, cela ne fonctionne pas, j'ai toujours la liste des fichiers dans le répertoire actuel. - * fonctionne partout. –

+0

L'utilisation de préfixes et de guillemets simples est une sorte de solution de contournement, qui n'est évidemment pas destinée à l'utilisateur. Le développeur doit également garder à l'esprit un tel comportement dans Windows, et en quelque sorte éliminer les symboles indésirables de l'entrée. Je préférerais avoir une fonction qui ne fait pas de telles substitutions. Mais semble plateforme Haskell ne fournit pas une telle fonction. C'est dommage. –

+0

Je n'ai pas utilisé cygwin depuis des années. Je vais ajouter une balise pour élargir l'audience. – AndrewC

Questions connexes