2023-10-03 11:14:36 +08:00
|
|
|
/*
|
|
|
|
Language: Bash
|
|
|
|
Author: vah <vahtenberg@gmail.com>
|
|
|
|
Contributrors: Benjamin Pannell <contact@sierrasoftworks.com>
|
|
|
|
Website: https://www.gnu.org/software/bash/
|
|
|
|
Category: common
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** @type LanguageFn */
|
|
|
|
function bash(hljs) {
|
|
|
|
const regex = hljs.regex;
|
|
|
|
const VAR = {};
|
|
|
|
const BRACED_VAR = {
|
|
|
|
begin: /\$\{/,
|
|
|
|
end: /\}/,
|
|
|
|
contains: [
|
|
|
|
"self",
|
|
|
|
{
|
|
|
|
begin: /:-/,
|
|
|
|
contains: [ VAR ]
|
|
|
|
} // default values
|
|
|
|
]
|
|
|
|
};
|
|
|
|
Object.assign(VAR, {
|
|
|
|
className: 'variable',
|
|
|
|
variants: [
|
|
|
|
{ begin: regex.concat(/\$[\w\d#@][\w\d_]*/,
|
|
|
|
// negative look-ahead tries to avoid matching patterns that are not
|
|
|
|
// Perl at all like $ident$, @ident@, etc.
|
|
|
|
`(?![\\w\\d])(?![$])`) },
|
|
|
|
BRACED_VAR
|
|
|
|
]
|
|
|
|
});
|
|
|
|
|
|
|
|
const SUBST = {
|
|
|
|
className: 'subst',
|
|
|
|
begin: /\$\(/,
|
|
|
|
end: /\)/,
|
|
|
|
contains: [ hljs.BACKSLASH_ESCAPE ]
|
|
|
|
};
|
|
|
|
const HERE_DOC = {
|
|
|
|
begin: /<<-?\s*(?=\w+)/,
|
|
|
|
starts: { contains: [
|
|
|
|
hljs.END_SAME_AS_BEGIN({
|
|
|
|
begin: /(\w+)/,
|
|
|
|
end: /(\w+)/,
|
|
|
|
className: 'string'
|
|
|
|
})
|
|
|
|
] }
|
|
|
|
};
|
|
|
|
const QUOTE_STRING = {
|
|
|
|
className: 'string',
|
|
|
|
begin: /"/,
|
|
|
|
end: /"/,
|
|
|
|
contains: [
|
|
|
|
hljs.BACKSLASH_ESCAPE,
|
|
|
|
VAR,
|
|
|
|
SUBST
|
|
|
|
]
|
|
|
|
};
|
|
|
|
SUBST.contains.push(QUOTE_STRING);
|
|
|
|
const ESCAPED_QUOTE = {
|
|
|
|
className: '',
|
|
|
|
begin: /\\"/
|
|
|
|
|
|
|
|
};
|
|
|
|
const APOS_STRING = {
|
|
|
|
className: 'string',
|
|
|
|
begin: /'/,
|
|
|
|
end: /'/
|
|
|
|
};
|
|
|
|
const ARITHMETIC = {
|
|
|
|
begin: /\$?\(\(/,
|
|
|
|
end: /\)\)/,
|
|
|
|
contains: [
|
|
|
|
{
|
|
|
|
begin: /\d+#[0-9a-f]+/,
|
|
|
|
className: "number"
|
|
|
|
},
|
|
|
|
hljs.NUMBER_MODE,
|
|
|
|
VAR
|
|
|
|
]
|
|
|
|
};
|
|
|
|
const SH_LIKE_SHELLS = [
|
|
|
|
"fish",
|
|
|
|
"bash",
|
|
|
|
"zsh",
|
|
|
|
"sh",
|
|
|
|
"csh",
|
|
|
|
"ksh",
|
|
|
|
"tcsh",
|
|
|
|
"dash",
|
|
|
|
"scsh",
|
|
|
|
];
|
|
|
|
const KNOWN_SHEBANG = hljs.SHEBANG({
|
|
|
|
binary: `(${SH_LIKE_SHELLS.join("|")})`,
|
|
|
|
relevance: 10
|
|
|
|
});
|
|
|
|
const FUNCTION = {
|
|
|
|
className: 'function',
|
|
|
|
begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/,
|
|
|
|
returnBegin: true,
|
|
|
|
contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: /\w[\w\d_]*/ }) ],
|
|
|
|
relevance: 0
|
|
|
|
};
|
|
|
|
|
|
|
|
const KEYWORDS = [
|
|
|
|
"if",
|
|
|
|
"then",
|
|
|
|
"else",
|
|
|
|
"elif",
|
|
|
|
"fi",
|
|
|
|
"for",
|
|
|
|
"while",
|
|
|
|
"in",
|
|
|
|
"do",
|
|
|
|
"done",
|
|
|
|
"case",
|
|
|
|
"esac",
|
|
|
|
"function"
|
|
|
|
];
|
|
|
|
|
|
|
|
const LITERALS = [
|
|
|
|
"true",
|
|
|
|
"false"
|
|
|
|
];
|
|
|
|
|
|
|
|
// to consume paths to prevent keyword matches inside them
|
|
|
|
const PATH_MODE = { match: /(\/[a-z._-]+)+/ };
|
|
|
|
|
|
|
|
// http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html
|
|
|
|
const SHELL_BUILT_INS = [
|
|
|
|
"break",
|
|
|
|
"cd",
|
|
|
|
"continue",
|
|
|
|
"eval",
|
|
|
|
"exec",
|
|
|
|
"exit",
|
|
|
|
"export",
|
|
|
|
"getopts",
|
|
|
|
"hash",
|
|
|
|
"pwd",
|
|
|
|
"readonly",
|
|
|
|
"return",
|
|
|
|
"shift",
|
|
|
|
"test",
|
|
|
|
"times",
|
|
|
|
"trap",
|
|
|
|
"umask",
|
|
|
|
"unset"
|
|
|
|
];
|
|
|
|
|
|
|
|
const BASH_BUILT_INS = [
|
|
|
|
"alias",
|
|
|
|
"bind",
|
|
|
|
"builtin",
|
|
|
|
"caller",
|
|
|
|
"command",
|
|
|
|
"declare",
|
|
|
|
"echo",
|
|
|
|
"enable",
|
|
|
|
"help",
|
|
|
|
"let",
|
|
|
|
"local",
|
|
|
|
"logout",
|
|
|
|
"mapfile",
|
|
|
|
"printf",
|
|
|
|
"read",
|
|
|
|
"readarray",
|
|
|
|
"source",
|
|
|
|
"type",
|
|
|
|
"typeset",
|
|
|
|
"ulimit",
|
|
|
|
"unalias"
|
|
|
|
];
|
|
|
|
|
|
|
|
const ZSH_BUILT_INS = [
|
|
|
|
"autoload",
|
|
|
|
"bg",
|
|
|
|
"bindkey",
|
|
|
|
"bye",
|
|
|
|
"cap",
|
|
|
|
"chdir",
|
|
|
|
"clone",
|
|
|
|
"comparguments",
|
|
|
|
"compcall",
|
|
|
|
"compctl",
|
|
|
|
"compdescribe",
|
|
|
|
"compfiles",
|
|
|
|
"compgroups",
|
|
|
|
"compquote",
|
|
|
|
"comptags",
|
|
|
|
"comptry",
|
|
|
|
"compvalues",
|
|
|
|
"dirs",
|
|
|
|
"disable",
|
|
|
|
"disown",
|
|
|
|
"echotc",
|
|
|
|
"echoti",
|
|
|
|
"emulate",
|
|
|
|
"fc",
|
|
|
|
"fg",
|
|
|
|
"float",
|
|
|
|
"functions",
|
|
|
|
"getcap",
|
|
|
|
"getln",
|
|
|
|
"history",
|
|
|
|
"integer",
|
|
|
|
"jobs",
|
|
|
|
"kill",
|
|
|
|
"limit",
|
|
|
|
"log",
|
|
|
|
"noglob",
|
|
|
|
"popd",
|
|
|
|
"print",
|
|
|
|
"pushd",
|
|
|
|
"pushln",
|
|
|
|
"rehash",
|
|
|
|
"sched",
|
|
|
|
"setcap",
|
|
|
|
"setopt",
|
|
|
|
"stat",
|
|
|
|
"suspend",
|
|
|
|
"ttyctl",
|
|
|
|
"unfunction",
|
|
|
|
"unhash",
|
|
|
|
"unlimit",
|
|
|
|
"unsetopt",
|
|
|
|
"vared",
|
|
|
|
"wait",
|
|
|
|
"whence",
|
|
|
|
"where",
|
|
|
|
"which",
|
|
|
|
"zcompile",
|
|
|
|
"zformat",
|
|
|
|
"zftp",
|
|
|
|
"zle",
|
|
|
|
"zmodload",
|
|
|
|
"zparseopts",
|
|
|
|
"zprof",
|
|
|
|
"zpty",
|
|
|
|
"zregexparse",
|
|
|
|
"zsocket",
|
|
|
|
"zstyle",
|
|
|
|
"ztcp"
|
|
|
|
];
|
|
|
|
|
|
|
|
const GNU_CORE_UTILS = [
|
|
|
|
"chcon",
|
|
|
|
"chgrp",
|
|
|
|
"chown",
|
|
|
|
"chmod",
|
|
|
|
"cp",
|
|
|
|
"dd",
|
|
|
|
"df",
|
|
|
|
"dir",
|
|
|
|
"dircolors",
|
|
|
|
"ln",
|
|
|
|
"ls",
|
|
|
|
"mkdir",
|
|
|
|
"mkfifo",
|
|
|
|
"mknod",
|
|
|
|
"mktemp",
|
|
|
|
"mv",
|
|
|
|
"realpath",
|
|
|
|
"rm",
|
|
|
|
"rmdir",
|
|
|
|
"shred",
|
|
|
|
"sync",
|
|
|
|
"touch",
|
|
|
|
"truncate",
|
|
|
|
"vdir",
|
|
|
|
"b2sum",
|
|
|
|
"base32",
|
|
|
|
"base64",
|
|
|
|
"cat",
|
|
|
|
"cksum",
|
|
|
|
"comm",
|
|
|
|
"csplit",
|
|
|
|
"cut",
|
|
|
|
"expand",
|
|
|
|
"fmt",
|
|
|
|
"fold",
|
|
|
|
"head",
|
|
|
|
"join",
|
|
|
|
"md5sum",
|
|
|
|
"nl",
|
|
|
|
"numfmt",
|
|
|
|
"od",
|
|
|
|
"paste",
|
|
|
|
"ptx",
|
|
|
|
"pr",
|
|
|
|
"sha1sum",
|
|
|
|
"sha224sum",
|
|
|
|
"sha256sum",
|
|
|
|
"sha384sum",
|
|
|
|
"sha512sum",
|
|
|
|
"shuf",
|
|
|
|
"sort",
|
|
|
|
"split",
|
|
|
|
"sum",
|
|
|
|
"tac",
|
|
|
|
"tail",
|
|
|
|
"tr",
|
|
|
|
"tsort",
|
|
|
|
"unexpand",
|
|
|
|
"uniq",
|
|
|
|
"wc",
|
|
|
|
"arch",
|
|
|
|
"basename",
|
|
|
|
"chroot",
|
|
|
|
"date",
|
|
|
|
"dirname",
|
|
|
|
"du",
|
|
|
|
"echo",
|
|
|
|
"env",
|
|
|
|
"expr",
|
|
|
|
"factor",
|
|
|
|
// "false", // keyword literal already
|
|
|
|
"groups",
|
|
|
|
"hostid",
|
|
|
|
"id",
|
|
|
|
"link",
|
|
|
|
"logname",
|
|
|
|
"nice",
|
|
|
|
"nohup",
|
|
|
|
"nproc",
|
|
|
|
"pathchk",
|
|
|
|
"pinky",
|
|
|
|
"printenv",
|
|
|
|
"printf",
|
|
|
|
"pwd",
|
|
|
|
"readlink",
|
|
|
|
"runcon",
|
|
|
|
"seq",
|
|
|
|
"sleep",
|
|
|
|
"stat",
|
|
|
|
"stdbuf",
|
|
|
|
"stty",
|
|
|
|
"tee",
|
|
|
|
"test",
|
|
|
|
"timeout",
|
|
|
|
// "true", // keyword literal already
|
|
|
|
"tty",
|
|
|
|
"uname",
|
|
|
|
"unlink",
|
|
|
|
"uptime",
|
|
|
|
"users",
|
|
|
|
"who",
|
|
|
|
"whoami",
|
|
|
|
"yes"
|
|
|
|
];
|
|
|
|
|
|
|
|
return {
|
|
|
|
name: 'Bash',
|
|
|
|
aliases: [ 'sh' ],
|
|
|
|
keywords: {
|
|
|
|
$pattern: /\b[a-z][a-z0-9._-]+\b/,
|
|
|
|
keyword: KEYWORDS,
|
|
|
|
literal: LITERALS,
|
|
|
|
built_in: [
|
|
|
|
...SHELL_BUILT_INS,
|
|
|
|
...BASH_BUILT_INS,
|
|
|
|
// Shell modifiers
|
|
|
|
"set",
|
|
|
|
"shopt",
|
|
|
|
...ZSH_BUILT_INS,
|
|
|
|
...GNU_CORE_UTILS
|
|
|
|
]
|
|
|
|
},
|
|
|
|
contains: [
|
|
|
|
KNOWN_SHEBANG, // to catch known shells and boost relevancy
|
|
|
|
hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang
|
|
|
|
FUNCTION,
|
|
|
|
ARITHMETIC,
|
|
|
|
hljs.HASH_COMMENT_MODE,
|
|
|
|
HERE_DOC,
|
|
|
|
PATH_MODE,
|
|
|
|
QUOTE_STRING,
|
|
|
|
ESCAPED_QUOTE,
|
|
|
|
APOS_STRING,
|
|
|
|
VAR
|
|
|
|
]
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = bash;
|