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?