1module ShellCheck.Data where
2
3import ShellCheck.Interface
4import Data.Version (showVersion)
5import Paths_ShellCheck (version)
6
7shellcheckVersion = showVersion version -- VERSIONSTRING
8
9internalVariables = [
10    -- Generic
11    "", "_", "rest", "REST",
12
13    -- Bash
14    "BASH", "BASHOPTS", "BASHPID", "BASH_ALIASES", "BASH_ARGC",
15    "BASH_ARGV", "BASH_CMDS", "BASH_COMMAND", "BASH_EXECUTION_STRING",
16    "BASH_LINENO", "BASH_REMATCH", "BASH_SOURCE", "BASH_SUBSHELL",
17    "BASH_VERSINFO", "BASH_VERSION", "COMP_CWORD", "COMP_KEY",
18    "COMP_LINE", "COMP_POINT", "COMP_TYPE", "COMP_WORDBREAKS",
19    "COMP_WORDS", "COPROC", "DIRSTACK", "EUID", "FUNCNAME", "GROUPS",
20    "HISTCMD", "HOSTNAME", "HOSTTYPE", "LINENO", "MACHTYPE", "MAPFILE",
21    "OLDPWD", "OPTARG", "OPTIND", "OSTYPE", "PIPESTATUS", "PPID", "PWD",
22    "RANDOM", "READLINE_LINE", "READLINE_POINT", "REPLY", "SECONDS",
23    "SHELLOPTS", "SHLVL", "UID", "BASH_ENV", "BASH_XTRACEFD", "CDPATH",
24    "COLUMNS", "COMPREPLY", "EMACS", "ENV", "FCEDIT", "FIGNORE",
25    "FUNCNEST", "GLOBIGNORE", "HISTCONTROL", "HISTFILE", "HISTFILESIZE",
26    "HISTIGNORE", "HISTSIZE", "HISTTIMEFORMAT", "HOME", "HOSTFILE", "IFS",
27    "IGNOREEOF", "INPUTRC", "LANG", "LC_ALL", "LC_COLLATE", "LC_CTYPE",
28    "LC_MESSAGES", "LC_MONETARY", "LC_NUMERIC", "LC_TIME", "LINES", "MAIL",
29    "MAILCHECK", "MAILPATH", "OPTERR", "PATH", "POSIXLY_CORRECT",
30    "PROMPT_COMMAND", "PROMPT_DIRTRIM", "PS1", "PS2", "PS3", "PS4", "SHELL",
31    "TIMEFORMAT", "TMOUT", "TMPDIR", "auto_resume", "histchars", "COPROC",
32
33    -- Other
34    "USER", "TZ", "TERM", "LOGNAME", "LD_LIBRARY_PATH", "LANGUAGE", "DISPLAY",
35    "HOSTNAME", "KRB5CCNAME", "XAUTHORITY"
36
37    -- Ksh
38    , ".sh.version"
39
40    -- shflags
41    , "FLAGS_ARGC", "FLAGS_ARGV", "FLAGS_ERROR", "FLAGS_FALSE", "FLAGS_HELP",
42    "FLAGS_PARENT", "FLAGS_RESERVED", "FLAGS_TRUE", "FLAGS_VERSION",
43    "flags_error", "flags_return"
44  ]
45
46specialVariablesWithoutSpaces = [
47    "$", "-", "?", "!", "#"
48  ]
49variablesWithoutSpaces = specialVariablesWithoutSpaces ++ [
50    "BASHPID", "BASH_ARGC", "BASH_LINENO", "BASH_SUBSHELL", "EUID", "LINENO",
51    "OPTIND", "PPID", "RANDOM", "SECONDS", "SHELLOPTS", "SHLVL", "UID",
52    "COLUMNS", "HISTFILESIZE", "HISTSIZE", "LINES"
53
54    -- shflags
55    , "FLAGS_ERROR", "FLAGS_FALSE", "FLAGS_TRUE"
56  ]
57
58specialVariables = specialVariablesWithoutSpaces ++ ["@", "*"]
59
60unbracedVariables = specialVariables ++ [
61    "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
62  ]
63
64arrayVariables = [
65    "BASH_ALIASES", "BASH_ARGC", "BASH_ARGV", "BASH_CMDS", "BASH_LINENO",
66    "BASH_REMATCH", "BASH_SOURCE", "BASH_VERSINFO", "COMP_WORDS", "COPROC",
67    "DIRSTACK", "FUNCNAME", "GROUPS", "MAPFILE", "PIPESTATUS", "COMPREPLY"
68  ]
69
70commonCommands = [
71    "admin", "alias", "ar", "asa", "at", "awk", "basename", "batch",
72    "bc", "bg", "break", "c99", "cal", "cat", "cd", "cflow", "chgrp",
73    "chmod", "chown", "cksum", "cmp", "colon", "comm", "command",
74    "compress", "continue", "cp", "crontab", "csplit", "ctags", "cut",
75    "cxref", "date", "dd", "delta", "df", "diff", "dirname", "dot",
76    "du", "echo", "ed", "env", "eval", "ex", "exec", "exit", "expand",
77    "export", "expr", "fc", "fg", "file", "find", "fold", "fort77",
78    "fuser", "gencat", "get", "getconf", "getopts", "grep", "hash",
79    "head", "iconv", "ipcrm", "ipcs", "jobs", "join", "kill", "lex",
80    "link", "ln", "locale", "localedef", "logger", "logname", "lp",
81    "ls", "m4", "mailx", "make", "man", "mesg", "mkdir", "mkfifo",
82    "more", "mv", "newgrp", "nice", "nl", "nm", "nohup", "od", "paste",
83    "patch", "pathchk", "pax", "pr", "printf", "prs", "ps", "pwd",
84    "qalter", "qdel", "qhold", "qmove", "qmsg", "qrerun", "qrls",
85    "qselect", "qsig", "qstat", "qsub", "read", "readonly", "renice",
86    "return", "rm", "rmdel", "rmdir", "sact", "sccs", "sed", "set",
87    "sh", "shift", "sleep", "sort", "split", "strings", "strip", "stty",
88    "tabs", "tail", "talk", "tee", "test", "time", "times", "touch",
89    "tput", "tr", "trap", "tsort", "tty", "type", "ulimit", "umask",
90    "unalias", "uname", "uncompress", "unexpand", "unget", "uniq",
91    "unlink", "unset", "uucp", "uudecode", "uuencode", "uustat", "uux",
92    "val", "vi", "wait", "wc", "what", "who", "write", "xargs", "yacc",
93    "zcat"
94  ]
95
96nonReadingCommands = [
97    "alias", "basename", "bg", "cal", "cd", "chgrp", "chmod", "chown",
98    "cp", "du", "echo", "export", "false", "fg", "fuser", "getconf",
99    "getopt", "getopts", "ipcrm", "ipcs", "jobs", "kill", "ln", "ls",
100    "locale", "mv", "printf", "ps", "pwd", "renice", "rm", "rmdir",
101    "set", "sleep", "touch", "trap", "true", "ulimit", "unalias", "uname"
102    ]
103
104sampleWords = [
105    "alpha", "bravo", "charlie", "delta", "echo", "foxtrot",
106    "golf", "hotel", "india", "juliett", "kilo", "lima", "mike",
107    "november", "oscar", "papa", "quebec", "romeo", "sierra",
108    "tango", "uniform", "victor", "whiskey", "xray", "yankee",
109    "zulu"
110  ]
111
112binaryTestOps = [
113    "-nt", "-ot", "-ef", "==", "!=", "<=", ">=", "-eq", "-ne", "-lt", "-le",
114    "-gt", "-ge", "=~", ">", "<", "=", "\\<", "\\>", "\\<=", "\\>="
115  ]
116
117arithmeticBinaryTestOps = [
118    "-eq", "-ne", "-lt", "-le", "-gt", "-ge"
119  ]
120
121unaryTestOps = [
122    "!", "-a", "-b", "-c", "-d", "-e", "-f", "-g", "-h", "-L", "-k", "-p",
123    "-r", "-s", "-S", "-t", "-u", "-w", "-x", "-O", "-G", "-N", "-z", "-n",
124    "-o", "-v", "-R"
125  ]
126
127shellForExecutable :: String -> Maybe Shell
128shellForExecutable name =
129    case name of
130        "sh"    -> return Sh
131        "bash"  -> return Bash
132        "bats"  -> return Bash
133        "dash"  -> return Dash
134        "ash"   -> return Dash -- There's also a warning for this.
135        "ksh"   -> return Ksh
136        "ksh88" -> return Ksh
137        "ksh93" -> return Ksh
138        _ -> Nothing
139
140flagsForRead = "sreu:n:N:i:p:a:t:"
141
142declaringCommands = ["local", "declare", "export", "readonly", "typeset", "let"]
143