1(function (Prism) { 2 // $ set | grep '^[A-Z][^[:space:]]*=' | cut -d= -f1 | tr '\n' '|' 3 // + LC_ALL, RANDOM, REPLY, SECONDS. 4 // + make sure PS1..4 are here as they are not always set, 5 // - some useless things. 6 var envVars = '\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_
6CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b'; 7 8 var commandAfterHeredoc = { 9 pattern: /(^(["']?)\w+\2)[ \t]+\S.*/, 10 lookbehind: true, 11 alias: 'punctuation', // this looks reasonably well in all themes 12 inside: null // see below 13 }; 14 15 var insideString = { 16 'bash': commandAfterHeredoc, 17 'environment': { 18 pattern: RegExp('\\$' + envVars), 19 alias: 'constant' 20 }, 21 'variable': [ 22 // [0]: Arithmetic Environment 23 { 24 pattern: /\$?\(\([\s\S]+?\)\)/, 25 greedy: true, 26 inside: { 27 // If there is a $ sign at the beginning highlight $(( and )) as variable 28 'variable': [ 29 { 30 pattern: /(^\$\(\([\s\S]+)\)\)/, 31 lookbehind: true 32 }, 33 /^\$\(\(/ 34 ], 35 'number': /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/, 36 // Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic 37 'operator': /--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/, 38 // If there is no $ sign at the beginning highlight (( and )) as punctuation 39 'punctuation': /\(\(?|\)\)?|,|;/ 40 } 41 }, 42 // [1]: Command Substitution 43 { 44 pattern: /\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/, 45 greedy: true, 46 inside: { 47 'variable': /^\$\(|^`|\)$|`$/ 48 } 49 }, 50 // [2]: Brace expansion 51 { 52 pattern: /\$\{[^}]+\}/, 53 greedy: true, 54 inside: { 55 'operator': /:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/, 56 'punctuation': /[\[\]]/, 57 'environment': { 58 pattern: RegExp('(\\{)' + envVars), 59 lookbehind: true, 60 alias: 'constant' 61 } 62 } 63 }, 64 /\$(?:\w+|[#?*!@$])/ 65 ], 66 // Escape sequences from echo and printf's manuals, and escaped quotes. 67 'entity': /\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/ 68 }; 69 70 Prism.languages.bash = { 71 'shebang': { 72 pattern: /^#!\s*\/.*/, 73 alias: 'important' 74 }, 75 'comment': { 76 pattern: /(^|[^"{\\$])#.*/, 77 lookbehind: true 78 }, 79 'function-name': [ 80 // a) function foo { 81 // b) foo() { 82 // c) function foo() { 83 // but not âfoo {â 84 { 85 // a) and c) 86 pattern: /(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/, 87 lookbehind: true, 88 alias: 'function' 89 }, 90 { 91 // b) 92 pattern: /\b[\w-]+(?=\s*\(\s*\)\s*\{)/, 93 alias: 'function' 94 } 95 ], 96 // Highlight variable names as variables in for and select beginnings. 97 'for-or-select': { 98 pattern: /(\b(?:for|select)\s+)\w+(?=\s+in\s)/, 99 alias: 'variable', 100 lookbehind: true 101 }, 102 // Highlight variable names as variables in the left-hand part 103 // of assignments (â=â and â+=â). 104 'assign-left': { 105 pattern: /(^|[\s;|&]|[<>]\()\w+(?=\+?=)/, 106 inside: { 107 'environment': { 108 pattern: RegExp('(^|[\\s;|&]|[<>]\\()' + envVars), 109 lookbehind: true, 110 alias: 'constant' 111 } 112 }, 113 alias: 'variable', 114 lookbehind: true 115 }, 116 'string': [ 117 // Support for Here-documents https://en.wikipedia.org/wiki/Here_document 118 { 119 pattern: /((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/, 120 lookbehind: true, 121 greedy: true, 122 inside: insideString 123 }, 124 // Here-document with quotes around the tag 125 // â No expansion (so no âinsideâ). 126 { 127 pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/, 128 lookbehind: true, 129 greedy: true, 130 inside: { 131 'bash': commandAfterHeredoc 132 } 133 }, 134 // âNormalâ string 135 { 136 // https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html 137 pattern: /(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/, 138 lookbehind: true, 139 greedy: true, 140 inside: insideString 141 }, 142 { 143 // https://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html 144 pattern: /(^|[^$\\])'[^']*'/, 145 lookbehind: true, 146 greedy: true 147 }, 148 { 149 // https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html 150 pattern: /\$'(?:[^'\\]|\\[\s\S])*'/, 151 greedy: true, 152 inside: { 153 'entity': insideString.entity 154 } 155 } 156 ], 157 'environment': { 158 pattern: RegExp('\\$?' + envVars), 159 alias: 'constant' 160 }, 161 'variable': insideString.variable, 162 'function': { 163 pattern: /(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|
163ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/, 164 lookbehind: true 165 }, 166 'keyword': { 167 pattern: /(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/, 168 lookbehind: true 169 }, 170 // https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html 171 'builtin': { 172 pattern: /(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/, 173 lookbehind: true, 174 // Alias added to make those easier to distinguish from strings. 175 alias: 'class-name' 176 }, 177 'boolean': { 178 pattern: /(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/, 179 lookbehind: true 180 }, 181 'file-descriptor': { 182 pattern: /\B&\d\b/, 183 alias: 'important' 184 }, 185 'operator': { 186 // Lots of redirections here, but not just that. 187 pattern: /\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/, 188 inside: { 189 'file-descriptor': { 190 pattern: /^\d/, 191 alias: 'important' 192 } 193 } 194 }, 195 'punctuation': /\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/, 196 'number': { 197 pattern: /(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/, 198 lookbehind: true 199 } 200 }; 201 202 commandAfterHeredoc.inside = Prism.languages.bash; 203 204 /* Patterns in command substitution. */ 205 var toBeCopied = [ 206 'comment', 207 'function-name', 208 'for-or-select', 209 'assign-left', 210 'string', 211 'environment', 212 'function', 213 'keyword', 214 'builtin', 215 'boolean', 216 'file-descriptor', 217 'operator', 218 'punctuation', 219 'number' 220 ]; 221 var inside = insideString.variable[1].inside; 222 for (var i = 0; i < toBeCopied.length; i++) { 223 inside[toBeCopied[i]] = Prism.languages.bash[toBeCopied[i]]; 224 } 225 226 Prism.languages.shell = Prism.languages.bash; 227}(Prism));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.