2

ich an einem Programm arbeite, der einen anderen Befehl mit seinen Argumenten nimmt:Wie man cmdargs anweist, Argumente über irgendeinen Punkt nicht zu analysieren?

$ myprog record -f 1.txt ls 
$ myprog record -f 1.txt ls -l 

So etwas wie sudo:

$ sudo ls 
$ sudo ls -l 

Hier ist mein Code, der cmdargs verwendet:

#!/usr/bin/env stack 
-- stack --resolver lts-9.20 script --package cmdargs 

{-# LANGUAGE DeriveDataTypeable #-} 

module Main where 

import   System.Console.CmdArgs as Args 

data Tape = Record {file :: Maybe String, command :: String, commandArgs :: [String]} 
      | Replay 
      deriving (Data, Typeable, Show, Eq) 
main :: IO() 
main = do 
    m <- cmdArgs $ modes 
     [ Record { file  = def &= typ "FILE" 
        , command  = def &= typ "COMMAND" &= argPos 0 
        , commandArgs = def &= typ "ARGS" &= args  } 
     , Replay ] 
    print m 

Es funktioniert gut, aber nur für Befehle, die keine eigenen Flags haben:

$ ./cmdargs.hs record -f 1.txt ls 
Record {file = Just "1.txt", command = "ls", commandArgs = []} 

$ ./cmdargs.hs record -f 1.txt ls 1 2 3 
Record {file = Just "1.txt", command = "ls", commandArgs = ["1","2","3"]} 

$ ./cmdargs.hs record -f 1.txt ls -l 
Unknown flag: -l 

F: Wie Cmdargs anweisen, "commandArgs" zu behalten, wie es ist, ohne nach Flags zu suchen?

Antwort

3

Die traditionelle Methode ist nicht innerhalb des Parsers jedoch unter Verwendung ein -- Argumente, was das Ende der Flaggen:

$ ./args record -- something -l 
Record {file = Nothing, command = "something", commandArgs = ["-l"]} 

Leider, wie ich weiß nicht, getArgs zu sagen, so an einem beliebigen Ort zu tun, aber Ich stelle mir vor, dass es etwas mit Modi zu tun haben würde.

Verwandte Themen