1/* builtins.c -- the built in shell commands. */
2
3/* This file is manufactured by ./mkbuiltins, and should not be
4   edited by hand.  See the source to mkbuiltins for details. */
5
6/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
7
8   This file is part of GNU Bash, the Bourne Again SHell.
9
10   Bash is free software; you can redistribute it and/or modify it
11   under the terms of the GNU General Public License as published by
12   the Free Software Foundation; either version 2, or (at your option)
13   any later version.
14
15   Bash is distributed in the hope that it will be useful, but WITHOUT
16   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
18   License for more details.
19
20   You should have received a copy of the GNU General Public License
21   along with Bash; see the file COPYING.  If not, write to the Free
22   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
23
24/* The list of shell builtins.  Each element is name, function, flags,
25   long-doc, short-doc.  The long-doc field contains a pointer to an array
26   of help lines.  The function takes a WORD_LIST *; the first word in the
27   list is the first arg to the command.  The list has already had word
28   expansion performed.
29
30   Functions which need to look at only the simple commands (e.g.
31   the enable_builtin ()), should ignore entries where
32   (array[i].function == (sh_builtin_func_t *)NULL).  Such entries are for
33   the list of shell reserved control structures, like `if' and `while'.
34   The end of the list is denoted with a NULL name field. */
35
36#include "../builtins.h"
37#include "builtext.h"
38#include "bashintl.h"
39
40struct builtin static_shell_builtins[] = {
41#if defined (ALIAS)
42  { "alias", alias_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | ASSIGNMENT_BUILTIN, alias_doc,
43     "alias [-p] [name[=value] ... ]", (char *)NULL },
44#endif /* ALIAS */
45#if defined (ALIAS)
46  { "unalias", unalias_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, unalias_doc,
47     "unalias [-a] name [name ...]", (char *)NULL },
48#endif /* ALIAS */
49#if defined (READLINE)
50  { "bind", bind_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, bind_doc,
51     "bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function or readline-command]", (char *)NULL },
52#endif /* READLINE */
53  { "break", break_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, break_doc,
54     "break [n]", (char *)NULL },
55  { "continue", continue_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, continue_doc,
56     "continue [n]", (char *)NULL },
57  { "builtin", builtin_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, builtin_doc,
58     "builtin [shell-builtin [arg ...]]", (char *)NULL },
59#if defined (DEBUGGER)
60  { "caller", caller_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, caller_doc,
61     "caller [EXPR]", (char *)NULL },
62#endif /* DEBUGGER */
63  { "cd", cd_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, cd_doc,
64     "cd [-L|-P] [dir]", (char *)NULL },
65  { "pwd", pwd_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, pwd_doc,
66     "pwd [-LP]", (char *)NULL },
67  { ":", colon_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, colon_doc,
68     ":", (char *)NULL },
69  { "true", colon_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, true_doc,
70     "true", (char *)NULL },
71  { "false", false_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, false_doc,
72     "false", (char *)NULL },
73  { "command", command_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, command_doc,
74     "command [-pVv] command [arg ...]", (char *)NULL },
75  { "declare", declare_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | ASSIGNMENT_BUILTIN, declare_doc,
76     "declare [-afFirtx] [-p] [name[=value] ...]", (char *)NULL },
77  { "typeset", declare_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | ASSIGNMENT_BUILTIN, typeset_doc,
78     "typeset [-afFirtx] [-p] name[=value] ...", (char *)NULL },
79  { "local", local_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | ASSIGNMENT_BUILTIN, local_doc,
80     "local name[=value] ...", (char *)NULL },
81#if defined (V9_ECHO)
82  { "echo", echo_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, echo_doc,
83     "echo [-neE] [arg ...]", (char *)NULL },
84#endif /* V9_ECHO */
85#if !defined (V9_ECHO)
86  { "echo", echo_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, echo_doc,
87     "echo [-n] [arg ...]", (char *)NULL },
88#endif /* !V9_ECHO */
89  { "enable", enable_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, enable_doc,
90     "enable [-pnds] [-a] [-f filename] [name ...]", (char *)NULL },
91  { "eval", eval_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, eval_doc,
92     "eval [arg ...]", (char *)NULL },
93  { "getopts", getopts_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, getopts_doc,
94     "getopts optstring name [arg]", (char *)NULL },
95  { "exec", exec_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, exec_doc,
96     "exec [-cl] [-a name] file [redirection ...]", (char *)NULL },
97  { "exit", exit_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, exit_doc,
98     "exit [n]", (char *)NULL },
99  { "logout", logout_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, logout_doc,
100     "logout", (char *)NULL },
101#if defined (HISTORY)
102  { "fc", fc_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, fc_doc,
103     "fc [-e ename] [-nlr] [first] [last] or fc -s [pat=rep] [cmd]", (char *)NULL },
104#endif /* HISTORY */
105#if defined (JOB_CONTROL)
106  { "fg", fg_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, fg_doc,
107     "fg [job_spec]", (char *)NULL },
108#endif /* JOB_CONTROL */
109#if defined (JOB_CONTROL)
110  { "bg", bg_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, bg_doc,
111     "bg [job_spec ...]", (char *)NULL },
112#endif /* JOB_CONTROL */
113  { "hash", hash_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, hash_doc,
114     "hash [-lr] [-p pathname] [-dt] [name ...]", (char *)NULL },
115#if defined (HELP_BUILTIN)
116  { "help", help_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, help_doc,
117     "help [-s] [pattern ...]", (char *)NULL },
118#endif /* HELP_BUILTIN */
119#if defined (HISTORY)
120  { "history", history_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, history_doc,
121     "history [-c] [-d offset] [n] or history -awrn [filename] or history -ps arg [arg...]", (char *)NULL },
122#endif /* HISTORY */
123#if defined (JOB_CONTROL)
124  { "jobs", jobs_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, jobs_doc,
125     "jobs [-lnprs] [jobspec ...] or jobs -x command [args]", (char *)NULL },
126#endif /* JOB_CONTROL */
127#if defined (JOB_CONTROL)
128  { "disown", disown_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, disown_doc,
129     "disown [-h] [-ar] [jobspec ...]", (char *)NULL },
130#endif /* JOB_CONTROL */
131  { "kill", kill_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, kill_doc,
132     "kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]", (char *)NULL },
133  { "let", let_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, let_doc,
134     "let arg [arg ...]", (char *)NULL },
135  { "read", read_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, read_doc,
136     "read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...]", (char *)NULL },
137  { "return", return_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, return_doc,
138     "return [n]", (char *)NULL },
139  { "set", set_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, set_doc,
140     "set [--abefhkmnptuvxBCHP] [-o option] [arg ...]", (char *)NULL },
141  { "unset", unset_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, unset_doc,
142     "unset [-f] [-v] [name ...]", (char *)NULL },
143  { "export", export_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN | ASSIGNMENT_BUILTIN, export_doc,
144     "export [-nf] [name[=value] ...] or export -p", (char *)NULL },
145  { "readonly", readonly_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN | ASSIGNMENT_BUILTIN, readonly_doc,
146     "readonly [-af] [name[=value] ...] or readonly -p", (char *)NULL },
147  { "shift", shift_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, shift_doc,
148     "shift [n]", (char *)NULL },
149  { "source", source_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, source_doc,
150     "source filename [arguments]", (char *)NULL },
151  { ".", source_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, dot_doc,
152     ". filename [arguments]", (char *)NULL },
153#if defined (JOB_CONTROL)
154  { "suspend", suspend_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, suspend_doc,
155     "suspend [-f]", (char *)NULL },
156#endif /* JOB_CONTROL */
157  { "test", test_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, test_doc,
158     "test [expr]", (char *)NULL },
159  { "[", test_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, test_bracket_doc,
160     "[ arg... ]", (char *)NULL },
161  { "times", times_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, times_doc,
162     "times", (char *)NULL },
163  { "trap", trap_builtin, BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN, trap_doc,
164     "trap [-lp] [arg signal_spec ...]", (char *)NULL },
165  { "type", type_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, type_doc,
166     "type [-afptP] name [name ...]", (char *)NULL },
167#if !defined (_MINIX)
168  { "ulimit", ulimit_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, ulimit_doc,
169     "ulimit [-SHacdfilmnpqstuvx] [limit]", (char *)NULL },
170#endif /* !_MINIX */
171  { "umask", umask_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, umask_doc,
172     "umask [-p] [-S] [mode]", (char *)NULL },
173#if defined (JOB_CONTROL)
174  { "wait", wait_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, wait_doc,
175     "wait [n]", (char *)NULL },
176#endif /* JOB_CONTROL */
177#if !defined (JOB_CONTROL)
178  { "wait", wait_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, wait_doc,
179     "wait [n]", (char *)NULL },
180#endif /* !JOB_CONTROL */
181  { "for", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, for_doc,
182     "for NAME [in WORDS ... ;] do COMMANDS; done", (char *)NULL },
183  { "for ((", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, arith_for_doc,
184     "for (( exp1; exp2; exp3 )); do COMMANDS; done", (char *)NULL },
185  { "select", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, select_doc,
186     "select NAME [in WORDS ... ;] do COMMANDS; done", (char *)NULL },
187  { "time", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, time_doc,
188     "time [-p] PIPELINE", (char *)NULL },
189  { "case", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, case_doc,
190     "case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac", (char *)NULL },
191  { "if", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, if_doc,
192     "if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi", (char *)NULL },
193  { "while", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, while_doc,
194     "while COMMANDS; do COMMANDS; done", (char *)NULL },
195  { "until", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, until_doc,
196     "until COMMANDS; do COMMANDS; done", (char *)NULL },
197  { "function", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, function_doc,
198     "function NAME { COMMANDS ; } or NAME () { COMMANDS ; }", (char *)NULL },
199  { "{ ... }", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, grouping_braces_doc,
200     "{ COMMANDS ; }", (char *)NULL },
201  { "%", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, fg_percent_doc,
202     "JOB_SPEC [&]", (char *)NULL },
203  { "(( ... ))", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, arith_doc,
204     "(( expression ))", (char *)NULL },
205  { "[[ ... ]]", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, conditional_doc,
206     "[[ expression ]]", (char *)NULL },
207  { "variables", (sh_builtin_func_t *)0x0, BUILTIN_ENABLED | STATIC_BUILTIN, variable_help_doc,
208     "variables - Some variable names and meanings", (char *)NULL },
209#if defined (PUSHD_AND_POPD)
210  { "pushd", pushd_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, pushd_doc,
211     "pushd [dir | +N | -N] [-n]", (char *)NULL },
212#endif /* PUSHD_AND_POPD */
213#if defined (PUSHD_AND_POPD)
214  { "popd", popd_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, popd_doc,
215     "popd [+N | -N] [-n]", (char *)NULL },
216#endif /* PUSHD_AND_POPD */
217#if defined (PUSHD_AND_POPD)
218  { "dirs", dirs_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, dirs_doc,
219     "dirs [-clpv] [+N] [-N]", (char *)NULL },
220#endif /* PUSHD_AND_POPD */
221  { "shopt", shopt_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, shopt_doc,
222     "shopt [-pqsu] [-o long-option] optname [optname...]", (char *)NULL },
223  { "printf", printf_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, printf_doc,
224     "printf [-v var] format [arguments]", (char *)NULL },
225#if defined (PROGRAMMABLE_COMPLETION)
226  { "complete", complete_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, complete_doc,
227     "complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...]", (char *)NULL },
228#endif /* PROGRAMMABLE_COMPLETION */
229#if defined (PROGRAMMABLE_COMPLETION)
230  { "compgen", compgen_builtin, BUILTIN_ENABLED | STATIC_BUILTIN, compgen_doc,
231     "compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [word]", (char *)NULL },
232#endif /* PROGRAMMABLE_COMPLETION */
233  { (char *)0x0, (sh_builtin_func_t *)0x0, 0, (char **)0x0, (char *)0x0 }
234};
235
236struct builtin *shell_builtins = static_shell_builtins;
237struct builtin *current_builtin;
238
239int num_shell_builtins =
240	sizeof (static_shell_builtins) / sizeof (struct builtin) - 1;
241#if defined (ALIAS)
242char * const alias_doc[] = {
243#if defined (HELP_BUILTIN)
244N_("`alias' with no arguments or with the -p option prints the list\n\
245    of aliases in the form alias NAME=VALUE on standard output.\n\
246    Otherwise, an alias is defined for each NAME whose VALUE is given.\n\
247    A trailing space in VALUE causes the next word to be checked for\n\
248    alias substitution when the alias is expanded.  Alias returns\n\
249    true unless a NAME is given for which no alias has been defined."),
250#endif /* HELP_BUILTIN */
251  (char *)NULL
252};
253#endif /* ALIAS */
254#if defined (ALIAS)
255char * const unalias_doc[] = {
256#if defined (HELP_BUILTIN)
257N_("Remove NAMEs from the list of defined aliases.  If the -a option is given,\n\
258    then remove all alias definitions."),
259#endif /* HELP_BUILTIN */
260  (char *)NULL
261};
262#endif /* ALIAS */
263#if defined (READLINE)
264char * const bind_doc[] = {
265#if defined (HELP_BUILTIN)
266N_("Bind a key sequence to a Readline function or a macro, or set\n\
267    a Readline variable.  The non-option argument syntax is equivalent\n\
268    to that found in ~/.inputrc, but must be passed as a single argument:\n\
269    bind '\"\\C-x\\C-r\": re-read-init-file'.\n\
270    bind accepts the following options:\n\
271      -m  keymap         Use `keymap' as the keymap for the duration of this\n\
272                         command.  Acceptable keymap names are emacs,\n\
273                         emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,\n\
274                         vi-command, and vi-insert.\n\
275      -l                 List names of functions.\n\
276      -P                 List function names and bindings.\n\
277      -p                 List functions and bindings in a form that can be\n\
278                         reused as input.\n\
279      -r  keyseq         Remove the binding for KEYSEQ.\n\
280      -x  keyseq:shell-command	Cause SHELL-COMMAND to be executed when\n\
281    				KEYSEQ is entered.\n\
282      -f  filename       Read key bindings from FILENAME.\n\
283      -q  function-name  Query about which keys invoke the named function.\n\
284      -u  function-name  Unbind all keys which are bound to the named function.\n\
285      -V                 List variable names and values\n\
286      -v                 List variable names and values in a form that can\n\
287                         be reused as input.\n\
288      -S                 List key sequences that invoke macros and their values\n\
289      -s                 List key sequences that invoke macros and their values\n\
290                         in a form that can be reused as input."),
291#endif /* HELP_BUILTIN */
292  (char *)NULL
293};
294#endif /* READLINE */
295char * const break_doc[] = {
296#if defined (HELP_BUILTIN)
297N_("Exit from within a FOR, WHILE or UNTIL loop.  If N is specified,\n\
298    break N levels."),
299#endif /* HELP_BUILTIN */
300  (char *)NULL
301};
302char * const continue_doc[] = {
303#if defined (HELP_BUILTIN)
304N_("Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop.\n\
305    If N is specified, resume at the N-th enclosing loop."),
306#endif /* HELP_BUILTIN */
307  (char *)NULL
308};
309char * const builtin_doc[] = {
310#if defined (HELP_BUILTIN)
311N_("Run a shell builtin.  This is useful when you wish to rename a\n\
312    shell builtin to be a function, but need the functionality of the\n\
313    builtin within the function itself."),
314#endif /* HELP_BUILTIN */
315  (char *)NULL
316};
317#if defined (DEBUGGER)
318char * const caller_doc[] = {
319#if defined (HELP_BUILTIN)
320N_("Returns the context of the current subroutine call.\n\
321    \n\
322    Without EXPR, returns \"$line $filename\".  With EXPR,\n\
323    returns \"$line $subroutine $filename\"; this extra information\n\
324    can be used to provide a stack trace.\n\
325    \n\
326    The value of EXPR indicates how many call frames to go back before the\n\
327    current one; the top frame is frame 0."),
328#endif /* HELP_BUILTIN */
329  (char *)NULL
330};
331#endif /* DEBUGGER */
332char * const cd_doc[] = {
333#if defined (HELP_BUILTIN)
334N_("Change the current directory to DIR.  The variable $HOME is the\n\
335    default DIR.  The variable CDPATH defines the search path for\n\
336    the directory containing DIR.  Alternative directory names in CDPATH\n\
337    are separated by a colon (:).  A null directory name is the same as\n\
338    the current directory, i.e. `.'.  If DIR begins with a slash (/),\n\
339    then CDPATH is not used.  If the directory is not found, and the\n\
340    shell option `cdable_vars' is set, then try the word as a variable\n\
341    name.  If that variable has a value, then cd to the value of that\n\
342    variable.  The -P option says to use the physical directory structure\n\
343    instead of following symbolic links; the -L option forces symbolic links\n\
344    to be followed."),
345#endif /* HELP_BUILTIN */
346  (char *)NULL
347};
348char * const pwd_doc[] = {
349#if defined (HELP_BUILTIN)
350N_("Print the current working directory.  With the -P option, pwd prints\n\
351    the physical directory, without any symbolic links; the -L option\n\
352    makes pwd follow symbolic links."),
353#endif /* HELP_BUILTIN */
354  (char *)NULL
355};
356char * const colon_doc[] = {
357#if defined (HELP_BUILTIN)
358N_("No effect; the command does nothing.  A zero exit code is returned."),
359#endif /* HELP_BUILTIN */
360  (char *)NULL
361};
362char * const true_doc[] = {
363#if defined (HELP_BUILTIN)
364N_("Return a successful result."),
365#endif /* HELP_BUILTIN */
366  (char *)NULL
367};
368char * const false_doc[] = {
369#if defined (HELP_BUILTIN)
370N_("Return an unsuccessful result."),
371#endif /* HELP_BUILTIN */
372  (char *)NULL
373};
374char * const command_doc[] = {
375#if defined (HELP_BUILTIN)
376N_("Runs COMMAND with ARGS ignoring shell functions.  If you have a shell\n\
377    function called `ls', and you wish to call the command `ls', you can\n\
378    say \"command ls\".  If the -p option is given, a default value is used\n\
379    for PATH that is guaranteed to find all of the standard utilities.  If\n\
380    the -V or -v option is given, a string is printed describing COMMAND.\n\
381    The -V option produces a more verbose description."),
382#endif /* HELP_BUILTIN */
383  (char *)NULL
384};
385char * const declare_doc[] = {
386#if defined (HELP_BUILTIN)
387N_("Declare variables and/or give them attributes.  If no NAMEs are\n\
388    given, then display the values of variables instead.  The -p option\n\
389    will display the attributes and values of each NAME.\n\
390    \n\
391    The flags are:\n\
392    \n\
393      -a	to make NAMEs arrays (if supported)\n\
394      -f	to select from among function names only\n\
395      -F	to display function names (and line number and source file name if\n\
396    	debugging) without definitions\n\
397      -i	to make NAMEs have the `integer' attribute\n\
398      -r	to make NAMEs readonly\n\
399      -t	to make NAMEs have the `trace' attribute\n\
400      -x	to make NAMEs export\n\
401    \n\
402    Variables with the integer attribute have arithmetic evaluation (see\n\
403    `let') done when the variable is assigned to.\n\
404    \n\
405    When displaying values of variables, -f displays a function's name\n\
406    and definition.  The -F option restricts the display to function\n\
407    name only.\n\
408    \n\
409    Using `+' instead of `-' turns off the given attribute instead.  When\n\
410    used in a function, makes NAMEs local, as with the `local' command."),
411#endif /* HELP_BUILTIN */
412  (char *)NULL
413};
414char * const typeset_doc[] = {
415#if defined (HELP_BUILTIN)
416N_("Obsolete.  See `declare'."),
417#endif /* HELP_BUILTIN */
418  (char *)NULL
419};
420char * const local_doc[] = {
421#if defined (HELP_BUILTIN)
422N_("Create a local variable called NAME, and give it VALUE.  LOCAL\n\
423    can only be used within a function; it makes the variable NAME\n\
424    have a visible scope restricted to that function and its children."),
425#endif /* HELP_BUILTIN */
426  (char *)NULL
427};
428#if defined (V9_ECHO)
429char * const echo_doc[] = {
430#if defined (HELP_BUILTIN)
431N_("Output the ARGs.  If -n is specified, the trailing newline is\n\
432    suppressed.  If the -e option is given, interpretation of the\n\
433    following backslash-escaped characters is turned on:\n\
434    	\\a	alert (bell)\n\
435    	\\b	backspace\n\
436    	\\c	suppress trailing newline\n\
437    	\\E	escape character\n\
438    	\\f	form feed\n\
439    	\\n	new line\n\
440    	\\r	carriage return\n\
441    	\\t	horizontal tab\n\
442    	\\v	vertical tab\n\
443    	\\\\	backslash\n\
444    	\\0nnn	the character whose ASCII code is NNN (octal).  NNN can be\n\
445    		0 to 3 octal digits\n\
446    \n\
447    You can explicitly turn off the interpretation of the above characters\n\
448    with the -E option."),
449#endif /* HELP_BUILTIN */
450  (char *)NULL
451};
452#endif /* V9_ECHO */
453#if !defined (V9_ECHO)
454char * const echo_doc[] = {
455#if defined (HELP_BUILTIN)
456N_("Output the ARGs.  If -n is specified, the trailing newline is suppressed."),
457#endif /* HELP_BUILTIN */
458  (char *)NULL
459};
460#endif /* !V9_ECHO */
461char * const enable_doc[] = {
462#if defined (HELP_BUILTIN)
463N_("Enable and disable builtin shell commands.  This allows\n\
464    you to use a disk command which has the same name as a shell\n\
465    builtin without specifying a full pathname.  If -n is used, the\n\
466    NAMEs become disabled; otherwise NAMEs are enabled.  For example,\n\
467    to use the `test' found in $PATH instead of the shell builtin\n\
468    version, type `enable -n test'.  On systems supporting dynamic\n\
469    loading, the -f option may be used to load new builtins from the\n\
470    shared object FILENAME.  The -d option will delete a builtin\n\
471    previously loaded with -f.  If no non-option names are given, or\n\
472    the -p option is supplied, a list of builtins is printed.  The\n\
473    -a option means to print every builtin with an indication of whether\n\
474    or not it is enabled.  The -s option restricts the output to the POSIX.2\n\
475    `special' builtins.  The -n option displays a list of all disabled builtins."),
476#endif /* HELP_BUILTIN */
477  (char *)NULL
478};
479char * const eval_doc[] = {
480#if defined (HELP_BUILTIN)
481N_("Read ARGs as input to the shell and execute the resulting command(s)."),
482#endif /* HELP_BUILTIN */
483  (char *)NULL
484};
485char * const getopts_doc[] = {
486#if defined (HELP_BUILTIN)
487N_("Getopts is used by shell procedures to parse positional parameters.\n\
488    \n\
489    OPTSTRING contains the option letters to be recognized; if a letter\n\
490    is followed by a colon, the option is expected to have an argument,\n\
491    which should be separated from it by white space.\n\
492    \n\
493    Each time it is invoked, getopts will place the next option in the\n\
494    shell variable $name, initializing name if it does not exist, and\n\
495    the index of the next argument to be processed into the shell\n\
496    variable OPTIND.  OPTIND is initialized to 1 each time the shell or\n\
497    a shell script is invoked.  When an option requires an argument,\n\
498    getopts places that argument into the shell variable OPTARG.\n\
499    \n\
500    getopts reports errors in one of two ways.  If the first character\n\
501    of OPTSTRING is a colon, getopts uses silent error reporting.  In\n\
502    this mode, no error messages are printed.  If an invalid option is\n\
503    seen, getopts places the option character found into OPTARG.  If a\n\
504    required argument is not found, getopts places a ':' into NAME and\n\
505    sets OPTARG to the option character found.  If getopts is not in\n\
506    silent mode, and an invalid option is seen, getopts places '?' into\n\
507    NAME and unsets OPTARG.  If a required argument is not found, a '?'\n\
508    is placed in NAME, OPTARG is unset, and a diagnostic message is\n\
509    printed.\n\
510    \n\
511    If the shell variable OPTERR has the value 0, getopts disables the\n\
512    printing of error messages, even if the first character of\n\
513    OPTSTRING is not a colon.  OPTERR has the value 1 by default.\n\
514    \n\
515    Getopts normally parses the positional parameters ($0 - $9), but if\n\
516    more arguments are given, they are parsed instead."),
517#endif /* HELP_BUILTIN */
518  (char *)NULL
519};
520char * const exec_doc[] = {
521#if defined (HELP_BUILTIN)
522N_("Exec FILE, replacing this shell with the specified program.\n\
523    If FILE is not specified, the redirections take effect in this\n\
524    shell.  If the first argument is `-l', then place a dash in the\n\
525    zeroth arg passed to FILE, as login does.  If the `-c' option\n\
526    is supplied, FILE is executed with a null environment.  The `-a'\n\
527    option means to make set argv[0] of the executed process to NAME.\n\
528    If the file cannot be executed and the shell is not interactive,\n\
529    then the shell exits, unless the shell option `execfail' is set."),
530#endif /* HELP_BUILTIN */
531  (char *)NULL
532};
533char * const exit_doc[] = {
534#if defined (HELP_BUILTIN)
535N_("Exit the shell with a status of N.  If N is omitted, the exit status\n\
536    is that of the last command executed."),
537#endif /* HELP_BUILTIN */
538  (char *)NULL
539};
540char * const logout_doc[] = {
541#if defined (HELP_BUILTIN)
542N_("Logout of a login shell."),
543#endif /* HELP_BUILTIN */
544  (char *)NULL
545};
546#if defined (HISTORY)
547char * const fc_doc[] = {
548#if defined (HELP_BUILTIN)
549N_("fc is used to list or edit and re-execute commands from the history list.\n\
550    FIRST and LAST can be numbers specifying the range, or FIRST can be a\n\
551    string, which means the most recent command beginning with that\n\
552    string.\n\
553    \n\
554       -e ENAME selects which editor to use.  Default is FCEDIT, then EDITOR,\n\
555          then vi.\n\
556    \n\
557       -l means list lines instead of editing.\n\
558       -n means no line numbers listed.\n\
559       -r means reverse the order of the lines (making it newest listed first).\n\
560    \n\
561    With the `fc -s [pat=rep ...] [command]' format, the command is\n\
562    re-executed after the substitution OLD=NEW is performed.\n\
563    \n\
564    A useful alias to use with this is r='fc -s', so that typing `r cc'\n\
565    runs the last command beginning with `cc' and typing `r' re-executes\n\
566    the last command."),
567#endif /* HELP_BUILTIN */
568  (char *)NULL
569};
570#endif /* HISTORY */
571#if defined (JOB_CONTROL)
572char * const fg_doc[] = {
573#if defined (HELP_BUILTIN)
574N_("Place JOB_SPEC in the foreground, and make it the current job.  If\n\
575    JOB_SPEC is not present, the shell's notion of the current job is\n\
576    used."),
577#endif /* HELP_BUILTIN */
578  (char *)NULL
579};
580#endif /* JOB_CONTROL */
581#if defined (JOB_CONTROL)
582char * const bg_doc[] = {
583#if defined (HELP_BUILTIN)
584N_("Place each JOB_SPEC in the background, as if it had been started with\n\
585    `&'.  If JOB_SPEC is not present, the shell's notion of the current\n\
586    job is used."),
587#endif /* HELP_BUILTIN */
588  (char *)NULL
589};
590#endif /* JOB_CONTROL */
591char * const hash_doc[] = {
592#if defined (HELP_BUILTIN)
593N_("For each NAME, the full pathname of the command is determined and\n\
594    remembered.  If the -p option is supplied, PATHNAME is used as the\n\
595    full pathname of NAME, and no path search is performed.  The -r\n\
596    option causes the shell to forget all remembered locations.  The -d\n\
597    option causes the shell to forget the remembered location of each NAME.\n\
598    If the -t option is supplied the full pathname to which each NAME\n\
599    corresponds is printed.  If multiple NAME arguments are supplied with\n\
600    -t, the NAME is printed before the hashed full pathname.  The -l option\n\
601    causes output to be displayed in a format that may be reused as input.\n\
602    If no arguments are given, information about remembered commands is displayed."),
603#endif /* HELP_BUILTIN */
604  (char *)NULL
605};
606#if defined (HELP_BUILTIN)
607char * const help_doc[] = {
608#if defined (HELP_BUILTIN)
609N_("Display helpful information about builtin commands.  If PATTERN is\n\
610    specified, gives detailed help on all commands matching PATTERN,\n\
611    otherwise a list of the builtins is printed.  The -s option\n\
612    restricts the output for each builtin command matching PATTERN to\n\
613    a short usage synopsis."),
614#endif /* HELP_BUILTIN */
615  (char *)NULL
616};
617#endif /* HELP_BUILTIN */
618#if defined (HISTORY)
619char * const history_doc[] = {
620#if defined (HELP_BUILTIN)
621N_("Display the history list with line numbers.  Lines listed with\n\
622    with a `*' have been modified.  Argument of N says to list only\n\
623    the last N lines.  The `-c' option causes the history list to be\n\
624    cleared by deleting all of the entries.  The `-d' option deletes\n\
625    the history entry at offset OFFSET.  The `-w' option writes out the\n\
626    current history to the history file;  `-r' means to read the file and\n\
627    append the contents to the history list instead.  `-a' means\n\
628    to append history lines from this session to the history file.\n\
629    Argument `-n' means to read all history lines not already read\n\
630    from the history file and append them to the history list.\n\
631    \n\
632    If FILENAME is given, then that is used as the history file else\n\
633    if $HISTFILE has a value, that is used, else ~/.bash_history.\n\
634    If the -s option is supplied, the non-option ARGs are appended to\n\
635    the history list as a single entry.  The -p option means to perform\n\
636    history expansion on each ARG and display the result, without storing\n\
637    anything in the history list.\n\
638    \n\
639    If the $HISTTIMEFORMAT variable is set and not null, its value is used\n\
640    as a format string for strftime(3) to print the time stamp associated\n\
641    with each displayed history entry.  No time stamps are printed otherwise."),
642#endif /* HELP_BUILTIN */
643  (char *)NULL
644};
645#endif /* HISTORY */
646#if defined (JOB_CONTROL)
647char * const jobs_doc[] = {
648#if defined (HELP_BUILTIN)
649N_("Lists the active jobs.  The -l option lists process id's in addition\n\
650    to the normal information; the -p option lists process id's only.\n\
651    If -n is given, only processes that have changed status since the last\n\
652    notification are printed.  JOBSPEC restricts output to that job.  The\n\
653    -r and -s options restrict output to running and stopped jobs only,\n\
654    respectively.  Without options, the status of all active jobs is\n\
655    printed.  If -x is given, COMMAND is run after all job specifications\n\
656    that appear in ARGS have been replaced with the process ID of that job's\n\
657    process group leader."),
658#endif /* HELP_BUILTIN */
659  (char *)NULL
660};
661#endif /* JOB_CONTROL */
662#if defined (JOB_CONTROL)
663char * const disown_doc[] = {
664#if defined (HELP_BUILTIN)
665N_("By default, removes each JOBSPEC argument from the table of active jobs.\n\
666    If the -h option is given, the job is not removed from the table, but is\n\
667    marked so that SIGHUP is not sent to the job if the shell receives a\n\
668    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all\n\
669    jobs from the job table; the -r option means to remove only running jobs."),
670#endif /* HELP_BUILTIN */
671  (char *)NULL
672};
673#endif /* JOB_CONTROL */
674char * const kill_doc[] = {
675#if defined (HELP_BUILTIN)
676N_("Send the processes named by PID (or JOBSPEC) the signal SIGSPEC.  If\n\
677    SIGSPEC is not present, then SIGTERM is assumed.  An argument of `-l'\n\
678    lists the signal names; if arguments follow `-l' they are assumed to\n\
679    be signal numbers for which names should be listed.  Kill is a shell\n\
680    builtin for two reasons: it allows job IDs to be used instead of\n\
681    process IDs, and, if you have reached the limit on processes that\n\
682    you can create, you don't have to start a process to kill another one."),
683#endif /* HELP_BUILTIN */
684  (char *)NULL
685};
686char * const let_doc[] = {
687#if defined (HELP_BUILTIN)
688N_("Each ARG is an arithmetic expression to be evaluated.  Evaluation\n\
689    is done in fixed-width integers with no check for overflow, though\n\
690    division by 0 is trapped and flagged as an error.  The following\n\
691    list of operators is grouped into levels of equal-precedence operators.\n\
692    The levels are listed in order of decreasing precedence.\n\
693    \n\
694    	id++, id--	variable post-increment, post-decrement\n\
695    	++id, --id	variable pre-increment, pre-decrement\n\
696    	-, +		unary minus, plus\n\
697    	!, ~		logical and bitwise negation\n\
698    	**		exponentiation\n\
699    	*, /, %		multiplication, division, remainder\n\
700    	+, -		addition, subtraction\n\
701    	<<, >>		left and right bitwise shifts\n\
702    	<=, >=, <, >	comparison\n\
703    	==, !=		equality, inequality\n\
704    	&		bitwise AND\n\
705    	^		bitwise XOR\n\
706    	|		bitwise OR\n\
707    	&&		logical AND\n\
708    	||		logical OR\n\
709    	expr ? expr : expr\n\
710    			conditional operator\n\
711    	=, *=, /=, %=,\n\
712    	+=, -=, <<=, >>=,\n\
713    	&=, ^=, |=	assignment\n\
714    \n\
715    Shell variables are allowed as operands.  The name of the variable\n\
716    is replaced by its value (coerced to a fixed-width integer) within\n\
717    an expression.  The variable need not have its integer attribute\n\
718    turned on to be used in an expression.\n\
719    \n\
720    Operators are evaluated in order of precedence.  Sub-expressions in\n\
721    parentheses are evaluated first and may override the precedence\n\
722    rules above.\n\
723    \n\
724    If the last ARG evaluates to 0, let returns 1; 0 is returned\n\
725    otherwise."),
726#endif /* HELP_BUILTIN */
727  (char *)NULL
728};
729char * const read_doc[] = {
730#if defined (HELP_BUILTIN)
731N_("One line is read from the standard input, or from file descriptor FD if the\n\
732    -u option is supplied, and the first word is assigned to the first NAME,\n\
733    the second word to the second NAME, and so on, with leftover words assigned\n\
734    to the last NAME.  Only the characters found in $IFS are recognized as word\n\
735    delimiters.  If no NAMEs are supplied, the line read is stored in the REPLY\n\
736    variable.  If the -r option is given, this signifies `raw' input, and\n\
737    backslash escaping is disabled.  The -d option causes read to continue\n\
738    until the first character of DELIM is read, rather than newline.  If the -p\n\
739    option is supplied, the string PROMPT is output without a trailing newline\n\
740    before attempting to read.  If -a is supplied, the words read are assigned\n\
741    to sequential indices of ARRAY, starting at zero.  If -e is supplied and\n\
742    the shell is interactive, readline is used to obtain the line.  If -n is\n\
743    supplied with a non-zero NCHARS argument, read returns after NCHARS\n\
744    characters have been read.  The -s option causes input coming from a\n\
745    terminal to not be echoed.\n\
746    \n\
747    The -t option causes read to time out and return failure if a complete line\n\
748    of input is not read within TIMEOUT seconds.  If the TMOUT variable is set,\n\
749    its value is the default timeout.  The return code is zero, unless end-of-file\n\
750    is encountered, read times out, or an invalid file descriptor is supplied as\n\
751    the argument to -u."),
752#endif /* HELP_BUILTIN */
753  (char *)NULL
754};
755char * const return_doc[] = {
756#if defined (HELP_BUILTIN)
757N_("Causes a function to exit with the return value specified by N.  If N\n\
758    is omitted, the return status is that of the last command."),
759#endif /* HELP_BUILTIN */
760  (char *)NULL
761};
762char * const set_doc[] = {
763#if defined (HELP_BUILTIN)
764N_("    -a  Mark variables which are modified or created for export.\n\
765        -b  Notify of job termination immediately.\n\
766        -e  Exit immediately if a command exits with a non-zero status.\n\
767        -f  Disable file name generation (globbing).\n\
768        -h  Remember the location of commands as they are looked up.\n\
769        -k  All assignment arguments are placed in the environment for a\n\
770            command, not just those that precede the command name.\n\
771        -m  Job control is enabled.\n\
772        -n  Read commands but do not execute them.\n\
773        -o option-name\n\
774            Set the variable corresponding to option-name:\n\
775                allexport    same as -a\n\
776                braceexpand  same as -B\n\
777                emacs        use an emacs-style line editing interface\n\
778                errexit      same as -e\n\
779                errtrace     same as -E\n\
780                functrace    same as -T\n\
781                hashall      same as -h\n\
782                histexpand   same as -H\n\
783                history      enable command history\n\
784                ignoreeof    the shell will not exit upon reading EOF\n\
785                interactive-comments\n\
786                             allow comments to appear in interactive commands\n\
787                keyword      same as -k\n\
788                monitor      same as -m\n\
789                noclobber    same as -C\n\
790                noexec       same as -n\n\
791                noglob       same as -f\n\
792                nolog        currently accepted but ignored\n\
793                notify       same as -b\n\
794                nounset      same as -u\n\
795                onecmd       same as -t\n\
796                physical     same as -P\n\
797                pipefail     the return value of a pipeline is the status of\n\
798                             the last command to exit with a non-zero status,\n\
799                             or zero if no command exited with a non-zero status\n\
800                posix        change the behavior of bash where the default\n\
801                             operation differs from the 1003.2 standard to\n\
802                             match the standard\n\
803                privileged   same as -p\n\
804                verbose      same as -v\n\
805                vi           use a vi-style line editing interface\n\
806                xtrace       same as -x\n\
807        -p  Turned on whenever the real and effective user ids do not match.\n\
808            Disables processing of the $ENV file and importing of shell\n\
809            functions.  Turning this option off causes the effective uid and\n\
810            gid to be set to the real uid and gid.\n\
811        -t  Exit after reading and executing one command.\n\
812        -u  Treat unset variables as an error when substituting.\n\
813        -v  Print shell input lines as they are read.\n\
814        -x  Print commands and their arguments as they are executed.\n\
815        -B  the shell will perform brace expansion\n\
816        -C  If set, disallow existing regular files to be overwritten\n\
817            by redirection of output.\n\
818        -E  If set, the ERR trap is inherited by shell functions.\n\
819        -H  Enable ! style history substitution.  This flag is on\n\
820            by default when the shell is interactive.\n\
821        -P  If set, do not follow symbolic links when executing commands\n\
822            such as cd which change the current directory.\n\
823        -T  If set, the DEBUG trap is inherited by shell functions.\n\
824        -   Assign any remaining arguments to the positional parameters.\n\
825            The -x and -v options are turned off.\n\
826    \n\
827    Using + rather than - causes these flags to be turned off.  The\n\
828    flags can also be used upon invocation of the shell.  The current\n\
829    set of flags may be found in $-.  The remaining n ARGs are positional\n\
830    parameters and are assigned, in order, to $1, $2, .. $n.  If no\n\
831    ARGs are given, all shell variables are printed."),
832#endif /* HELP_BUILTIN */
833  (char *)NULL
834};
835char * const unset_doc[] = {
836#if defined (HELP_BUILTIN)
837N_("For each NAME, remove the corresponding variable or function.  Given\n\
838    the `-v', unset will only act on variables.  Given the `-f' flag,\n\
839    unset will only act on functions.  With neither flag, unset first\n\
840    tries to unset a variable, and if that fails, then tries to unset a\n\
841    function.  Some variables cannot be unset; also see readonly."),
842#endif /* HELP_BUILTIN */
843  (char *)NULL
844};
845char * const export_doc[] = {
846#if defined (HELP_BUILTIN)
847N_("NAMEs are marked for automatic export to the environment of\n\
848    subsequently executed commands.  If the -f option is given,\n\
849    the NAMEs refer to functions.  If no NAMEs are given, or if `-p'\n\
850    is given, a list of all names that are exported in this shell is\n\
851    printed.  An argument of `-n' says to remove the export property\n\
852    from subsequent NAMEs.  An argument of `--' disables further option\n\
853    processing."),
854#endif /* HELP_BUILTIN */
855  (char *)NULL
856};
857char * const readonly_doc[] = {
858#if defined (HELP_BUILTIN)
859N_("The given NAMEs are marked readonly and the values of these NAMEs may\n\
860    not be changed by subsequent assignment.  If the -f option is given,\n\
861    then functions corresponding to the NAMEs are so marked.  If no\n\
862    arguments are given, or if `-p' is given, a list of all readonly names\n\
863    is printed.  The `-a' option means to treat each NAME as\n\
864    an array variable.  An argument of `--' disables further option\n\
865    processing."),
866#endif /* HELP_BUILTIN */
867  (char *)NULL
868};
869char * const shift_doc[] = {
870#if defined (HELP_BUILTIN)
871N_("The positional parameters from $N+1 ... are renamed to $1 ...  If N is\n\
872    not given, it is assumed to be 1."),
873#endif /* HELP_BUILTIN */
874  (char *)NULL
875};
876char * const source_doc[] = {
877#if defined (HELP_BUILTIN)
878N_("Read and execute commands from FILENAME and return.  The pathnames\n\
879    in $PATH are used to find the directory containing FILENAME.  If any\n\
880    ARGUMENTS are supplied, they become the positional parameters when\n\
881    FILENAME is executed."),
882#endif /* HELP_BUILTIN */
883  (char *)NULL
884};
885char * const dot_doc[] = {
886#if defined (HELP_BUILTIN)
887N_("Read and execute commands from FILENAME and return.  The pathnames\n\
888    in $PATH are used to find the directory containing FILENAME.  If any\n\
889    ARGUMENTS are supplied, they become the positional parameters when\n\
890    FILENAME is executed."),
891#endif /* HELP_BUILTIN */
892  (char *)NULL
893};
894#if defined (JOB_CONTROL)
895char * const suspend_doc[] = {
896#if defined (HELP_BUILTIN)
897N_("Suspend the execution of this shell until it receives a SIGCONT\n\
898    signal.  The `-f' if specified says not to complain about this\n\
899    being a login shell if it is; just suspend anyway."),
900#endif /* HELP_BUILTIN */
901  (char *)NULL
902};
903#endif /* JOB_CONTROL */
904char * const test_doc[] = {
905#if defined (HELP_BUILTIN)
906N_("Exits with a status of 0 (true) or 1 (false) depending on\n\
907    the evaluation of EXPR.  Expressions may be unary or binary.  Unary\n\
908    expressions are often used to examine the status of a file.  There\n\
909    are string operators as well, and numeric comparison operators.\n\
910    \n\
911    File operators:\n\
912    \n\
913        -a FILE        True if file exists.\n\
914        -b FILE        True if file is block special.\n\
915        -c FILE        True if file is character special.\n\
916        -d FILE        True if file is a directory.\n\
917        -e FILE        True if file exists.\n\
918        -f FILE        True if file exists and is a regular file.\n\
919        -g FILE        True if file is set-group-id.\n\
920        -h FILE        True if file is a symbolic link.\n\
921        -L FILE        True if file is a symbolic link.\n\
922        -k FILE        True if file has its `sticky' bit set.\n\
923        -p FILE        True if file is a named pipe.\n\
924        -r FILE        True if file is readable by you.\n\
925        -s FILE        True if file exists and is not empty.\n\
926        -S FILE        True if file is a socket.\n\
927        -t FD          True if FD is opened on a terminal.\n\
928        -u FILE        True if the file is set-user-id.\n\
929        -w FILE        True if the file is writable by you.\n\
930        -x FILE        True if the file is executable by you.\n\
931        -O FILE        True if the file is effectively owned by you.\n\
932        -G FILE        True if the file is effectively owned by your group.\n\
933        -N FILE        True if the file has been modified since it was last read.\n\
934    \n\
935      FILE1 -nt FILE2  True if file1 is newer than file2 (according to\n\
936                       modification date).\n\
937    \n\
938      FILE1 -ot FILE2  True if file1 is older than file2.\n\
939    \n\
940      FILE1 -ef FILE2  True if file1 is a hard link to file2.\n\
941    \n\
942    String operators:\n\
943    \n\
944        -z STRING      True if string is empty.\n\
945    \n\
946        -n STRING\n\
947        STRING         True if string is not empty.\n\
948    \n\
949        STRING1 = STRING2\n\
950                       True if the strings are equal.\n\
951        STRING1 != STRING2\n\
952                       True if the strings are not equal.\n\
953        STRING1 < STRING2\n\
954                       True if STRING1 sorts before STRING2 lexicographically.\n\
955        STRING1 > STRING2\n\
956                       True if STRING1 sorts after STRING2 lexicographically.\n\
957    \n\
958    Other operators:\n\
959    \n\
960        -o OPTION      True if the shell option OPTION is enabled.\n\
961        ! EXPR         True if expr is false.\n\
962        EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.\n\
963        EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.\n\
964    \n\
965        arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,\n\
966                       -lt, -le, -gt, or -ge.\n\
967    \n\
968    Arithmetic binary operators return true if ARG1 is equal, not-equal,\n\
969    less-than, less-than-or-equal, greater-than, or greater-than-or-equal\n\
970    than ARG2."),
971#endif /* HELP_BUILTIN */
972  (char *)NULL
973};
974char * const test_bracket_doc[] = {
975#if defined (HELP_BUILTIN)
976N_("This is a synonym for the \"test\" builtin, but the last\n\
977    argument must be a literal `]', to match the opening `['."),
978#endif /* HELP_BUILTIN */
979  (char *)NULL
980};
981char * const times_doc[] = {
982#if defined (HELP_BUILTIN)
983N_("Print the accumulated user and system times for processes run from\n\
984    the shell."),
985#endif /* HELP_BUILTIN */
986  (char *)NULL
987};
988char * const trap_doc[] = {
989#if defined (HELP_BUILTIN)
990N_("The command ARG is to be read and executed when the shell receives\n\
991    signal(s) SIGNAL_SPEC.  If ARG is absent (and a single SIGNAL_SPEC\n\
992    is supplied) or `-', each specified signal is reset to its original\n\
993    value.  If ARG is the null string each SIGNAL_SPEC is ignored by the\n\
994    shell and by the commands it invokes.  If a SIGNAL_SPEC is EXIT (0)\n\
995    the command ARG is executed on exit from the shell.  If a SIGNAL_SPEC\n\
996    is DEBUG, ARG is executed after every simple command.  If the`-p' option\n\
997    is supplied then the trap commands associated with each SIGNAL_SPEC are\n\
998    displayed.  If no arguments are supplied or if only `-p' is given, trap\n\
999    prints the list of commands associated with each signal.  Each SIGNAL_SPEC\n\
1000    is either a signal name in <signal.h> or a signal number.  Signal names\n\
1001    are case insensitive and the SIG prefix is optional.  `trap -l' prints\n\
1002    a list of signal names and their corresponding numbers.  Note that a\n\
1003    signal can be sent to the shell with \"kill -signal $$\"."),
1004#endif /* HELP_BUILTIN */
1005  (char *)NULL
1006};
1007char * const type_doc[] = {
1008#if defined (HELP_BUILTIN)
1009N_("For each NAME, indicate how it would be interpreted if used as a\n\
1010    command name.\n\
1011    \n\
1012    If the -t option is used, `type' outputs a single word which is one of\n\
1013    `alias', `keyword', `function', `builtin', `file' or `', if NAME is an\n\
1014    alias, shell reserved word, shell function, shell builtin, disk file,\n\
1015    or unfound, respectively.\n\
1016    \n\
1017    If the -p flag is used, `type' either returns the name of the disk\n\
1018    file that would be executed, or nothing if `type -t NAME' would not\n\
1019    return `file'.\n\
1020    \n\
1021    If the -a flag is used, `type' displays all of the places that contain\n\
1022    an executable named `file'.  This includes aliases, builtins, and\n\
1023    functions, if and only if the -p flag is not also used.\n\
1024    \n\
1025    The -f flag suppresses shell function lookup.\n\
1026    \n\
1027    The -P flag forces a PATH search for each NAME, even if it is an alias,\n\
1028    builtin, or function, and returns the name of the disk file that would\n\
1029    be executed."),
1030#endif /* HELP_BUILTIN */
1031  (char *)NULL
1032};
1033#if !defined (_MINIX)
1034char * const ulimit_doc[] = {
1035#if defined (HELP_BUILTIN)
1036N_("Ulimit provides control over the resources available to processes\n\
1037    started by the shell, on systems that allow such control.  If an\n\
1038    option is given, it is interpreted as follows:\n\
1039    \n\
1040        -S	use the `soft' resource limit\n\
1041        -H	use the `hard' resource limit\n\
1042        -a	all current limits are reported\n\
1043        -c	the maximum size of core files created\n\
1044        -d	the maximum size of a process's data segment\n\
1045        -e	the maximum scheduling priority (`nice')\n\
1046        -f	the maximum size of files written by the shell and its children\n\
1047        -i	the maximum number of pending signals\n\
1048        -l	the maximum size a process may lock into memory\n\
1049        -m	the maximum resident set size\n\
1050        -n	the maximum number of open file descriptors\n\
1051        -p	the pipe buffer size\n\
1052        -q	the maximum number of bytes in POSIX message queues\n\
1053        -r	the maximum real-time scheduling priority\n\
1054        -s	the maximum stack size\n\
1055        -t	the maximum amount of cpu time in seconds\n\
1056        -u	the maximum number of user processes\n\
1057        -v	the size of virtual memory\n\
1058        -x	the maximum number of file locks\n\
1059    \n\
1060    If LIMIT is given, it is the new value of the specified resource;\n\
1061    the special LIMIT values `soft', `hard', and `unlimited' stand for\n\
1062    the current soft limit, the current hard limit, and no limit, respectively.\n\
1063    Otherwise, the current value of the specified resource is printed.\n\
1064    If no option is given, then -f is assumed.  Values are in 1024-byte\n\
1065    increments, except for -t, which is in seconds, -p, which is in\n\
1066    increments of 512 bytes, and -u, which is an unscaled number of\n\
1067    processes."),
1068#endif /* HELP_BUILTIN */
1069  (char *)NULL
1070};
1071#endif /* !_MINIX */
1072char * const umask_doc[] = {
1073#if defined (HELP_BUILTIN)
1074N_("The user file-creation mask is set to MODE.  If MODE is omitted, or if\n\
1075    `-S' is supplied, the current value of the mask is printed.  The `-S'\n\
1076    option makes the output symbolic; otherwise an octal number is output.\n\
1077    If `-p' is supplied, and MODE is omitted, the output is in a form\n\
1078    that may be used as input.  If MODE begins with a digit, it is\n\
1079    interpreted as an octal number, otherwise it is a symbolic mode string\n\
1080    like that accepted by chmod(1)."),
1081#endif /* HELP_BUILTIN */
1082  (char *)NULL
1083};
1084#if defined (JOB_CONTROL)
1085char * const wait_doc[] = {
1086#if defined (HELP_BUILTIN)
1087N_("Wait for the specified process and report its termination status.  If\n\
1088    N is not given, all currently active child processes are waited for,\n\
1089    and the return code is zero.  N may be a process ID or a job\n\
1090    specification; if a job spec is given, all processes in the job's\n\
1091    pipeline are waited for."),
1092#endif /* HELP_BUILTIN */
1093  (char *)NULL
1094};
1095#endif /* JOB_CONTROL */
1096#if !defined (JOB_CONTROL)
1097char * const wait_doc[] = {
1098#if defined (HELP_BUILTIN)
1099N_("Wait for the specified process and report its termination status.  If\n\
1100    N is not given, all currently active child processes are waited for,\n\
1101    and the return code is zero.  N is a process ID; if it is not given,\n\
1102    all child processes of the shell are waited for."),
1103#endif /* HELP_BUILTIN */
1104  (char *)NULL
1105};
1106#endif /* !JOB_CONTROL */
1107char * const for_doc[] = {
1108#if defined (HELP_BUILTIN)
1109N_("The `for' loop executes a sequence of commands for each member in a\n\
1110    list of items.  If `in WORDS ...;' is not present, then `in \"$@\"' is\n\
1111    assumed.  For each element in WORDS, NAME is set to that element, and\n\
1112    the COMMANDS are executed."),
1113#endif /* HELP_BUILTIN */
1114  (char *)NULL
1115};
1116char * const arith_for_doc[] = {
1117#if defined (HELP_BUILTIN)
1118N_("Equivalent to\n\
1119    	(( EXP1 ))\n\
1120    	while (( EXP2 )); do\n\
1121    		COMMANDS\n\
1122    		(( EXP3 ))\n\
1123    	done\n\
1124    EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is\n\
1125    omitted, it behaves as if it evaluates to 1."),
1126#endif /* HELP_BUILTIN */
1127  (char *)NULL
1128};
1129char * const select_doc[] = {
1130#if defined (HELP_BUILTIN)
1131N_("The WORDS are expanded, generating a list of words.  The\n\
1132    set of expanded words is printed on the standard error, each\n\
1133    preceded by a number.  If `in WORDS' is not present, `in \"$@\"'\n\
1134    is assumed.  The PS3 prompt is then displayed and a line read\n\
1135    from the standard input.  If the line consists of the number\n\
1136    corresponding to one of the displayed words, then NAME is set\n\
1137    to that word.  If the line is empty, WORDS and the prompt are\n\
1138    redisplayed.  If EOF is read, the command completes.  Any other\n\
1139    value read causes NAME to be set to null.  The line read is saved\n\
1140    in the variable REPLY.  COMMANDS are executed after each selection\n\
1141    until a break command is executed."),
1142#endif /* HELP_BUILTIN */
1143  (char *)NULL
1144};
1145char * const time_doc[] = {
1146#if defined (HELP_BUILTIN)
1147N_("Execute PIPELINE and print a summary of the real time, user CPU time,\n\
1148    and system CPU time spent executing PIPELINE when it terminates.\n\
1149    The return status is the return status of PIPELINE.  The `-p' option\n\
1150    prints the timing summary in a slightly different format.  This uses\n\
1151    the value of the TIMEFORMAT variable as the output format."),
1152#endif /* HELP_BUILTIN */
1153  (char *)NULL
1154};
1155char * const case_doc[] = {
1156#if defined (HELP_BUILTIN)
1157N_("Selectively execute COMMANDS based upon WORD matching PATTERN.  The\n\
1158    `|' is used to separate multiple patterns."),
1159#endif /* HELP_BUILTIN */
1160  (char *)NULL
1161};
1162char * const if_doc[] = {
1163#if defined (HELP_BUILTIN)
1164N_("The `if COMMANDS' list is executed.  If its exit status is zero, then the\n\
1165    `then COMMANDS' list is executed.  Otherwise, each `elif COMMANDS' list is\n\
1166    executed in turn, and if its exit status is zero, the corresponding\n\
1167    `then COMMANDS' list is executed and the if command completes.  Otherwise,\n\
1168    the `else COMMANDS' list is executed, if present.  The exit status of the\n\
1169    entire construct is the exit status of the last command executed, or zero\n\
1170    if no condition tested true."),
1171#endif /* HELP_BUILTIN */
1172  (char *)NULL
1173};
1174char * const while_doc[] = {
1175#if defined (HELP_BUILTIN)
1176N_("Expand and execute COMMANDS as long as the final command in the\n\
1177    `while' COMMANDS has an exit status of zero."),
1178#endif /* HELP_BUILTIN */
1179  (char *)NULL
1180};
1181char * const until_doc[] = {
1182#if defined (HELP_BUILTIN)
1183N_("Expand and execute COMMANDS as long as the final command in the\n\
1184    `until' COMMANDS has an exit status which is not zero."),
1185#endif /* HELP_BUILTIN */
1186  (char *)NULL
1187};
1188char * const function_doc[] = {
1189#if defined (HELP_BUILTIN)
1190N_("Create a simple command invoked by NAME which runs COMMANDS.\n\
1191    Arguments on the command line along with NAME are passed to the\n\
1192    function as $0 .. $n."),
1193#endif /* HELP_BUILTIN */
1194  (char *)NULL
1195};
1196char * const grouping_braces_doc[] = {
1197#if defined (HELP_BUILTIN)
1198N_("Run a set of commands in a group.  This is one way to redirect an\n\
1199    entire set of commands."),
1200#endif /* HELP_BUILTIN */
1201  (char *)NULL
1202};
1203char * const fg_percent_doc[] = {
1204#if defined (HELP_BUILTIN)
1205N_("Equivalent to the JOB_SPEC argument to the `fg' command.  Resume a\n\
1206    stopped or background job.  JOB_SPEC can specify either a job name\n\
1207    or a job number.  Following JOB_SPEC with a `&' places the job in\n\
1208    the background, as if the job specification had been supplied as an\n\
1209    argument to `bg'."),
1210#endif /* HELP_BUILTIN */
1211  (char *)NULL
1212};
1213char * const arith_doc[] = {
1214#if defined (HELP_BUILTIN)
1215N_("The EXPRESSION is evaluated according to the rules for arithmetic\n\
1216    evaluation.  Equivalent to \"let EXPRESSION\"."),
1217#endif /* HELP_BUILTIN */
1218  (char *)NULL
1219};
1220char * const conditional_doc[] = {
1221#if defined (HELP_BUILTIN)
1222N_("Returns a status of 0 or 1 depending on the evaluation of the conditional\n\
1223    expression EXPRESSION.  Expressions are composed of the same primaries used\n\
1224    by the `test' builtin, and may be combined using the following operators\n\
1225    \n\
1226    	( EXPRESSION )	Returns the value of EXPRESSION\n\
1227    	! EXPRESSION	True if EXPRESSION is false; else false\n\
1228    	EXPR1 && EXPR2	True if both EXPR1 and EXPR2 are true; else false\n\
1229    	EXPR1 || EXPR2	True if either EXPR1 or EXPR2 is true; else false\n\
1230    \n\
1231    When the `==' and `!=' operators are used, the string to the right of the\n\
1232    operator is used as a pattern and pattern matching is performed.  The\n\
1233    && and || operators do not evaluate EXPR2 if EXPR1 is sufficient to\n\
1234    determine the expression's value."),
1235#endif /* HELP_BUILTIN */
1236  (char *)NULL
1237};
1238char * const variable_help_doc[] = {
1239#if defined (HELP_BUILTIN)
1240N_("BASH_VERSION	Version information for this Bash.\n\
1241    CDPATH	A colon-separated list of directories to search\n\
1242    		for directries given as arguments to `cd'.\n\
1243    GLOBIGNORE	A colon-separated list of patterns describing filenames to\n\
1244    		be ignored by pathname expansion.\n\
1245    HISTFILE	The name of the file where your command history is stored.\n\
1246    HISTFILESIZE	The maximum number of lines this file can contain.\n\
1247    HISTSIZE	The maximum number of history lines that a running\n\
1248    		shell can access.\n\
1249    HOME	The complete pathname to your login directory.\n\
1250    HOSTNAME	The name of the current host.\n\
1251    HOSTTYPE	The type of CPU this version of Bash is running under.\n\
1252    IGNOREEOF	Controls the action of the shell on receipt of an EOF\n\
1253    		character as the sole input.  If set, then the value\n\
1254    		of it is the number of EOF characters that can be seen\n\
1255    		in a row on an empty line before the shell will exit\n\
1256    		(default 10).  When unset, EOF signifies the end of input.\n\
1257    MACHTYPE	A string describing the current system Bash is running on.\n\
1258    MAILCHECK	How often, in seconds, Bash checks for new mail.\n\
1259    MAILPATH	A colon-separated list of filenames which Bash checks\n\
1260    		for new mail.\n\
1261    OSTYPE	The version of Unix this version of Bash is running on.\n\
1262    PATH	A colon-separated list of directories to search when\n\
1263    		looking for commands.\n\
1264    PROMPT_COMMAND	A command to be executed before the printing of each\n\
1265    		primary prompt.\n\
1266    PS1		The primary prompt string.\n\
1267    PS2		The secondary prompt string.\n\
1268    PWD		The full pathname of the current directory.\n\
1269    SHELLOPTS	A colon-separated list of enabled shell options.\n\
1270    TERM	The name of the current terminal type.\n\
1271    TIMEFORMAT	The output format for timing statistics displayed by the\n\
1272    		`time' reserved word.\n\
1273    auto_resume	Non-null means a command word appearing on a line by\n\
1274    		itself is first looked for in the list of currently\n\
1275    		stopped jobs.  If found there, that job is foregrounded.\n\
1276    		A value of `exact' means that the command word must\n\
1277    		exactly match a command in the list of stopped jobs.  A\n\
1278    		value of `substring' means that the command word must\n\
1279    		match a substring of the job.  Any other value means that\n\
1280    		the command must be a prefix of a stopped job.\n\
1281    histchars	Characters controlling history expansion and quick\n\
1282    		substitution.  The first character is the history\n\
1283    		substitution character, usually `!'.  The second is\n\
1284    		the `quick substitution' character, usually `^'.  The\n\
1285    		third is the `history comment' character, usually `#'.\n\
1286    HISTIGNORE	A colon-separated list of patterns used to decide which\n\
1287    		commands should be saved on the history list.\n\
1288"),
1289#endif /* HELP_BUILTIN */
1290  (char *)NULL
1291};
1292#if defined (PUSHD_AND_POPD)
1293char * const pushd_doc[] = {
1294#if defined (HELP_BUILTIN)
1295N_("Adds a directory to the top of the directory stack, or rotates\n\
1296    the stack, making the new top of the stack the current working\n\
1297    directory.  With no arguments, exchanges the top two directories.\n\
1298    \n\
1299    +N	Rotates the stack so that the Nth directory (counting\n\
1300    	from the left of the list shown by `dirs', starting with\n\
1301    	zero) is at the top.\n\
1302    \n\
1303    -N	Rotates the stack so that the Nth directory (counting\n\
1304    	from the right of the list shown by `dirs', starting with\n\
1305    	zero) is at the top.\n\
1306    \n\
1307    -n	suppress the normal change of directory when adding directories\n\
1308    	to the stack, so only the stack is manipulated.\n\
1309    \n\
1310    dir	adds DIR to the directory stack at the top, making it the\n\
1311    	new current working directory.\n\
1312    \n\
1313    You can see the directory stack with the `dirs' command."),
1314#endif /* HELP_BUILTIN */
1315  (char *)NULL
1316};
1317#endif /* PUSHD_AND_POPD */
1318#if defined (PUSHD_AND_POPD)
1319char * const popd_doc[] = {
1320#if defined (HELP_BUILTIN)
1321N_("Removes entries from the directory stack.  With no arguments,\n\
1322    removes the top directory from the stack, and cd's to the new\n\
1323    top directory.\n\
1324    \n\
1325    +N	removes the Nth entry counting from the left of the list\n\
1326    	shown by `dirs', starting with zero.  For example: `popd +0'\n\
1327    	removes the first directory, `popd +1' the second.\n\
1328    \n\
1329    -N	removes the Nth entry counting from the right of the list\n\
1330    	shown by `dirs', starting with zero.  For example: `popd -0'\n\
1331    	removes the last directory, `popd -1' the next to last.\n\
1332    \n\
1333    -n	suppress the normal change of directory when removing directories\n\
1334    	from the stack, so only the stack is manipulated.\n\
1335    \n\
1336    You can see the directory stack with the `dirs' command."),
1337#endif /* HELP_BUILTIN */
1338  (char *)NULL
1339};
1340#endif /* PUSHD_AND_POPD */
1341#if defined (PUSHD_AND_POPD)
1342char * const dirs_doc[] = {
1343#if defined (HELP_BUILTIN)
1344N_("Display the list of currently remembered directories.  Directories\n\
1345    find their way onto the list with the `pushd' command; you can get\n\
1346    back up through the list with the `popd' command.\n\
1347    \n\
1348    The -l flag specifies that `dirs' should not print shorthand versions\n\
1349    of directories which are relative to your home directory.  This means\n\
1350    that `~/bin' might be displayed as `/homes/bfox/bin'.  The -v flag\n\
1351    causes `dirs' to print the directory stack with one entry per line,\n\
1352    prepending the directory name with its position in the stack.  The -p\n\
1353    flag does the same thing, but the stack position is not prepended.\n\
1354    The -c flag clears the directory stack by deleting all of the elements.\n\
1355    \n\
1356    +N	displays the Nth entry counting from the left of the list shown by\n\
1357    	dirs when invoked without options, starting with zero.\n\
1358    \n\
1359    -N	displays the Nth entry counting from the right of the list shown by\n\
1360    	dirs when invoked without options, starting with zero."),
1361#endif /* HELP_BUILTIN */
1362  (char *)NULL
1363};
1364#endif /* PUSHD_AND_POPD */
1365char * const shopt_doc[] = {
1366#if defined (HELP_BUILTIN)
1367N_("Toggle the values of variables controlling optional behavior.\n\
1368    The -s flag means to enable (set) each OPTNAME; the -u flag\n\
1369    unsets each OPTNAME.  The -q flag suppresses output; the exit\n\
1370    status indicates whether each OPTNAME is set or unset.  The -o\n\
1371    option restricts the OPTNAMEs to those defined for use with\n\
1372    `set -o'.  With no options, or with the -p option, a list of all\n\
1373    settable options is displayed, with an indication of whether or\n\
1374    not each is set."),
1375#endif /* HELP_BUILTIN */
1376  (char *)NULL
1377};
1378char * const printf_doc[] = {
1379#if defined (HELP_BUILTIN)
1380N_("printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT\n\
1381    is a character string which contains three types of objects: plain\n\
1382    characters, which are simply copied to standard output, character escape\n\
1383    sequences which are converted and copied to the standard output, and\n\
1384    format specifications, each of which causes printing of the next successive\n\
1385    argument.  In addition to the standard printf(1) formats, %b means to\n\
1386    expand backslash escape sequences in the corresponding argument, and %q\n\
1387    means to quote the argument in a way that can be reused as shell input.\n\
1388    If the -v option is supplied, the output is placed into the value of the\n\
1389    shell variable VAR rather than being sent to the standard output."),
1390#endif /* HELP_BUILTIN */
1391  (char *)NULL
1392};
1393#if defined (PROGRAMMABLE_COMPLETION)
1394char * const complete_doc[] = {
1395#if defined (HELP_BUILTIN)
1396N_("For each NAME, specify how arguments are to be completed.\n\
1397    If the -p option is supplied, or if no options are supplied, existing\n\
1398    completion specifications are printed in a way that allows them to be\n\
1399    reused as input.  The -r option removes a completion specification for\n\
1400    each NAME, or, if no NAMEs are supplied, all completion specifications."),
1401#endif /* HELP_BUILTIN */
1402  (char *)NULL
1403};
1404#endif /* PROGRAMMABLE_COMPLETION */
1405#if defined (PROGRAMMABLE_COMPLETION)
1406char * const compgen_doc[] = {
1407#if defined (HELP_BUILTIN)
1408N_("Display the possible completions depending on the options.  Intended\n\
1409    to be used from within a shell function generating possible completions.\n\
1410    If the optional WORD argument is supplied, matches against WORD are\n\
1411    generated."),
1412#endif /* HELP_BUILTIN */
1413  (char *)NULL
1414};
1415#endif /* PROGRAMMABLE_COMPLETION */
1416