From: Chet Ramey Date: Wed, 7 Dec 2011 14:18:38 +0000 (-0500) Subject: commit bash-20080207 snapshot X-Git-Tag: bash-4.0-alpha~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9cbcc93b30803459fddc6c3aa73bea1ea4861f24;p=thirdparty%2Fbash.git commit bash-20080207 snapshot --- diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index a60b5cf07..489704480 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -12977,7 +12977,7 @@ builtins/declare.def - when not in posix mode, and operating on shell functions, typeset and declare do not require their variable operands to be valid shell identifiers. The other `attribute' builtins work this way. - Fixes inconsistency reported by Mike Frysinger + Fixes inconsistency reported by Mike Frysinger {configure,config.h}.in - add test for setregid, define HAVE_SETREGID and HAVE_DECL_SETREGID @@ -15265,3 +15265,9 @@ general.c - change posix_initialize to turn off source/. searching $PWD when the file sourced is not found in $PATH. Fixes bug reported by Paolo Bonzini and Eric Blake + + 2/9 + --- +builtins/*.def + - changes to text and formatting suggested by Jan Schampera + diff --git a/CWRU/CWRU.chlog~ b/CWRU/CWRU.chlog~ index 41aab0a14..b19b8a569 100644 --- a/CWRU/CWRU.chlog~ +++ b/CWRU/CWRU.chlog~ @@ -12977,7 +12977,7 @@ builtins/declare.def - when not in posix mode, and operating on shell functions, typeset and declare do not require their variable operands to be valid shell identifiers. The other `attribute' builtins work this way. - Fixes inconsistency reported by Mike Frysinger + Fixes inconsistency reported by Mike Frysinger {configure,config.h}.in - add test for setregid, define HAVE_SETREGID and HAVE_DECL_SETREGID @@ -15258,3 +15258,15 @@ builtins/fc.def lib/readline/complete.c - fix fnwidth to use string[pos] instead of *string when testing the current character for a control character or rubout + + 2/2 + --- +general.c + - change posix_initialize to turn off source/. searching $PWD when + the file sourced is not found in $PATH. Fixes bug reported by + Paolo Bonzini and Eric Blake + + 2/9 + --- +builtins/*.def + - changes to text and formatting suggested by Jan Schampera diff --git a/MANIFEST b/MANIFEST index 1e37178df..5702b74cc 100644 --- a/MANIFEST +++ b/MANIFEST @@ -426,6 +426,7 @@ lib/sh/wcsdup.c f lib/sh/winsize.c f lib/sh/xstrchr.c f lib/sh/zcatfd.c f +lib/sh/zgetline.c f lib/sh/zmapfd.c f lib/sh/zread.c f lib/sh/zwrite.c f diff --git a/MANIFEST~ b/MANIFEST~ index ce98d7e4f..1e37178df 100644 --- a/MANIFEST~ +++ b/MANIFEST~ @@ -10,7 +10,6 @@ builtins d cross-build d doc d examples d -examples/bashdb d examples/obashdb d examples/complete d examples/functions d @@ -381,6 +380,7 @@ lib/sh/eaccess.c f lib/sh/fmtullong.c f lib/sh/fmtulong.c f lib/sh/fmtumax.c f +lib/sh/fpurge.c f lib/sh/getcwd.c f lib/sh/getenv.c f lib/sh/inet_aton.c f @@ -469,8 +469,12 @@ po/en@quot.po f po/en@boldquot.po f po/en@quot.gmo f po/en@boldquot.gmo f +po/bg.po f +po/bg.gmo f po/ru.po f po/ru.gmo f +po/sk.po f +po/sk.gmo f po/sv.po f po/sv.gmo f po/insert-header.sin f @@ -535,15 +539,10 @@ support/shobj-conf f 755 support/rlvers.sh f 755 examples/INDEX.txt f examples/INDEX.html f -examples/bashdb/PERMISSION f -examples/bashdb/README f -examples/bashdb/bashdb f -examples/bashdb/bashdb.el f examples/obashdb/PERMISSION f examples/obashdb/README f -examples/obashdb/bashdb f -examples/obashdb/bashdb.fns f -examples/obashdb/bashdb.pre f +examples/obashdb/bashdb f +examples/obashdb/bashdb.el f examples/complete/complete-examples f examples/complete/complete.ianmac f examples/complete/complete2.ianmac f @@ -751,6 +750,7 @@ tests/exec4.sub f tests/exec5.sub f tests/exec6.sub f tests/exec7.sub f +tests/exec8.sub f tests/exp.tests f tests/exp.right f tests/exp1.sub f @@ -796,6 +796,7 @@ tests/input-line.sh f tests/input-line.sub f tests/input.right f tests/intl.tests f +tests/intl1.sub f tests/intl.right f tests/iquote.tests f tests/iquote.right f diff --git a/Makefile.in b/Makefile.in index 6a230470c..8779b122b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -210,7 +210,8 @@ SHLIB_SOURCE = ${SH_LIBSRC}/clktck.c ${SH_LIBSRC}/getcwd.c \ ${SH_LIBSRC}/zcatfd.c ${SH_LIBSRC}/shmatch.c \ ${SH_LIBSRC}/strnlen.c ${SH_LIBSRC}/winsize.c \ ${SH_LIBSRC}/eaccess.c ${SH_LIBSRC}/wcsdup.c \ - ${SH_LIBSRC}/zmapfd.c ${SH_LIBSRC}/fpurge.c + ${SH_LIBSRC}/zmapfd.c ${SH_LIBSRC}/fpurge.c \ + ${SH_LIBSRC}/zgetline.c SHLIB_LIB = -lsh SHLIB_LIBNAME = libsh.a diff --git a/Makefile.in~ b/Makefile.in~ index a90fb00f0..6a230470c 100644 --- a/Makefile.in~ +++ b/Makefile.in~ @@ -210,7 +210,7 @@ SHLIB_SOURCE = ${SH_LIBSRC}/clktck.c ${SH_LIBSRC}/getcwd.c \ ${SH_LIBSRC}/zcatfd.c ${SH_LIBSRC}/shmatch.c \ ${SH_LIBSRC}/strnlen.c ${SH_LIBSRC}/winsize.c \ ${SH_LIBSRC}/eaccess.c ${SH_LIBSRC}/wcsdup.c \ - ${SH_LIBSRC}/zmapfd.c + ${SH_LIBSRC}/zmapfd.c ${SH_LIBSRC}/fpurge.c SHLIB_LIB = -lsh SHLIB_LIBNAME = libsh.a @@ -1055,6 +1055,7 @@ jobs.o: ${BASHINCDIR}/posixtime.h nojobs.o: config.h bashtypes.h ${BASHINCDIR}/filecntl.h bashjmp.h ${BASHINCDIR}/posixjmp.h nojobs.o: command.h ${BASHINCDIR}/stdc.h general.h xmalloc.h jobs.h quit.h siglist.h externs.h nojobs.o: sig.h error.h ${BASHINCDIR}/shtty.h input.h +nojobs.o: $(DEFDIR)/builtext.h # shell features that may be compiled in diff --git a/builtins/alias.def b/builtins/alias.def index db13869e8..7ed416d0c 100644 --- a/builtins/alias.def +++ b/builtins/alias.def @@ -1,7 +1,7 @@ This file is alias.def, from which is created alias.c It implements the builtins "alias" and "unalias" in Bash. -Copyright (C) 1987-2004 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,12 +24,18 @@ $FUNCTION alias_builtin $DEPENDS_ON ALIAS $PRODUCES alias.c $SHORT_DOC alias [-p] [name[=value] ... ] -`alias' with no arguments or with the -p option prints the list -of aliases in the form alias NAME=VALUE on standard output. +Without arguments, `alias' prints the list of aliases in the reusable +form `alias NAME=VALUE' on standard output. + Otherwise, an alias is defined for each NAME whose VALUE is given. A trailing space in VALUE causes the next word to be checked for -alias substitution when the alias is expanded. Alias returns -true unless a NAME is given for which no alias has been defined. +alias substitution when the alias is expanded. + +Options: + -p Print all defined aliases in a reusable format + +Alias returns true unless a NAME is supplied for which no alias has been +defined. $END #include @@ -149,8 +155,12 @@ $BUILTIN unalias $FUNCTION unalias_builtin $DEPENDS_ON ALIAS $SHORT_DOC unalias [-a] name [name ...] -Remove NAMEs from the list of defined aliases. If the -a option is given, -then remove all alias definitions. +Remove each NAME from the list of defined aliases. + +Options: + -a remove all alias definitions. + +Return success unless a NAME is not an existing alias. $END #if defined (ALIAS) diff --git a/builtins/alias.def~ b/builtins/alias.def~ new file mode 100644 index 000000000..03991606a --- /dev/null +++ b/builtins/alias.def~ @@ -0,0 +1,240 @@ +This file is alias.def, from which is created alias.c +It implements the builtins "alias" and "unalias" in Bash. + +Copyright (C) 1987-2008 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$BUILTIN alias +$FUNCTION alias_builtin +$DEPENDS_ON ALIAS +$PRODUCES alias.c +$SHORT_DOC alias [-p] [name[=value] ... ] +Without arguments, `alias' prints the list of aliases in the reusable +form `alias NAME=VALUE' on standard output. + +Otherwise, an alias is defined for each NAME whose VALUE is given. +A trailing space in VALUE causes the next word to be checked for +alias substitution when the alias is expanded. + +Options: + -p Print all defined aliases in a reusable format + +Alias returns true unless a NAME is supplied for which no alias has been +defined. +$END + +#include + +#if defined (ALIAS) + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +# include "../bashansi.h" +# include "../bashintl.h" + +# include +# include "../shell.h" +# include "../alias.h" +# include "common.h" +# include "bashgetopt.h" + +/* Flags for print_alias */ +#define AL_REUSABLE 0x01 + +static void print_alias __P((alias_t *, int)); + +extern int posixly_correct; + +/* Hack the alias command in a Korn shell way. */ +int +alias_builtin (list) + WORD_LIST *list; +{ + int any_failed, offset, pflag, dflags; + alias_t **alias_list, *t; + char *name, *value; + + dflags = posixly_correct ? 0 : AL_REUSABLE; + pflag = 0; + reset_internal_getopt (); + while ((offset = internal_getopt (list, "p")) != -1) + { + switch (offset) + { + case 'p': + pflag = 1; + dflags |= AL_REUSABLE; + break; + default: + builtin_usage (); + return (EX_USAGE); + } + } + + list = loptend; + + if (list == 0 || pflag) + { + if (aliases == 0) + return (EXECUTION_SUCCESS); + + alias_list = all_aliases (); + + if (alias_list == 0) + return (EXECUTION_SUCCESS); + + for (offset = 0; alias_list[offset]; offset++) + print_alias (alias_list[offset], dflags); + + free (alias_list); /* XXX - Do not free the strings. */ + + if (list == 0) + return (sh_chkwrite (EXECUTION_SUCCESS)); + } + + any_failed = 0; + while (list) + { + name = list->word->word; + + for (offset = 0; name[offset] && name[offset] != '='; offset++) + ; + + if (offset && name[offset] == '=') + { + name[offset] = '\0'; + value = name + offset + 1; + + if (legal_alias_name (name, 0) == 0) + { + builtin_error (_("`%s': invalid alias name"), name); + any_failed++; + } + else + add_alias (name, value); + } + else + { + t = find_alias (name); + if (t) + print_alias (t, dflags); + else + { + sh_notfound (name); + any_failed++; + } + } + list = list->next; + } + + return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS); +} +#endif /* ALIAS */ + +$BUILTIN unalias +$FUNCTION unalias_builtin +$DEPENDS_ON ALIAS +$SHORT_DOC unalias [-a] name [name ...] +Remove each NAME from the list of defined aliases. + +Options: + + -a remove all alias definitions. + +Return success unless a NAME is not an existing alias. +$END + +#if defined (ALIAS) +/* Remove aliases named in LIST from the aliases database. */ +int +unalias_builtin (list) + register WORD_LIST *list; +{ + register alias_t *alias; + int opt, aflag; + + aflag = 0; + reset_internal_getopt (); + while ((opt = internal_getopt (list, "a")) != -1) + { + switch (opt) + { + case 'a': + aflag = 1; + break; + default: + builtin_usage (); + return (EX_USAGE); + } + } + + list = loptend; + + if (aflag) + { + delete_all_aliases (); + return (EXECUTION_SUCCESS); + } + + if (list == 0) + { + builtin_usage (); + return (EX_USAGE); + } + + aflag = 0; + while (list) + { + alias = find_alias (list->word->word); + + if (alias) + remove_alias (alias->name); + else + { + sh_notfound (list->word->word); + aflag++; + } + + list = list->next; + } + + return (aflag ? EXECUTION_FAILURE : EXECUTION_SUCCESS); +} + +/* Output ALIAS in such a way as to allow it to be read back in. */ +static void +print_alias (alias, flags) + alias_t *alias; + int flags; +{ + char *value; + + value = sh_single_quote (alias->value); + if (flags & AL_REUSABLE) + printf ("alias "); + printf ("%s=%s\n", alias->name, value); + free (value); + + fflush (stdout); +} +#endif /* ALIAS */ diff --git a/builtins/bind.def b/builtins/bind.def index 0cbab504c..7a4baa8e8 100644 --- a/builtins/bind.def +++ b/builtins/bind.def @@ -1,7 +1,7 @@ This file is bind.def, from which is created bind.c. It implements the builtin "bind" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -27,11 +27,12 @@ $BUILTIN bind $DEPENDS_ON READLINE $FUNCTION bind_builtin $SHORT_DOC bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function or readline-command] -Bind a key sequence to a Readline function or a macro, or set -a Readline variable. The non-option argument syntax is equivalent -to that found in ~/.inputrc, but must be passed as a single argument: e.g., +Bind a key sequence to a Readline function or a macro, or set a Readline +variable. The non-option argument syntax is equivalent to that found in +~/.inputrc, but must be passed as a single argument: e.g., bind '"\C-x\C-r": re-read-init-file'. -bind accepts the following options: + +Options: -m keymap Use KEYMAP as the keymap for the duration of this command. Acceptable keymap names are emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, diff --git a/builtins/bind.def~ b/builtins/bind.def~ index c66ef47d0..0cbab504c 100644 --- a/builtins/bind.def~ +++ b/builtins/bind.def~ @@ -29,7 +29,7 @@ $FUNCTION bind_builtin $SHORT_DOC bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function or readline-command] Bind a key sequence to a Readline function or a macro, or set a Readline variable. The non-option argument syntax is equivalent -to that found in ~/.inputrc, but must be passed as a single argument: +to that found in ~/.inputrc, but must be passed as a single argument: e.g., bind '"\C-x\C-r": re-read-init-file'. bind accepts the following options: -m keymap Use KEYMAP as the keymap for the duration of this @@ -266,7 +266,7 @@ bind_builtin (list) run_unwind_frame ("bind_builtin"); - return (return_code); + return (sh_chkwrite (return_code)); } static int diff --git a/builtins/break.def b/builtins/break.def index 7d7ebe95b..1df6cd3df 100644 --- a/builtins/break.def +++ b/builtins/break.def @@ -1,7 +1,7 @@ This file is break.def, from which is created break.c. It implements the builtins "break" and "continue" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,8 +24,8 @@ $PRODUCES break.c $BUILTIN break $FUNCTION break_builtin $SHORT_DOC break [n] -Exit from within a FOR, WHILE or UNTIL loop. If N is specified, -break N levels. +Exit a FOR, WHILE or UNTIL loop. If N is specified, break N enclosing +loops. $END #include @@ -86,8 +86,8 @@ break_builtin (list) $BUILTIN continue $FUNCTION continue_builtin $SHORT_DOC continue [n] -Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop. -If N is specified, resume at the N-th enclosing loop. +Resumes the next iteration of the enclosing FOR, WHILE or UNTIL loop. +If N is specified, resumes the Nth enclosing loop. $END /* Set up to continue x levels, where x defaults to 1, but can be specified diff --git a/builtins/break.def~ b/builtins/break.def~ index 7d7ebe95b..37a7827cc 100644 --- a/builtins/break.def~ +++ b/builtins/break.def~ @@ -1,7 +1,7 @@ This file is break.def, from which is created break.c. It implements the builtins "break" and "continue" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,8 +24,7 @@ $PRODUCES break.c $BUILTIN break $FUNCTION break_builtin $SHORT_DOC break [n] -Exit from within a FOR, WHILE or UNTIL loop. If N is specified, -break N levels. +Exit a FOR, WHILE or UNTIL loop. If N is specified, break N enclosing loops. $END #include @@ -86,8 +85,8 @@ break_builtin (list) $BUILTIN continue $FUNCTION continue_builtin $SHORT_DOC continue [n] -Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop. -If N is specified, resume at the N-th enclosing loop. +Resumes the next iteration of the enclosing FOR, WHILE or UNTIL loop. +If N is specified, resumes the Nth enclosing loop. $END /* Set up to continue x levels, where x defaults to 1, but can be specified diff --git a/builtins/builtin.def b/builtins/builtin.def index 4e38fb4e7..e8ae9264b 100644 --- a/builtins/builtin.def +++ b/builtins/builtin.def @@ -1,7 +1,7 @@ This file is builtin.def, from which is created builtin.c. It implements the builtin "builtin" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,10 +24,9 @@ $PRODUCES builtin.c $BUILTIN builtin $FUNCTION builtin_builtin $SHORT_DOC builtin [shell-builtin [arg ...]] -Execute SHELL-BUILTIN with arguments ARGs without performing shell function -lookup. This is useful when you wish to reimplement a shell builtin as a -shell function, but need the functionality of the builtin within the function -itself. +Execute SHELL-BUILTIN with arguments ARGs without performing command +lookup. This is useful when you wish to reimplement a shell builtin +as a shell function, but need to execute the builtin within the function. $END #include diff --git a/builtins/builtin.def~ b/builtins/builtin.def~ index dfa58bc97..2d2b3259d 100644 --- a/builtins/builtin.def~ +++ b/builtins/builtin.def~ @@ -1,7 +1,7 @@ This file is builtin.def, from which is created builtin.c. It implements the builtin "builtin" in Bash. -Copyright (C) 1987-2002 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,9 +24,9 @@ $PRODUCES builtin.c $BUILTIN builtin $FUNCTION builtin_builtin $SHORT_DOC builtin [shell-builtin [arg ...]] -Run a shell builtin. This is useful when you wish to rename a -shell builtin to be a function, but need the functionality of the -builtin within the function itself. +Execute SHELL-BUILTIN with arguments ARGs without performing command lookup. +This is useful when you wish to reimplement a shell builtin as a shell +function, but need to execute the builtin within the function. $END #include diff --git a/builtins/caller.def b/builtins/caller.def index 63a25f3dd..99a5f15cf 100644 --- a/builtins/caller.def +++ b/builtins/caller.def @@ -1,7 +1,7 @@ This file is caller.def, from which is created caller.c. It implements the builtin "caller" in Bash. -Copyright (C) 2002-2003 Rocky Bernstein for Free Software Foundation, Inc. +Copyright (C) 2002-2008 Rocky Bernstein for Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,12 +25,11 @@ $BUILTIN caller $FUNCTION caller_builtin $DEPENDS_ON DEBUGGER $SHORT_DOC caller [expr] - Returns the context of the current subroutine call. -Without EXPR, returns "$line $filename". With EXPR, -returns "$line $subroutine $filename"; this extra information -can be used to provide a stack trace. +Without EXPR, returns "$line $filename". With EXPR, returns +"$line $subroutine $filename"; this extra information can be used to +provide a stack trace. The value of EXPR indicates how many call frames to go back before the current one; the top frame is frame 0. diff --git a/builtins/caller.def~ b/builtins/caller.def~ index 1209f9ed5..63a25f3dd 100644 --- a/builtins/caller.def~ +++ b/builtins/caller.def~ @@ -24,7 +24,7 @@ $PRODUCES caller.c $BUILTIN caller $FUNCTION caller_builtin $DEPENDS_ON DEBUGGER -$SHORT_DOC caller [EXPR] +$SHORT_DOC caller [expr] Returns the context of the current subroutine call. diff --git a/builtins/cd.def b/builtins/cd.def index ce3c88186..8b28ee49e 100644 --- a/builtins/cd.def +++ b/builtins/cd.def @@ -1,7 +1,7 @@ This file is cd.def, from which is created cd.c. It implements the builtins "cd" and "pwd" in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -73,17 +73,24 @@ int cdable_vars; $BUILTIN cd $FUNCTION cd_builtin $SHORT_DOC cd [-L|-P] [dir] -Change the current directory to DIR. The default for DIR is the value -of the HOME shell variable. The variable CDPATH defines the search -path for the directory containing DIR. Alternative directory names in -CDPATH are separated by a colon (:). A null directory name is the same -as the current directory, i.e., `.'. If DIR begins with a slash (/), -then CDPATH is not used. If the directory is not found, and the -shell option `cdable_vars' is set, then try the word as a variable -name. If that variable has a value, then cd to the value of that -variable. The -P option says to use the physical directory structure -instead of following symbolic links; the -L option forces symbolic links -to be followed. +Change the current directory to DIR. The default DIR is the value of the +HOME shell variable. + +The variable CDPATH defines the search path for the directory containing +DIR. Alternative directory names in CDPATH are separated by a colon (:). +A null directory name is the same as the current directory. If DIR begins +with a slash (/), then CDPATH is not used. + +If the directory is not found, and the shell option `cdable_vars' is set, +the word is assumed to be a variable name. If that variable has a value, +its value is used for DIR. + +Options: + -L force symbolic links to be followed + -P use the physical directory structure without following symbolic + links + +The default is to follow symbolic links, as if `-L' were specified. $END /* Just set $PWD, don't change OLDPWD. Used by `pwd -P' in posix mode. */ @@ -319,9 +326,14 @@ cd_builtin (list) $BUILTIN pwd $FUNCTION pwd_builtin $SHORT_DOC pwd [-LP] -Print the current working directory. With the -P option, pwd prints -the physical directory, without any symbolic links; the -L option -makes pwd follow symbolic links. +Print the name of the current working directory. + +Options: + -L print the value of $PWD if it names the current working + directory + -P print the physical directory, without any symbolic links + +By default, `pwd' behaves as if `-L' were specified. $END /* Non-zero means that pwd always prints the physical directory, without diff --git a/builtins/cd.def~ b/builtins/cd.def~ index f6258eb91..5dd7a8de4 100644 --- a/builtins/cd.def~ +++ b/builtins/cd.def~ @@ -1,7 +1,7 @@ This file is cd.def, from which is created cd.c. It implements the builtins "cd" and "pwd" in Bash. -Copyright (C) 1987-2005 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -73,17 +73,25 @@ int cdable_vars; $BUILTIN cd $FUNCTION cd_builtin $SHORT_DOC cd [-L|-P] [dir] -Change the current directory to DIR. The default for DIR is the value -of the HOME shell variable. The variable CDPATH defines the search -path for the directory containing DIR. Alternative directory names in -CDPATH are separated by a colon (:). A null directory name is the same -as the current directory, i.e., `.'. If DIR begins with a slash (/), -then CDPATH is not used. If the directory is not found, and the -shell option `cdable_vars' is set, then try the word as a variable -name. If that variable has a value, then cd to the value of that -variable. The -P option says to use the physical directory structure -instead of following symbolic links; the -L option forces symbolic links -to be followed. +Change the current directory to DIR. The default DIR is the value of the +HOME shell variable. + +The variable CDPATH defines the search path for the directory containing +DIR. Alternative directory names in CDPATH are separated by a colon (:). +A null directory name is the same as the current directory. If DIR begins +with a slash (/), then CDPATH is not used. + +If the directory is not found, and the shell option `cdable_vars' is set, +the word is assumed to be a variable name. If that variable has a value, +its value is used for DIR. + +Options, if specified, are interpreted as follows: + + -L force symbolic links to be followed + -P use the physical directory structure without following symbolic + links + +The default is to follow symbolic links, as if `-L' were specified. $END /* Just set $PWD, don't change OLDPWD. Used by `pwd -P' in posix mode. */ @@ -319,9 +327,14 @@ cd_builtin (list) $BUILTIN pwd $FUNCTION pwd_builtin $SHORT_DOC pwd [-LP] -Print the current working directory. With the -P option, pwd prints -the physical directory, without any symbolic links; the -L option -makes pwd follow symbolic links. +Print the name of the current working directory. + +Options: + -L print the value of $PWD if it names the current working + directory + -P print the physical directory, without any symbolic links + +By default, `pwd' behaves as if `-L' were specified. $END /* Non-zero means that pwd always prints the physical directory, without diff --git a/builtins/colon.def b/builtins/colon.def index a7cdc1250..2bab89dba 100644 --- a/builtins/colon.def +++ b/builtins/colon.def @@ -1,7 +1,7 @@ This file is colon.def, from which is created colon.c. It implements the builtin ":" in Bash. -Copyright (C) 1987-2002 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,19 +25,19 @@ $BUILTIN : $DOCNAME colon $FUNCTION colon_builtin $SHORT_DOC : -No effect; the command does nothing. A zero exit code is returned. +No effect; the command does nothing. A successful exit code is returned. $END $BUILTIN true $FUNCTION colon_builtin $SHORT_DOC true -Return a successful result. +Returns a successful result. $END $BUILTIN false $FUNCTION false_builtin $SHORT_DOC false -Return an unsuccessful result. +Returns an unsuccessful result. $END /* Return a successful result. */ diff --git a/builtins/colon.def~ b/builtins/colon.def~ new file mode 100644 index 000000000..1f64e945a --- /dev/null +++ b/builtins/colon.def~ @@ -0,0 +1,57 @@ +This file is colon.def, from which is created colon.c. +It implements the builtin ":" in Bash. + +Copyright (C) 1987-2008 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES colon.c + +$BUILTIN : +$DOCNAME colon +$FUNCTION colon_builtin +$SHORT_DOC : +No effect; the command does nothing. A successful exit code is returned. +$END + +$BUILTIN true +$FUNCTION colon_builtin +$SHORT_DOC true +Return a successful result. +$END + +$BUILTIN false +$FUNCTION false_builtin +$SHORT_DOC false +Return an unsuccessful result. +$END + +/* Return a successful result. */ +int +colon_builtin (ignore) + char *ignore; +{ + return (0); +} + +/* Return an unsuccessful result. */ +int +false_builtin (ignore) + char *ignore; +{ + return (1); +} diff --git a/builtins/command.def b/builtins/command.def index dbc1e9a14..060bbc839 100644 --- a/builtins/command.def +++ b/builtins/command.def @@ -1,7 +1,7 @@ This file is command.def, from which is created command.c. It implements the builtin "command" in Bash. -Copyright (C) 1987-2004 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,12 +24,15 @@ $PRODUCES command.c $BUILTIN command $FUNCTION command_builtin $SHORT_DOC command [-pVv] command [arg ...] -Runs COMMAND with ARGS ignoring shell functions. If you have a shell -function called `ls', and you wish to call the command `ls', you can -say "command ls". If the -p option is given, a default value is used -for PATH that is guaranteed to find all of the standard utilities. If -the -V or -v option is given, a string is printed describing COMMAND. -The -V option produces a more verbose description. +Runs COMMAND with ARGS suppressing shell function lookup, or display +information about the specified COMMANDs. Can be used to invoke commands +on disk when a function with the same name exists. + +Options: + -p use a default value for PATH that is guaranteed to find all of + the standard utilities + -v print a description of COMMAND similar to the `type' builtin + -V print a more verbose description of each COMMAND $END #include diff --git a/builtins/command.def~ b/builtins/command.def~ new file mode 100644 index 000000000..6cc42694f --- /dev/null +++ b/builtins/command.def~ @@ -0,0 +1,210 @@ +This file is command.def, from which is created command.c. +It implements the builtin "command" in Bash. + +Copyright (C) 1987-2008 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES command.c + +$BUILTIN command +$FUNCTION command_builtin +$SHORT_DOC command [-pVv] command [arg ...] +Runs COMMAND with ARGS suppressing shell function lookup, or display +information about the specified COMMANDs. Can be used to invoke commands +on disk when a function with the same name exists. + +Options: + -p use a default value for PATH that is guaranteed to find all of + the standard utilities. + -v print a description of COMMAND similar to the `type' builtin + -V print a more verbose description of each COMMAND +$END + +#include + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "../bashansi.h" + +#include "../shell.h" +#include "../execute_cmd.h" +#include "../flags.h" +#include "bashgetopt.h" +#include "common.h" + +#if defined (_CS_PATH) && defined (HAVE_CONFSTR) && !HAVE_DECL_CONFSTR +extern size_t confstr __P((int, char *, size_t)); +#endif + +extern int subshell_environment; + +static void restore_path __P((char *)); +static char *get_standard_path __P((void)); + +/* Run the commands mentioned in LIST without paying attention to shell + functions. */ +int +command_builtin (list) + WORD_LIST *list; +{ + int result, verbose, use_standard_path, opt; + char *old_path, *standard_path; + COMMAND *command; + + verbose = use_standard_path = 0; + reset_internal_getopt (); + while ((opt = internal_getopt (list, "pvV")) != -1) + { + switch (opt) + { + case 'p': + use_standard_path = 1; + break; + case 'V': + verbose = CDESC_SHORTDESC|CDESC_ABSPATH; /* look in common.h for constants */ + break; + case 'v': + verbose = CDESC_REUSABLE; /* ditto */ + break; + default: + builtin_usage (); + return (EX_USAGE); + } + } + list = loptend; + + if (list == 0) + return (EXECUTION_SUCCESS); + + if (verbose) + { + int found, any_found; + + for (any_found = 0; list; list = list->next) + { + found = describe_command (list->word->word, verbose); + + if (found == 0 && verbose != CDESC_REUSABLE) + sh_notfound (list->word->word); + + any_found += found; + } + return (any_found ? EXECUTION_SUCCESS : EXECUTION_FAILURE); + } + +#if defined (RESTRICTED_SHELL) + if (use_standard_path && restricted) + { + sh_restricted ("-p"); + return (EXECUTION_FAILURE); + } +#endif + + begin_unwind_frame ("command_builtin"); + + /* We don't want this to be reparsed (consider command echo 'foo &'), so + just make a simple_command structure and call execute_command with it. */ + if (use_standard_path) + { + old_path = get_string_value ("PATH"); + /* If old_path is NULL, $PATH is unset. If so, we want to make sure + it's unset after this command completes. */ + if (old_path) + old_path = savestring (old_path); + add_unwind_protect ((Function *)restore_path, old_path); + + standard_path = get_standard_path (); + bind_variable ("PATH", standard_path ? standard_path : "", 0); + FREE (standard_path); + } + +#define COMMAND_BUILTIN_FLAGS (CMD_NO_FUNCTIONS | CMD_INHIBIT_EXPANSION | CMD_COMMAND_BUILTIN) + + command = make_bare_simple_command (); + command->value.Simple->words = (WORD_LIST *)copy_word_list (list); + command->value.Simple->redirects = (REDIRECT *)NULL; + command->flags |= COMMAND_BUILTIN_FLAGS; + command->value.Simple->flags |= COMMAND_BUILTIN_FLAGS; +#if 0 + /* This breaks for things like ( cd /tmp ; command z ababa ; echo next ) + or $(command echo a ; command echo b;) or even + { command echo a; command echo b; } & */ + /* If we're in a subshell, see if we can get away without forking + again, since we've already forked to run this builtin. */ + if (subshell_environment) + { + command->flags |= CMD_NO_FORK; + command->value.Simple->flags |= CMD_NO_FORK; + } +#endif + add_unwind_protect ((char *)dispose_command, command); + result = execute_command (command); + + run_unwind_frame ("command_builtin"); + + return (result); +} + +/* Restore the value of the $PATH variable after replacing it when + executing `command -p'. */ +static void +restore_path (var) + char *var; +{ + if (var) + { + bind_variable ("PATH", var, 0); + free (var); + } + else + unbind_variable ("PATH"); +} + +/* Return a value for PATH that is guaranteed to find all of the standard + utilities. This uses Posix.2 configuration variables, if present. It + uses a value defined in config.h as a last resort. */ +static char * +get_standard_path () +{ +#if defined (_CS_PATH) && defined (HAVE_CONFSTR) + char *p; + size_t len; + + len = (size_t)confstr (_CS_PATH, (char *)NULL, (size_t)0); + if (len > 0) + { + p = (char *)xmalloc (len + 2); + *p = '\0'; + confstr (_CS_PATH, p, len); + return (p); + } + else + return (savestring (STANDARD_UTILS_PATH)); +#else /* !_CS_PATH || !HAVE_CONFSTR */ +# if defined (CS_PATH) + return (savestring (CS_PATH)); +# else + return (savestring (STANDARD_UTILS_PATH)); +# endif /* !CS_PATH */ +#endif /* !_CS_PATH || !HAVE_CONFSTR */ +} diff --git a/builtins/complete.def b/builtins/complete.def index 24707a744..6c77a6ed5 100644 --- a/builtins/complete.def +++ b/builtins/complete.def @@ -1,7 +1,7 @@ This file is complete.def, from which is created complete.c. It implements the builtins "complete" and "compgen" in Bash. -Copyright (C) 1999-2006 Free Software Foundation, Inc. +Copyright (C) 1999-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,11 +25,15 @@ $BUILTIN complete $DEPENDS_ON PROGRAMMABLE_COMPLETION $FUNCTION complete_builtin $SHORT_DOC complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...] -For each NAME, specify how arguments are to be completed. -If the -p option is supplied, or if no options are supplied, existing -completion specifications are printed in a way that allows them to be -reused as input. The -r option removes a completion specification for -each NAME, or, if no NAMEs are supplied, all completion specifications. +For each NAME, specify how arguments are to be completed by Readline. +If no options are supplied, existing completion specifications are printed +in a way that allows them to be reused as input. + +Options: + -p print existing completion specifications in a reusable format + -r remove a completion specification for each NAME, or, if no + NAMEs are supplied, all completion specifications + When completion is attempted, the actions are applied in the order the uppercase-letter options are listed above. $END diff --git a/builtins/complete.def~ b/builtins/complete.def~ index cb501c909..b05aac94d 100644 --- a/builtins/complete.def~ +++ b/builtins/complete.def~ @@ -1,7 +1,7 @@ This file is complete.def, from which is created complete.c. It implements the builtins "complete" and "compgen" in Bash. -Copyright (C) 1999-2006 Free Software Foundation, Inc. +Copyright (C) 1999-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,11 +25,15 @@ $BUILTIN complete $DEPENDS_ON PROGRAMMABLE_COMPLETION $FUNCTION complete_builtin $SHORT_DOC complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...] -For each NAME, specify how arguments are to be completed. -If the -p option is supplied, or if no options are supplied, existing -completion specifications are printed in a way that allows them to be -reused as input. The -r option removes a completion specification for -each NAME, or, if no NAMEs are supplied, all completion specifications. +For each NAME, specify how arguments are to be completed by Readline. +If no options are supplied, existing completion specifications are printed +in a way that allows them to be reused as input. + +Options: + -p print existing completion specifications in a reusable format + -r remove a completion specification for each NAME, or, if no NAMEs + are supplied, all completion specifications + When completion is attempted, the actions are applied in the order the uppercase-letter options are listed above. $END @@ -480,13 +484,12 @@ print_one_completion (cmd, cs) SQPRINTARG (cs->suffix, "-S"); SQPRINTARG (cs->filterpat, "-X"); + SQPRINTARG (cs->command, "-C"); + /* simple arguments that don't require quoting */ PRINTARG (cs->funcname, "-F"); - PRINTARG (cs->command, "-C"); - x = sh_single_quote (cmd); printf ("%s\n", x); - free (x); return (0); } @@ -529,7 +532,8 @@ print_cmd_completions (list) ret = EXECUTION_FAILURE; } } - return (ret); + + return (sh_chkwrite (ret)); } $BUILTIN compgen diff --git a/builtins/declare.def b/builtins/declare.def index f8fe32bfc..09c21a35e 100644 --- a/builtins/declare.def +++ b/builtins/declare.def @@ -1,7 +1,7 @@ This file is declare.def, from which is created declare.c. It implements the builtins "declare" and "local" in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,16 +24,16 @@ $PRODUCES declare.c $BUILTIN declare $FUNCTION declare_builtin $SHORT_DOC declare [-afFirtx] [-p] [name[=value] ...] -Declare variables and give them attributes. If no NAMEs are -given, then display the values of variables instead. When -displaying variable values, the -f option restricts the display -to function names and definitions; the -F option restricts the -display to function names only (plus line number and source file -when debugging). The -p option will display the attributes and -values of each NAME. +Declare variables and give them attributes. If no NAMEs are given, +display the attributes and values of all variables. -The options which set attributes are: +Options: + -f restrict action or display to function names and definitions + -F restrict display to function names only (plus line number and + source file when debugging) + -p display the attributes and value of each NAME +Options which set attributes: -a to make NAMEs arrays (if supported) -i to make NAMEs have the `integer' attribute -r to make NAMEs readonly @@ -43,7 +43,7 @@ The options which set attributes are: Using `+' instead of `-' turns off the given attribute. Variables with the integer attribute have arithmetic evaluation (see -the `let' command) done when the variable is assigned a value. +the `let' command) performed when the variable is assigned a value. When used in a function, `declare' makes NAMEs local, as with the `local' command. @@ -52,7 +52,7 @@ $END $BUILTIN typeset $FUNCTION declare_builtin $SHORT_DOC typeset [-afFirtx] [-p] name[=value] ... -Obsolete. See `declare'. +Obsolete. See `help declare'. $END #include @@ -90,10 +90,11 @@ declare_builtin (list) $BUILTIN local $FUNCTION local_builtin $SHORT_DOC local [option] name[=value] ... -Create a local variable called NAME, and give it VALUE. LOCAL -can only be used within a function; it makes the variable NAME -have a visible scope restricted to that function and its children. -OPTION can be any of the options accepted by `declare'. +Create a local variable called NAME, and give it VALUE. OPTION can +be any option accepted by `declare'. + +Local variables can only be used within a function; they are visible +only to the function where they are defined and its children. $END int local_builtin (list) diff --git a/builtins/declare.def~ b/builtins/declare.def~ index 31c09012c..2c7352c2f 100644 --- a/builtins/declare.def~ +++ b/builtins/declare.def~ @@ -1,7 +1,7 @@ This file is declare.def, from which is created declare.c. It implements the builtins "declare" and "local" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,15 +24,17 @@ $PRODUCES declare.c $BUILTIN declare $FUNCTION declare_builtin $SHORT_DOC declare [-afFirtx] [-p] [name[=value] ...] -Declare variables and give them attributes. If no NAMEs are -given, then display the values of variables instead. When -displaying variable values, the -f option restricts the display -to function names and definitions; the -F option restricts the -display to function names only (plus line number and source file -when debugging). The -p option will display the attributes and -values of each NAME. +Declare variables and give them attributes. If no NAMEs are given, +display the attributes and values of all variables. -The options which set attributes are: +Options: + + -f restrict action or display to function names and definitions + -F restrict display to function names only (plus line number and + source file when debugging) + -p display the attributes and value of each NAME + +Options which set attributes: -a to make NAMEs arrays (if supported) -i to make NAMEs have the `integer' attribute @@ -43,7 +45,7 @@ The options which set attributes are: Using `+' instead of `-' turns off the given attribute. Variables with the integer attribute have arithmetic evaluation (see -the `let' command) done when the variable is assigned a value. +the `let' command) performed when the variable is assigned a value. When used in a function, `declare' makes NAMEs local, as with the `local' command. @@ -52,7 +54,7 @@ $END $BUILTIN typeset $FUNCTION declare_builtin $SHORT_DOC typeset [-afFirtx] [-p] name[=value] ... -Obsolete. See `declare'. +Obsolete. See `help declare'. $END #include @@ -90,10 +92,11 @@ declare_builtin (list) $BUILTIN local $FUNCTION local_builtin $SHORT_DOC local [option] name[=value] ... -Create a local variable called NAME, and give it VALUE. LOCAL -can only be used within a function; it makes the variable NAME -have a visible scope restricted to that function and its children. -OPTION can be any of the options accepted by `declare'. +Create a local variable called NAME, and give it VALUE. OPTION can +be any option accepted by `declare'. + +Local variables can only be used within a function; they are visible +only to the function where they are defined and its children. $END int local_builtin (list) diff --git a/builtins/echo.def b/builtins/echo.def index 483f93bc9..1d2b33bad 100644 --- a/builtins/echo.def +++ b/builtins/echo.def @@ -1,7 +1,7 @@ This file is echo.def, from which is created echo.c. It implements the builtin "echo" in Bash. -Copyright (C) 1987-2002 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -37,33 +37,38 @@ $BUILTIN echo $FUNCTION echo_builtin $DEPENDS_ON V9_ECHO $SHORT_DOC echo [-neE] [arg ...] -Output the ARGs. If -n is specified, the trailing newline is -suppressed. If the -e option is given, interpretation of the -following backslash-escaped characters is turned on: - \a alert (bell) - \b backspace - \c suppress trailing newline - \e escape character - \f form feed - \n new line - \r carriage return - \t horizontal tab - \v vertical tab - \\ backslash - \0nnn the character whose ASCII code is NNN (octal). NNN can be - 0 to 3 octal digits - \xHH the eight-bit character whose value is HH (hexadecimal). HH - can be one or two hex digits - -You can explicitly turn off the interpretation of the above characters -with the -E option. +Display the ARGs on the standard output followed by a newline. + +Options: + -n do not append a newline + -e enable interpretation of the following backslash escapes + -E explicitly suppress interpretation of backslash escapes + +`echo' interprets the following backslash-escaped characters: + \a alert (bell) + \b backspace + \c suppress trailing newline + \e escape character + \f form feed + \n new line + \r carriage return + \t horizontal tab + \v vertical tab + \\ backslash + \0nnn the character whose ASCII code is NNN (octal). NNN can be + 0 to 3 octal digits + \xHH the eight-bit character whose value is HH (hexadecimal). HH + can be one or two hex digits $END $BUILTIN echo $FUNCTION echo_builtin $DEPENDS_ON !V9_ECHO $SHORT_DOC echo [-n] [arg ...] -Output the ARGs. If -n is specified, the trailing newline is suppressed. +Display the ARGs on the standard output followed by a newline. + +Options: + -n do not append a newline $END #if defined (V9_ECHO) diff --git a/builtins/echo.def~ b/builtins/echo.def~ new file mode 100644 index 000000000..74b872b70 --- /dev/null +++ b/builtins/echo.def~ @@ -0,0 +1,187 @@ +This file is echo.def, from which is created echo.c. +It implements the builtin "echo" in Bash. + +Copyright (C) 1987-2008 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES echo.c +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include "../bashansi.h" + +#include +#include "../shell.h" + +#include "common.h" + +$BUILTIN echo +$FUNCTION echo_builtin +$DEPENDS_ON V9_ECHO +$SHORT_DOC echo [-neE] [arg ...] +Display each ARG on the standard output. + +Options: + -n do not append a trailing newline + -e enable interpretation of the following backslash escapes + -E explicitly suppress interpretation of backslash escapes + +`echo' interprets the following backslash-escaped characters: + \a alert (bell) + \b backspace + \c suppress trailing newline + \e escape character + \f form feed + \n new line + \r carriage return + \t horizontal tab + \v vertical tab + \\ backslash + \0nnn the character whose ASCII code is NNN (octal). NNN can be + 0 to 3 octal digits + \xHH the eight-bit character whose value is HH (hexadecimal). HH + can be one or two hex digits + +$END + +$BUILTIN echo +$FUNCTION echo_builtin +$DEPENDS_ON !V9_ECHO +$SHORT_DOC echo [-n] [arg ...] +Display each ARG on the standard output. + +Options: + -n do not append a trailing newline +$END + +#if defined (V9_ECHO) +# define VALID_ECHO_OPTIONS "neE" +#else /* !V9_ECHO */ +# define VALID_ECHO_OPTIONS "n" +#endif /* !V9_ECHO */ + +/* System V machines already have a /bin/sh with a v9 behaviour. We + give Bash the identical behaviour for these machines so that the + existing system shells won't barf. Regrettably, the SUS v2 has + standardized the Sys V echo behavior. This variable is external + so that we can have a `shopt' variable to control it at runtime. */ +#if defined (DEFAULT_ECHO_TO_XPG) || defined (STRICT_POSIX) +int xpg_echo = 1; +#else +int xpg_echo = 0; +#endif /* DEFAULT_ECHO_TO_XPG */ + +extern int posixly_correct; + +/* Print the words in LIST to standard output. If the first word is + `-n', then don't print a trailing newline. We also support the + echo syntax from Version 9 Unix systems. */ +int +echo_builtin (list) + WORD_LIST *list; +{ + int display_return, do_v9, i, len; + char *temp, *s; + + do_v9 = xpg_echo; + display_return = 1; + + if (posixly_correct && xpg_echo) + goto just_echo; + + for (; list && (temp = list->word->word) && *temp == '-'; list = list->next) + { + /* If it appears that we are handling options, then make sure that + all of the options specified are actually valid. Otherwise, the + string should just be echoed. */ + temp++; + + for (i = 0; temp[i]; i++) + { + if (strchr (VALID_ECHO_OPTIONS, temp[i]) == 0) + break; + } + + /* echo - and echo - both mean to just echo the arguments. */ + if (*temp == 0 || temp[i]) + break; + + /* All of the options in TEMP are valid options to ECHO. + Handle them. */ + while (i = *temp++) + { + switch (i) + { + case 'n': + display_return = 0; + break; +#if defined (V9_ECHO) + case 'e': + do_v9 = 1; + break; + case 'E': + do_v9 = 0; + break; +#endif /* V9_ECHO */ + default: + goto just_echo; /* XXX */ + } + } + } + +just_echo: + + clearerr (stdout); /* clear error before writing and testing success */ + + while (list) + { + i = len = 0; + temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len) + : list->word->word; + if (temp) + { + if (do_v9) + { + for (s = temp; len > 0; len--) + putchar (*s++); + } + else + printf ("%s", temp); +#if defined (SunOS5) + fflush (stdout); /* Fix for bug in SunOS 5.5 printf(3) */ +#endif + } + if (do_v9 && temp) + free (temp); + list = list->next; + if (i) + { + display_return = 0; + break; + } + if (list) + putchar(' '); + } + + if (display_return) + putchar ('\n'); + return (sh_chkwrite (EXECUTION_SUCCESS)); +} diff --git a/builtins/enable.def b/builtins/enable.def index 3570be5ef..d53650ccb 100644 --- a/builtins/enable.def +++ b/builtins/enable.def @@ -1,7 +1,7 @@ This file is enable.def, from which is created enable.c. It implements the builtin "enable" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,19 +24,24 @@ $PRODUCES enable.c $BUILTIN enable $FUNCTION enable_builtin $SHORT_DOC enable [-a] [-dnps] [-f filename] [name ...] -Enable and disable builtin shell commands. This allows -you to use a disk command which has the same name as a shell -builtin without specifying a full pathname. If -n is used, the -NAMEs become disabled; otherwise NAMEs are enabled. For example, -to use the `test' found in $PATH instead of the shell builtin -version, type `enable -n test'. On systems supporting dynamic -loading, the -f option may be used to load new builtins from the -shared object FILENAME. The -d option will delete a builtin -previously loaded with -f. If no non-option NAMEs are given, or -the -p option is supplied, a list of builtins is printed. The --a option means to print every builtin with an indication of whether -or not it is enabled. The -s option restricts the output to the POSIX.2 -`special' builtins. The -n option displays a list of all disabled builtins. +Enables and disables builtin shell commands. Disabling allows you to +execute a disk command which has the same name as a shell builtin +without using a full pathname. + +Options: + -a print a list of builtins showing whether or not each is enabled + -n disable each NAME or display a list of disabled builtins + -p print the list of builtins in a reusable format + -s print only the names of Posix `special' builtins + +Options controlling dynamic loading: + -f Load builtin NAME from shared object FILENAME + -d Remove a builtin loaded with -f + +Without options, each NAME is enabled. + +To use the `test' found in $PATH instead of the shell builtin +version, type `enable -n test'. $END #include diff --git a/builtins/enable.def~ b/builtins/enable.def~ index 5307e3946..527cce27f 100644 --- a/builtins/enable.def~ +++ b/builtins/enable.def~ @@ -1,7 +1,7 @@ This file is enable.def, from which is created enable.c. It implements the builtin "enable" in Bash. -Copyright (C) 1987-2003 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -23,20 +23,27 @@ $PRODUCES enable.c $BUILTIN enable $FUNCTION enable_builtin -$SHORT_DOC enable [-pnds] [-a] [-f filename] [name ...] -Enable and disable builtin shell commands. This allows -you to use a disk command which has the same name as a shell -builtin without specifying a full pathname. If -n is used, the -NAMEs become disabled; otherwise NAMEs are enabled. For example, -to use the `test' found in $PATH instead of the shell builtin -version, type `enable -n test'. On systems supporting dynamic -loading, the -f option may be used to load new builtins from the -shared object FILENAME. The -d option will delete a builtin -previously loaded with -f. If no non-option NAMEs are given, or -the -p option is supplied, a list of builtins is printed. The --a option means to print every builtin with an indication of whether -or not it is enabled. The -s option restricts the output to the POSIX.2 -`special' builtins. The -n option displays a list of all disabled builtins. +$SHORT_DOC enable [-a] [-dnps] [-f filename] [name ...] +Enables and disables builtin shell commands. Disabling allows you to +execute a disk command which has the same name as a shell builtin +without using a full pathname. + +Options: + + -a print a list of builtins showing whether or not each is enabled + -n disable each NAME or display a list of disabled builtins + -p print the list of builtins in a reusable format + -s print only the names of Posix `special' builtins + +Options controlling dynamic loading: + + -f Load builtin NAME from shared object FILENAME + -d Remove a builtin loaded with -f + +Without options, each NAME is enabled. + +To use the `test' found in $PATH instead of the shell builtin +version, type `enable -n test'. $END #include diff --git a/builtins/eval.def b/builtins/eval.def index 500e8c730..fb91447f7 100644 --- a/builtins/eval.def +++ b/builtins/eval.def @@ -1,7 +1,7 @@ This file is eval.def, from which is created eval.c. It implements the builtin "eval" in Bash. -Copyright (C) 1987-2002 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,7 +24,8 @@ $PRODUCES eval.c $BUILTIN eval $FUNCTION eval_builtin $SHORT_DOC eval [arg ...] -Read ARGs as input to the shell and execute the resulting command(s). +Combine ARGs into a single string, use the result as input to the shell, +and execute the resulting commands. $END #include diff --git a/builtins/eval.def~ b/builtins/eval.def~ new file mode 100644 index 000000000..500e8c730 --- /dev/null +++ b/builtins/eval.def~ @@ -0,0 +1,53 @@ +This file is eval.def, from which is created eval.c. +It implements the builtin "eval" in Bash. + +Copyright (C) 1987-2002 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES eval.c + +$BUILTIN eval +$FUNCTION eval_builtin +$SHORT_DOC eval [arg ...] +Read ARGs as input to the shell and execute the resulting command(s). +$END + +#include +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "../shell.h" +#include "bashgetopt.h" +#include "common.h" + +/* Parse the string that these words make, and execute the command found. */ +int +eval_builtin (list) + WORD_LIST *list; +{ + if (no_options (list)) + return (EX_USAGE); + list = loptend; /* skip over possible `--' */ + + /* Note that parse_and_execute () frees the string it is passed. */ + return (list ? parse_and_execute (string_list (list), "eval", SEVAL_NOHIST) : EXECUTION_SUCCESS); +} diff --git a/builtins/exec.def b/builtins/exec.def index fd92d7edd..ffa427617 100644 --- a/builtins/exec.def +++ b/builtins/exec.def @@ -1,7 +1,7 @@ This file is exec.def, from which is created exec.c. It implements the builtin "exec" in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -26,14 +26,15 @@ $FUNCTION exec_builtin $SHORT_DOC exec [-cl] [-a name] [command [arguments ...]] [redirection ...] Execute COMMAND, replacing this shell with the specified program. ARGUMENTS become the arguments to COMMAND. If COMMAND is not specified, -any redirections take effect in the current shell. If the `-l' option -is supplied, the shell places a dash in the zeroth argument to the -COMMAND, as login does. If the `-c' option is supplied, COMMAND is -executed with an empty environment. The `-a' option causes the shell -to pass NAME as the zeroth argument to COMMAND. If the command cannot be -executed, a non-interactive shell exits, unless the shell option `execfail' -is set. If COMMAND is absent, any redirections specified take effect in the -calling shell. +any redirections take effect in the current shell. + +Options: + -a name pass NAME as the zeroth argument to COMMAND + -c execute COMMAND with an empty environment + -l place a dash in the zeroth argument to COMMAND + +If the command cannot be executed, a non-interactive shell exits, unless +the shell option `execfail' is set. $END #include diff --git a/builtins/exec.def~ b/builtins/exec.def~ index 4a89ed6f7..ce4aeb5e8 100644 --- a/builtins/exec.def~ +++ b/builtins/exec.def~ @@ -1,7 +1,7 @@ This file is exec.def, from which is created exec.c. It implements the builtin "exec" in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -26,14 +26,16 @@ $FUNCTION exec_builtin $SHORT_DOC exec [-cl] [-a name] [command [arguments ...]] [redirection ...] Execute COMMAND, replacing this shell with the specified program. ARGUMENTS become the arguments to COMMAND. If COMMAND is not specified, -any redirections take effect in the current shell. If the `-l' option -is supplied, the shell places a dash in the zeroth argument to the -COMMAND, as login does. If the `-c' option is supplied, COMMAND is -executed with an empty environment. The `-a' option causes the shell -to pass NAME as the zeroth argument to COMMAND. If the command cannot be -executed, a non-interactive shell exits, unless the shell option `execfail' -is set. If COMMAND is absent, any redirections take effect in the -calling shell. +any redirections take effect in the current shell. + +Options: + + -a name pass NAME as the zeroth argument to COMMAND + -c execute COMMAND with an empty environment + -l place a dash in the zeroth argument to COMMAND + +If the command cannot be executed, a non-interactive shell exits, unless +the shell option `execfail' is set. $END #include diff --git a/builtins/exit.def b/builtins/exit.def index 3c0bfdf7f..800aab0f4 100644 --- a/builtins/exit.def +++ b/builtins/exit.def @@ -1,7 +1,7 @@ This file is exit.def, from which is created exit.c. It implements the builtins "exit", and "logout" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,7 +24,7 @@ $PRODUCES exit.c $BUILTIN exit $FUNCTION exit_builtin $SHORT_DOC exit [n] -Exit the shell with a status of N. If N is omitted, the exit status +Exits the shell with a status of N. If N is omitted, the exit status is that of the last command executed. $END @@ -71,7 +71,7 @@ exit_builtin (list) $BUILTIN logout $FUNCTION logout_builtin $SHORT_DOC logout -Logout of a login shell. +Exits a login shell. Returns an error if not executed in a login shell. $END /* How to logout. */ diff --git a/builtins/exit.def~ b/builtins/exit.def~ index 2993610e1..3c0bfdf7f 100644 --- a/builtins/exit.def~ +++ b/builtins/exit.def~ @@ -45,6 +45,7 @@ $END #include "common.h" #include "builtext.h" /* for jobs_builtin */ +extern int check_jobs_at_exit; extern int last_command_exit_value; extern int running_trap, trap_saved_exit_value; extern int subshell_environment; @@ -94,7 +95,7 @@ exit_or_logout (list) int exit_value; #if defined (JOB_CONTROL) - int exit_immediate_okay; + int exit_immediate_okay, stopmsg; exit_immediate_okay = (interactive == 0 || last_shell_builtin == exit_builtin || @@ -105,18 +106,29 @@ exit_or_logout (list) if (exit_immediate_okay == 0) { register int i; - for (i = 0; i < js.j_jobslots; i++) + for (i = stopmsg = 0; i < js.j_jobslots; i++) if (jobs[i] && STOPPED (i)) - { - fprintf (stderr, _("There are stopped jobs.\n")); - - /* This is NOT superfluous because EOF can get here without - going through the command parser. Set both last and this - so that either `exit', `logout', or ^D will work to exit - immediately if nothing intervenes. */ - this_shell_builtin = last_shell_builtin = exit_builtin; - return (EXECUTION_FAILURE); - } + stopmsg = JSTOPPED; + else if (check_jobs_at_exit && stopmsg == 0 && RUNNING (i)) + stopmsg = JRUNNING; + + if (stopmsg == JSTOPPED) + fprintf (stderr, _("There are stopped jobs.\n")); + else if (stopmsg == JRUNNING) + fprintf (stderr, _("There are running jobs.\n")); + + if (stopmsg && check_jobs_at_exit) + list_all_jobs (JLIST_STANDARD); + + if (stopmsg) + { + /* This is NOT superfluous because EOF can get here without + going through the command parser. Set both last and this + so that either `exit', `logout', or ^D will work to exit + immediately if nothing intervenes. */ + this_shell_builtin = last_shell_builtin = exit_builtin; + return (EXECUTION_FAILURE); + } } #endif /* JOB_CONTROL */ diff --git a/builtins/fc.def b/builtins/fc.def index d729a7485..0b52baf43 100644 --- a/builtins/fc.def +++ b/builtins/fc.def @@ -1,7 +1,7 @@ This file is fc.def, from which is created fc.c. It implements the builtin "fc" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -30,12 +30,12 @@ FIRST and LAST can be numbers specifying the range, or FIRST can be a string, which means the most recent command beginning with that string. - -e ENAME selects which editor to use. Default is FCEDIT, then EDITOR, - then vi. - - -l means list lines instead of editing. - -n means no line numbers listed. - -r means reverse the order of the lines (making it newest listed first). +Options: + -e ENAME select which editor to use. Default is FCEDIT, then EDITOR, + then vi + -l list lines instead of editing + -n omit line numbers when listing + -r reverse the order of the lines (newest listed first) With the `fc -s [pat=rep ...] [command]' format, COMMAND is re-executed after the substitution OLD=NEW is performed. diff --git a/builtins/fc.def~ b/builtins/fc.def~ index 70421124f..825367fa4 100644 --- a/builtins/fc.def~ +++ b/builtins/fc.def~ @@ -1,7 +1,7 @@ This file is fc.def, from which is created fc.c. It implements the builtin "fc" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -30,12 +30,13 @@ FIRST and LAST can be numbers specifying the range, or FIRST can be a string, which means the most recent command beginning with that string. - -e ENAME selects which editor to use. Default is FCEDIT, then EDITOR, - then vi. +Options: - -l means list lines instead of editing. - -n means no line numbers listed. - -r means reverse the order of the lines (making it newest listed first). + -e ENAME select which editor to use. Default is FCEDIT, then EDITOR, + then vi + -l list lines instead of editing + -n omit line numbers when listing + -r reverse the order of the lines (newest listed first) With the `fc -s [pat=rep ...] [command]' format, COMMAND is re-executed after the substitution OLD=NEW is performed. @@ -296,7 +297,6 @@ fc_builtin (list) delete_last_history (); last_hist = i - remember_on_history - hist_last_line_added; -itrace("fc: i = %d last_hist = %d remember_on_history = %d hist_last_line_added = %d", i, last_hist, remember_on_history, hist_last_line_added); if (list) { @@ -307,7 +307,6 @@ itrace("fc: i = %d last_hist = %d remember_on_history = %d hist_last_line_added histend = fc_gethnum (list->word->word, hlist); else histend = listing ? last_hist : histbeg; -itrace("fc: histbeg = %d histend = %d", histbeg, histend); } else { diff --git a/builtins/fg_bg.def b/builtins/fg_bg.def index 2f86c8bd7..fecd6a3a3 100644 --- a/builtins/fg_bg.def +++ b/builtins/fg_bg.def @@ -1,7 +1,7 @@ This file is fg_bg.def, from which is created fg_bg.c. It implements the builtins "bg" and "fg" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,9 +25,9 @@ $BUILTIN fg $FUNCTION fg_builtin $DEPENDS_ON JOB_CONTROL $SHORT_DOC fg [job_spec] -Place JOB_SPEC in the foreground, and make it the current job. If -JOB_SPEC is not present, the shell's notion of the current job is -used. +Place the job identified by JOB_SPEC in the foreground, making it the +current job. If JOB_SPEC is not present, the shell's notion of the +current job is used. $END #include @@ -83,9 +83,9 @@ $BUILTIN bg $FUNCTION bg_builtin $DEPENDS_ON JOB_CONTROL $SHORT_DOC bg [job_spec ...] -Place each JOB_SPEC in the background, as if it had been started with -`&'. If JOB_SPEC is not present, the shell's notion of the current -job is used. +Place the jobs identified by each JOB_SPEC in the background, as if they +had been started with `&'. If JOB_SPEC is not present, the shell's notion +of the current job is used. $END #if defined (JOB_CONTROL) diff --git a/builtins/fg_bg.def~ b/builtins/fg_bg.def~ index c14381b6d..655436d53 100644 --- a/builtins/fg_bg.def~ +++ b/builtins/fg_bg.def~ @@ -1,7 +1,7 @@ This file is fg_bg.def, from which is created fg_bg.c. It implements the builtins "bg" and "fg" in Bash. -Copyright (C) 1987-2005 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,9 +25,9 @@ $BUILTIN fg $FUNCTION fg_builtin $DEPENDS_ON JOB_CONTROL $SHORT_DOC fg [job_spec] -Place JOB_SPEC in the foreground, and make it the current job. If -JOB_SPEC is not present, the shell's notion of the current job is -used. +Place the job identified by JOB_SPEC in the foreground, making it the +current job. If JOB_SPEC is not present, the shell's notion of the current +job is used. $END #include @@ -83,9 +83,9 @@ $BUILTIN bg $FUNCTION bg_builtin $DEPENDS_ON JOB_CONTROL $SHORT_DOC bg [job_spec ...] -Place each JOB_SPEC in the background, as if it had been started with -`&'. If JOB_SPEC is not present, the shell's notion of the current -job is used. +Place the jobs identified by each JOB_SPEC in the background, as if they +had been started with `&'. If JOB_SPEC is not present, the shell's notion +of the current job is used. $END #if defined (JOB_CONTROL) @@ -137,7 +137,7 @@ fg_bg (list, foreground) if (INVALID_JOB (job)) { if (job != DUP_JOB) - sh_badjob (list ? list->word->word : "current"); + sh_badjob (list ? list->word->word : _("current")); goto failure; } diff --git a/builtins/hash.def b/builtins/hash.def index 8c827e170..95c8d8e08 100644 --- a/builtins/hash.def +++ b/builtins/hash.def @@ -1,7 +1,7 @@ This file is hash.def, from which is created hash.c. It implements the builtin "hash" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,16 +24,17 @@ $PRODUCES hash.c $BUILTIN hash $FUNCTION hash_builtin $SHORT_DOC hash [-lr] [-p pathname] [-dt] [name ...] -For each NAME, the full pathname of the command is determined and -remembered. If the -p option is supplied, PATHNAME is used as the -full pathname of NAME, and no path search is performed. The -r -option causes the shell to forget all remembered locations. The -d -option causes the shell to forget the remembered location of each NAME. -If the -t option is supplied the full pathname to which each NAME -corresponds is printed. If multiple NAME arguments are supplied with --t, the NAME is printed before the hashed full pathname. The -l option -causes output to be displayed in a format that may be reused as input. -If no arguments are given, information about remembered commands is displayed. +Determine and remember the full pathname of each command NAME. If +no arguments are given, information about remembered commands is displayed. + +Options: + -d forget the remembered location of each NAME + -l display in a format that may be reused as input + -p pathname use PATHNAME is the full pathname of NAME + -r forget all remembered locations + -t print the remembered location of each NAME, preceding + each location with the corresponding NAME if multiple + NAMEs are given $END #include diff --git a/builtins/hash.def~ b/builtins/hash.def~ index dccd97e02..8c827e170 100644 --- a/builtins/hash.def~ +++ b/builtins/hash.def~ @@ -233,7 +233,7 @@ print_hashed_commands (fmt) return (0); if (fmt == 0) - printf ("hits\tcommand\n"); + printf (_("hits\tcommand\n")); hash_walk (hashed_filenames, fmt ? print_portable_hash_info : print_hash_info); return (1); } diff --git a/builtins/help.def b/builtins/help.def index 743685b11..8619f7545 100644 --- a/builtins/help.def +++ b/builtins/help.def @@ -1,7 +1,7 @@ This file is help.def, from which is created help.c. It implements the builtin "help" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,11 +25,13 @@ $BUILTIN help $FUNCTION help_builtin $DEPENDS_ON HELP_BUILTIN $SHORT_DOC help [-s] [pattern ...] -Display helpful information about builtin commands. If PATTERN is +Displays brief information about builtin commands. If PATTERN is specified, gives detailed help on all commands matching PATTERN, -otherwise a list of the builtins is printed. The -s option -restricts the output for each builtin command matching PATTERN to -a short usage synopsis. +otherwise the list of help topics is printed. + +Options: + -s output only a short usage synopsis for each topic matching + PATTERN $END #include diff --git a/builtins/help.def~ b/builtins/help.def~ index 067b83cfe..729f61f38 100644 --- a/builtins/help.def~ +++ b/builtins/help.def~ @@ -1,7 +1,7 @@ This file is help.def, from which is created help.c. It implements the builtin "help" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,11 +25,12 @@ $BUILTIN help $FUNCTION help_builtin $DEPENDS_ON HELP_BUILTIN $SHORT_DOC help [-s] [pattern ...] -Display helpful information about builtin commands. If PATTERN is +Displays brief information about builtin commands. If PATTERN is specified, gives detailed help on all commands matching PATTERN, -otherwise a list of the builtins is printed. The -s option -restricts the output for each builtin command matching PATTERN to -a short usage synopsis. +otherwise the list of help topics is printed. + +Options: + -s output only a short usage synopsis for each topic matching PATTERN $END #include @@ -208,7 +209,7 @@ A star (*) next to a name means that the command is disabled.\n\ blurb[width - 2] = '>'; /* indicate truncation */ blurb[width - 1] = '\0'; printf ("%s", blurb); - if (((i << 1) >= num_shell_builtins)) /* || (i+height >= num_shell_builtins)) */ + if (((i << 1) >= num_shell_builtins) || (i+height >= num_shell_builtins)) { printf ("\n"); break; diff --git a/builtins/history.def b/builtins/history.def index 434fe271c..319523998 100644 --- a/builtins/history.def +++ b/builtins/history.def @@ -1,7 +1,7 @@ This file is history.def, from which is created history.c. It implements the builtin "history" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,23 +25,26 @@ $BUILTIN history $FUNCTION history_builtin $DEPENDS_ON HISTORY $SHORT_DOC history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...] -Display the history list with line numbers. Lines listed with -with a `*' have been modified. Argument of N says to list only -the last N lines. The `-c' option causes the history list to be -cleared by deleting all of the entries. The `-d' option deletes -the history entry at offset OFFSET. The `-w' option writes out the -current history to the history file; `-r' means to read the file and -append the contents to the history list instead. `-a' means -to append history lines from this session to the history file. -Argument `-n' means to read all history lines not already read -from the history file and append them to the history list. - -If FILENAME is given, then that is used as the history file. Otherwise, +Display the history list with line numbers, prefixing each modified +entry with a `*'. An argument of N lists only the last N entries. + +Options: + -c clear the history list by deleting all of the entries + -d offset delete the history entry at offset OFFSET. + + -a append history lines from this session to the history file + -n read all history lines not already read from the history file + -r read the history file and append the contents to the history + list + -w write the current history to the history file + and append them to the history list + + -p perform history expansion on each ARG and display the result + without storing it in the history list + -s append the ARGs to the history list as a single entry + +If FILENAME is given, it is used as the history file. Otherwise, if $HISTFILE has a value, that is used, else ~/.bash_history. -If the -s option is supplied, the non-option ARGs are appended to -the history list as a single entry. The -p option means to perform -history expansion on each ARG and display the result, without storing -anything in the history list. If the $HISTTIMEFORMAT variable is set and not null, its value is used as a format string for strftime(3) to print the time stamp associated diff --git a/builtins/history.def~ b/builtins/history.def~ index 1a127e2e9..965b71c70 100644 --- a/builtins/history.def~ +++ b/builtins/history.def~ @@ -1,7 +1,7 @@ This file is history.def, from which is created history.c. It implements the builtin "history" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,24 +24,27 @@ $PRODUCES history.c $BUILTIN history $FUNCTION history_builtin $DEPENDS_ON HISTORY -$SHORT_DOC history [-c] [-d offset] [n] or history -awrn [filename] or history -ps arg [arg...] -Display the history list with line numbers. Lines listed with -with a `*' have been modified. Argument of N says to list only -the last N lines. The `-c' option causes the history list to be -cleared by deleting all of the entries. The `-d' option deletes -the history entry at offset OFFSET. The `-w' option writes out the -current history to the history file; `-r' means to read the file and -append the contents to the history list instead. `-a' means -to append history lines from this session to the history file. -Argument `-n' means to read all history lines not already read -from the history file and append them to the history list. - -If FILENAME is given, then that is used as the history file. Otherwise, +$SHORT_DOC history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...] +Display the history list with line numbers, prefixing each modified entry +with a `*'. An argument of N lists only the last N entries. + +Options: + -c clear the history list by deleting all of the entries + -d offset delete the history entry at offset OFFSET. + + -a append history lines from this session to the history file + -n read all history lines not already read from the history file + -r read the history file and append the contents to the history + list + -w write the current history to the history file + and append them to the history list + + -p perform history expansion on each ARG and display the result + without storing it in the history list + -s append the ARGs to the history list as a single entry + +If FILENAME is given, it is used as the history file. Otherwise, if $HISTFILE has a value, that is used, else ~/.bash_history. -If the -s option is supplied, the non-option ARGs are appended to -the history list as a single entry. The -p option means to perform -history expansion on each ARG and display the result, without storing -anything in the history list. If the $HISTTIMEFORMAT variable is set and not null, its value is used as a format string for strftime(3) to print the time stamp associated @@ -170,7 +173,7 @@ history_builtin (list) { if (list) return (expand_and_print_history (list)); - return (EXECUTION_SUCCESS); + return (sh_chkwrite (EXECUTION_SUCCESS)); } #endif else if (flags & DFLAG) @@ -193,7 +196,7 @@ history_builtin (list) else if ((flags & (AFLAG|RFLAG|NFLAG|WFLAG|CFLAG)) == 0) { display_history (list); - return (EXECUTION_SUCCESS); + return (sh_chkwrite (EXECUTION_SUCCESS)); } filename = list ? list->word->word : get_string_value ("HISTFILE"); diff --git a/builtins/jobs.def b/builtins/jobs.def index ff1f3a80b..adc4a7a8b 100644 --- a/builtins/jobs.def +++ b/builtins/jobs.def @@ -1,7 +1,7 @@ This file is jobs.def, from which is created jobs.c. It implements the builtins "jobs" and "disown" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,14 +25,19 @@ $BUILTIN jobs $FUNCTION jobs_builtin $DEPENDS_ON JOB_CONTROL $SHORT_DOC jobs [-lnprs] [jobspec ...] or jobs -x command [args] -Lists the active jobs. The -l option lists process id's in addition -to the normal information; the -p option lists process id's only. -If -n is given, only processes that have changed status since the last -notification are printed. JOBSPEC restricts output to that job. The --r and -s options restrict output to running and stopped jobs only, -respectively. Without options, the status of all active jobs is -printed. If -x is given, COMMAND is run after all job specifications -that appear in ARGS have been replaced with the process ID of that job's +Lists the active jobs. JOBSPEC restricts output to that job. +Without options, the status of all active jobs is displayed. + +Options: + -l lists process IDs in addition to the normal information + -n list only processes that have changed status since the last + notification + -p lists process IDs only + -r restrict output to running jobs + -s restrict output to stopped jobs + +If -x is supplied, COMMAND is run after all job specifications that +appear in ARGS have been replaced with the process ID of that job's process group leader. $END @@ -203,11 +208,14 @@ $BUILTIN disown $FUNCTION disown_builtin $DEPENDS_ON JOB_CONTROL $SHORT_DOC disown [-h] [-ar] [jobspec ...] -By default, removes each JOBSPEC argument from the table of active jobs. -If the -h option is given, the job is not removed from the table, but is -marked so that SIGHUP is not sent to the job if the shell receives a -SIGHUP. The -a option, when JOBSPEC is not supplied, means to remove all -jobs from the job table; the -r option means to remove only running jobs. +Removes each JOBSPEC argument from the table of active jobs. Without +any JOBSPECs, the shell uses its notion of the current job. + +Options: + -a remove all jobs if JOBSPEC is not supplied + -h mark each JOBSPEC so that SIGHUP is not sent to the job if the + shell receives a SIGHUP + -r remove only running jobs $END #if defined (JOB_CONTROL) diff --git a/builtins/jobs.def~ b/builtins/jobs.def~ index 4c3ba6a73..2757c0a6b 100644 --- a/builtins/jobs.def~ +++ b/builtins/jobs.def~ @@ -1,7 +1,7 @@ This file is jobs.def, from which is created jobs.c. It implements the builtins "jobs" and "disown" in Bash. -Copyright (C) 1987-2005 Free Software Foundation, Inc. +Copyright (C) 1987-2006 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,14 +25,19 @@ $BUILTIN jobs $FUNCTION jobs_builtin $DEPENDS_ON JOB_CONTROL $SHORT_DOC jobs [-lnprs] [jobspec ...] or jobs -x command [args] -Lists the active jobs. The -l option lists process id's in addition -to the normal information; the -p option lists process id's only. -If -n is given, only processes that have changed status since the last -notification are printed. JOBSPEC restricts output to that job. The --r and -s options restrict output to running and stopped jobs only, -respectively. Without options, the status of all active jobs is -printed. If -x is given, COMMAND is run after all job specifications -that appear in ARGS have been replaced with the process ID of that job's +Lists the active jobs. JOBSPEC restricts output to that job. +Without options, the status of all active jobs is displayed. + +Options: + -l lists process IDs in addition to the normal information + -n list only processes that have changed status since the last + notification + -p lists process IDs only + -r restrict output to running jobs + -s restrict output to stopped jobs + +If -x is supplied, COMMAND is run after all job specifications that +appear in ARGS have been replaced with the process ID of that job's process group leader. $END @@ -203,11 +208,14 @@ $BUILTIN disown $FUNCTION disown_builtin $DEPENDS_ON JOB_CONTROL $SHORT_DOC disown [-h] [-ar] [jobspec ...] -By default, removes each JOBSPEC argument from the table of active jobs. -If the -h option is given, the job is not removed from the table, but is -marked so that SIGHUP is not sent to the job if the shell receives a -SIGHUP. The -a option, when JOBSPEC is not supplied, means to remove all -jobs from the job table; the -r option means to remove only running jobs. +Removes each JOBSPEC argument from the table of active jobs. Without +any JOBSPECs, the shell uses its notion of the current job. + +Options: + -a remove all jobs if JOBSPEC is not supplied + -h mark each JOBSPEC so that SIGHUP is not sent to the job if the + shell receives a SIGHUP + -r remove only running jobs $END #if defined (JOB_CONTROL) @@ -261,7 +269,7 @@ disown_builtin (list) if (job == NO_JOB || jobs == 0 || INVALID_JOB (job)) { - sh_badjob (list ? list->word->word : "current"); + sh_badjob (list ? list->word->word : _("current")); retval = EXECUTION_FAILURE; } else if (nohup_only) diff --git a/builtins/kill.def b/builtins/kill.def index bedbb1a6d..fab90ad41 100644 --- a/builtins/kill.def +++ b/builtins/kill.def @@ -1,7 +1,7 @@ This file is kill.def, from which is created kill.c. It implements the builtin "kill" in Bash. -Copyright (C) 1987-2005 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,13 +24,19 @@ $PRODUCES kill.c $BUILTIN kill $FUNCTION kill_builtin $SHORT_DOC kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] -Send the processes named by PID (or JOBSPEC) the signal SIGSPEC. If -SIGSPEC is not present, then SIGTERM is assumed. An argument of `-l' -lists the signal names; if arguments follow `-l' they are assumed to -be signal numbers for which names should be listed. Kill is a shell -builtin for two reasons: it allows job IDs to be used instead of -process IDs, and, if you have reached the limit on processes that -you can create, you don't have to start a process to kill another one. +Send the processes identified by PID or JOBSPEC the signal named by +SIGSPEC or SIGNUM. If neither SIGSPEC nor SIGNUM is present, then +SIGTERM is assumed. + +Options: + -s sig SIG is a signal name + -n sig SIG is a signal number + -l list the signal names; if arguments follow `-l' they are + assumed to be signal numbers for which names should be listed + +Kill is a shell builtin for two reasons: it allows job IDs to be used +instead of process IDs, and allows processes to be killed if the limit +on processes that you can create is reached. $END #include diff --git a/builtins/kill.def~ b/builtins/kill.def~ new file mode 100644 index 000000000..33108752e --- /dev/null +++ b/builtins/kill.def~ @@ -0,0 +1,258 @@ +This file is kill.def, from which is created kill.c. +It implements the builtin "kill" in Bash. + +Copyright (C) 1987-2008 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES kill.c + +$BUILTIN kill +$FUNCTION kill_builtin +$SHORT_DOC kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] +Send the processes identified by PID or JOBSPEC the signal named by +SIGSPEC or SIGNUM. If neither SIGSPEC nor SIGNUM is present, then +SIGTERM is assumed. + +Options: + -s sig SIG is a signal name + -n sig SIG is a signal number + -l list the signal names; if arguments follow `-l' they are assumed + to be signal numbers for which names should be listed + +Kill is a shell builtin for two reasons: it allows job IDs to be used +instead of process IDs, and allows processes to be killed if the limit +on processes that you can create is reached. +$END + +#include + +#include +#include +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "../bashansi.h" +#include "../bashintl.h" + +#include "../shell.h" +#include "../trap.h" +#include "../jobs.h" +#include "common.h" + +/* Not all systems declare ERRNO in errno.h... and some systems #define it! */ +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +extern int posixly_correct; + +static void kill_error __P((pid_t, int)); + +#if !defined (CONTINUE_AFTER_KILL_ERROR) +# define CONTINUE_OR_FAIL return (EXECUTION_FAILURE) +#else +# define CONTINUE_OR_FAIL goto continue_killing +#endif /* CONTINUE_AFTER_KILL_ERROR */ + +/* Here is the kill builtin. We only have it so that people can type + kill -KILL %1? No, if you fill up the process table this way you + can still kill some. */ +int +kill_builtin (list) + WORD_LIST *list; +{ + int sig, any_succeeded, listing, saw_signal, dflags; + char *sigspec, *word; + pid_t pid; + intmax_t pid_value; + + if (list == 0) + { + builtin_usage (); + return (EXECUTION_FAILURE); + } + + any_succeeded = listing = saw_signal = 0; + sig = SIGTERM; + sigspec = "TERM"; + + dflags = DSIG_NOCASE | ((posixly_correct == 0) ? DSIG_SIGPREFIX : 0); + /* Process options. */ + while (list) + { + word = list->word->word; + + if (ISOPTION (word, 'l')) + { + listing++; + list = list->next; + } + else if (ISOPTION (word, 's') || ISOPTION (word, 'n')) + { + list = list->next; + if (list) + { + sigspec = list->word->word; + if (sigspec[0] == '0' && sigspec[1] == '\0') + sig = 0; + else + sig = decode_signal (sigspec, dflags); + list = list->next; + } + else + { + sh_needarg (word); + return (EXECUTION_FAILURE); + } + } + else if (ISOPTION (word, '-')) + { + list = list->next; + break; + } + else if (ISOPTION (word, '?')) + { + builtin_usage (); + return (EXECUTION_SUCCESS); + } + /* If this is a signal specification then process it. We only process + the first one seen; other arguments may signify process groups (e.g, + -num == process group num). */ + else if ((*word == '-') && !saw_signal) + { + sigspec = word + 1; + sig = decode_signal (sigspec, dflags); + saw_signal++; + list = list->next; + } + else + break; + } + + if (listing) + return (display_signal_list (list, 0)); + + /* OK, we are killing processes. */ + if (sig == NO_SIG) + { + sh_invalidsig (sigspec); + return (EXECUTION_FAILURE); + } + + if (list == 0) + { + builtin_usage (); + return (EXECUTION_FAILURE); + } + + while (list) + { + word = list->word->word; + + if (*word == '-') + word++; + + /* Use the entire argument in case of minus sign presence. */ + if (*word && legal_number (list->word->word, &pid_value) && (pid_value == (pid_t)pid_value)) + { + pid = (pid_t) pid_value; + + if (kill_pid (pid, sig, pid < -1) < 0) + { + if (errno == EINVAL) + sh_invalidsig (sigspec); + else + kill_error (pid, errno); + CONTINUE_OR_FAIL; + } + else + any_succeeded++; + } +#if defined (JOB_CONTROL) + else if (*list->word->word && *list->word->word != '%') + { + builtin_error (_("%s: arguments must be process or job IDs"), list->word->word); + CONTINUE_OR_FAIL; + } + else if (*word) + /* Posix.2 says you can kill without job control active (4.32.4) */ + { /* Must be a job spec. Check it out. */ + int job; + sigset_t set, oset; + JOB *j; + + BLOCK_CHILD (set, oset); + job = get_job_spec (list); + + if (INVALID_JOB (job)) + { + if (job != DUP_JOB) + sh_badjob (list->word->word); + UNBLOCK_CHILD (oset); + CONTINUE_OR_FAIL; + } + + j = get_job_by_jid (job); + /* Job spec used. Kill the process group. If the job was started + without job control, then its pgrp == shell_pgrp, so we have + to be careful. We take the pid of the first job in the pipeline + in that case. */ + pid = IS_JOBCONTROL (job) ? j->pgrp : j->pipe->pid; + + UNBLOCK_CHILD (oset); + + if (kill_pid (pid, sig, 1) < 0) + { + if (errno == EINVAL) + sh_invalidsig (sigspec); + else + kill_error (pid, errno); + CONTINUE_OR_FAIL; + } + else + any_succeeded++; + } +#endif /* !JOB_CONTROL */ + else + { + sh_badpid (list->word->word); + CONTINUE_OR_FAIL; + } + continue_killing: + list = list->next; + } + + return (any_succeeded ? EXECUTION_SUCCESS : EXECUTION_FAILURE); +} + +static void +kill_error (pid, e) + pid_t pid; + int e; +{ + char *x; + + x = strerror (e); + if (x == 0) + x = _("Unknown error"); + builtin_error ("(%ld) - %s", (long)pid, x); +} diff --git a/builtins/let.def b/builtins/let.def index ab43a4542..f354b5a6c 100644 --- a/builtins/let.def +++ b/builtins/let.def @@ -1,7 +1,7 @@ This file is let.def, from which is created let.c. It implements the builtin "let" in Bash. -Copyright (C) 1987-2002 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -23,11 +23,11 @@ $BUILTIN let $FUNCTION let_builtin $PRODUCES let.c $SHORT_DOC let arg [arg ...] -Each ARG is an arithmetic expression to be evaluated. Evaluation -is done in fixed-width integers with no check for overflow, though -division by 0 is trapped and flagged as an error. The following -list of operators is grouped into levels of equal-precedence operators. -The levels are listed in order of decreasing precedence. +Evaluates ach ARG as an arithmetic expression. Evaluation is done in +fixed-width integers with no check for overflow, though division by 0 +is trapped and flagged as an error. The following list of operators is +grouped into levels of equal-precedence operators. The levels are listed +in order of decreasing precedence. id++, id-- variable post-increment, post-decrement ++id, --id variable pre-increment, pre-decrement diff --git a/builtins/let.def~ b/builtins/let.def~ new file mode 100644 index 000000000..ab43a4542 --- /dev/null +++ b/builtins/let.def~ @@ -0,0 +1,128 @@ +This file is let.def, from which is created let.c. +It implements the builtin "let" in Bash. + +Copyright (C) 1987-2002 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$BUILTIN let +$FUNCTION let_builtin +$PRODUCES let.c +$SHORT_DOC let arg [arg ...] +Each ARG is an arithmetic expression to be evaluated. Evaluation +is done in fixed-width integers with no check for overflow, though +division by 0 is trapped and flagged as an error. The following +list of operators is grouped into levels of equal-precedence operators. +The levels are listed in order of decreasing precedence. + + id++, id-- variable post-increment, post-decrement + ++id, --id variable pre-increment, pre-decrement + -, + unary minus, plus + !, ~ logical and bitwise negation + ** exponentiation + *, /, % multiplication, division, remainder + +, - addition, subtraction + <<, >> left and right bitwise shifts + <=, >=, <, > comparison + ==, != equality, inequality + & bitwise AND + ^ bitwise XOR + | bitwise OR + && logical AND + || logical OR + expr ? expr : expr + conditional operator + =, *=, /=, %=, + +=, -=, <<=, >>=, + &=, ^=, |= assignment + +Shell variables are allowed as operands. The name of the variable +is replaced by its value (coerced to a fixed-width integer) within +an expression. The variable need not have its integer attribute +turned on to be used in an expression. + +Operators are evaluated in order of precedence. Sub-expressions in +parentheses are evaluated first and may override the precedence +rules above. + +If the last ARG evaluates to 0, let returns 1; 0 is returned +otherwise. +$END + +#include + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "../bashintl.h" + +#include "../shell.h" +#include "common.h" + +/* Arithmetic LET function. */ +int +let_builtin (list) + WORD_LIST *list; +{ + intmax_t ret; + int expok; + + /* Skip over leading `--' argument. */ + if (list && list->word && ISOPTION (list->word->word, '-')) + list = list->next; + + if (list == 0) + { + builtin_error (_("expression expected")); + return (EXECUTION_FAILURE); + } + + for (; list; list = list->next) + { + ret = evalexp (list->word->word, &expok); + if (expok == 0) + return (EXECUTION_FAILURE); + } + + return ((ret == 0) ? EXECUTION_FAILURE : EXECUTION_SUCCESS); +} + +#ifdef INCLUDE_UNUSED +int +exp_builtin (list) + WORD_LIST *list; +{ + char *exp; + intmax_t ret; + int expok; + + if (list == 0) + { + builtin_error (_("expression expected")); + return (EXECUTION_FAILURE); + } + + exp = string_list (list); + ret = evalexp (exp, &expok); + (void)free (exp); + return (((ret == 0) || (expok == 0)) ? EXECUTION_FAILURE : EXECUTION_SUCCESS); +} +#endif diff --git a/builtins/printf.def b/builtins/printf.def index 352f232b2..0a42ba61f 100644 --- a/builtins/printf.def +++ b/builtins/printf.def @@ -1,7 +1,7 @@ This file is printf.def, from which is created printf.c. It implements the builtin "printf" in Bash. -Copyright (C) 1997-2007 Free Software Foundation, Inc. +Copyright (C) 1997-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,16 +24,23 @@ $PRODUCES printf.c $BUILTIN printf $FUNCTION printf_builtin $SHORT_DOC printf [-v var] format [arguments] -printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT -is a character string which contains three types of objects: plain +Formats and prints ARGUMENTS under control of the FORMAT. + +Options: + -v var assign the output to shell variable VAR rather than + display it on the standard output + +FORMAT is a character string which contains three types of objects: plain characters, which are simply copied to standard output; character escape sequences, which are converted and copied to the standard output; and format specifications, each of which causes printing of the next successive -argument. In addition to the standard printf(1) formats, %b means to -expand backslash escape sequences in the corresponding argument, and %q -means to quote the argument in a way that can be reused as shell input. -If the -v option is supplied, the output is placed into the value of the -shell variable VAR rather than being sent to the standard output. +argument. + +In addition to the standard format specifications described in printf(1) +and printf(3), printf interprets: + + %b expand backslash escape sequences in the corresponding argument + %q quote the argument in a way that can be reused as shell input $END #include diff --git a/builtins/printf.def~ b/builtins/printf.def~ index 18c22beb5..e26e97960 100644 --- a/builtins/printf.def~ +++ b/builtins/printf.def~ @@ -1,7 +1,7 @@ This file is printf.def, from which is created printf.c. It implements the builtin "printf" in Bash. -Copyright (C) 1997-2007 Free Software Foundation, Inc. +Copyright (C) 1997-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,16 +24,23 @@ $PRODUCES printf.c $BUILTIN printf $FUNCTION printf_builtin $SHORT_DOC printf [-v var] format [arguments] -printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT -is a character string which contains three types of objects: plain +Formats and prints ARGUMENTS under control of the FORMAT. + +Options: + -v var assign the output to shell variable VAR rather than + display it on the standard output + +FORMAT is a character string which contains three types of objects: plain characters, which are simply copied to standard output; character escape sequences, which are converted and copied to the standard output; and format specifications, each of which causes printing of the next successive -argument. In addition to the standard printf(1) formats, %b means to -expand backslash escape sequences in the corresponding argument, and %q -means to quote the argument in a way that can be reused as shell input. -If the -v option is supplied, the output is placed into the value of the -shell variable VAR rather than being sent to the standard output. +argument. + +In addition to the standard format specifications described in printf(1) +and printf(3), print interprets: + + %b expand backslash escape sequences in the corresponding argument + %q quote the argument in a way that can be reused as shell input $END #include @@ -1031,18 +1038,15 @@ asciicode () #if defined (HANDLE_MULTIBYTE) slen = strlen (garglist->word->word+1); - mblength = mbrlen (garglist->word->word+1, slen, NULL); -#if 0 + mblength = MBLEN (garglist->word->word+1, slen); if (mblength > 1) -#else - if (1) { - mblength = mbrtowc (&wc, garglist->word->word+1, slen, NULL); + mblength = mbtowc (&wc, garglist->word->word+1, slen); ch = wc; /* XXX */ } else #endif - ch = garglist->word->word[1]; + ch = (unsigned char)garglist->word->word[1]; garglist = garglist->next; return (ch); diff --git a/builtins/pushd.def b/builtins/pushd.def index c69e11b2a..dd527afbb 100644 --- a/builtins/pushd.def +++ b/builtins/pushd.def @@ -1,7 +1,7 @@ This file is pushd.def, from which is created pushd.c. It implements the builtins "pushd", "popd", and "dirs" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -29,43 +29,46 @@ Adds a directory to the top of the directory stack, or rotates the stack, making the new top of the stack the current working directory. With no arguments, exchanges the top two directories. --n Suppresses the normal change of directory when adding directories - to the stack, so only the stack is manipulated. +Options: + -n Suppresses the normal change of directory when adding + directorie to the stack, so only the stack is manipulated. -+N Rotates the stack so that the Nth directory (counting +Arguments: + +N Rotates the stack so that the Nth directory (counting from the left of the list shown by `dirs', starting with zero) is at the top. --N Rotates the stack so that the Nth directory (counting + -N Rotates the stack so that the Nth directory (counting from the right of the list shown by `dirs', starting with zero) is at the top. -dir Adds DIR to the directory stack at the top, making it the + dir Adds DIR to the directory stack at the top, making it the new current working directory. -You can see the directory stack with the `dirs' command. +The `dirs' builtin displays the directory stack. $END $BUILTIN popd $FUNCTION popd_builtin $DEPENDS_ON PUSHD_AND_POPD $SHORT_DOC popd [-n] [+N | -N] -Removes entries from the directory stack. With no arguments, -removes the top directory from the stack, and cd's to the new -top directory. +Removes entries from the directory stack. With no arguments, removes +the top directory from the stack, and changes to the new top directory. --n Suppresses the normal change of directory when removing directories - from the stack, so only the stack is manipulated. +Options: + -n Suppresses the normal change of directory when removing + directories from the stack, so only the stack is manipulated. -+N Removes the Nth entry counting from the left of the list +Arguments: + +N Removes the Nth entry counting from the left of the list shown by `dirs', starting with zero. For example: `popd +0' removes the first directory, `popd +1' the second. --N Removes the Nth entry counting from the right of the list + -N Removes the Nth entry counting from the right of the list shown by `dirs', starting with zero. For example: `popd -0' removes the last directory, `popd -1' the next to last. -You can see the directory stack with the `dirs' command. +The `dirs' builtin displays the directory stack. $END $BUILTIN dirs @@ -76,18 +79,19 @@ Display the list of currently remembered directories. Directories find their way onto the list with the `pushd' command; you can get back up through the list with the `popd' command. -The -c flag clears the directory stack by deleting all of the elements. -The -l flag specifies that `dirs' should not print shorthand versions -of directories which are relative to your home directory. This means -that `~/bin' might be displayed as `/homes/bfox/bin'. The -p flag -causes `dirs' to print the directory stack with one entry per line. -The -v flag does the same thing, prefixing each directory name with its -position in the stack. +Options: + -c clear the directory stack by deleting all of the elements + -l do not print tilde-prefixed versions of directories relative + to your home directory + -p print the directory stack with one entry per line + -v print the directory stack with one entry per line prefixed + with its position in the stack -+N Displays the Nth entry counting from the left of the list shown by +Arguments: + +N Displays the Nth entry counting from the left of the list shown by dirs when invoked without options, starting with zero. --N Displays the Nth entry counting from the right of the list shown by + -N Displays the Nth entry counting from the right of the list shown by dirs when invoked without options, starting with zero. $END diff --git a/builtins/pushd.def~ b/builtins/pushd.def~ index 4a7c284b1..f8599c05c 100644 --- a/builtins/pushd.def~ +++ b/builtins/pushd.def~ @@ -1,7 +1,7 @@ This file is pushd.def, from which is created pushd.c. It implements the builtins "pushd", "popd", and "dirs" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -29,43 +29,50 @@ Adds a directory to the top of the directory stack, or rotates the stack, making the new top of the stack the current working directory. With no arguments, exchanges the top two directories. --n Suppresses the normal change of directory when adding directories - to the stack, so only the stack is manipulated. +Options: -+N Rotates the stack so that the Nth directory (counting + -n Suppresses the normal change of directory when adding + directorie to the stack, so only the stack is manipulated. + +Arguments: + + +N Rotates the stack so that the Nth directory (counting from the left of the list shown by `dirs', starting with zero) is at the top. --N Rotates the stack so that the Nth directory (counting + -N Rotates the stack so that the Nth directory (counting from the right of the list shown by `dirs', starting with zero) is at the top. -dir Adds DIR to the directory stack at the top, making it the + dir Adds DIR to the directory stack at the top, making it the new current working directory. -You can see the directory stack with the `dirs' command. +The `dirs' builtin displays the directory stack. $END $BUILTIN popd $FUNCTION popd_builtin $DEPENDS_ON PUSHD_AND_POPD $SHORT_DOC popd [-n] [+N | -N] -Removes entries from the directory stack. With no arguments, -removes the top directory from the stack, and cd's to the new -top directory. +Removes entries from the directory stack. With no arguments, removes +the top directory from the stack, and changes to the new top directory. + +Options: --n Suppresses the normal change of directory when removing directories - from the stack, so only the stack is manipulated. + -n Suppresses the normal change of directory when removing + directories from the stack, so only the stack is manipulated. -+N Removes the Nth entry counting from the left of the list +Arguments: + + +N Removes the Nth entry counting from the left of the list shown by `dirs', starting with zero. For example: `popd +0' removes the first directory, `popd +1' the second. --N Removes the Nth entry counting from the right of the list + -N Removes the Nth entry counting from the right of the list shown by `dirs', starting with zero. For example: `popd -0' removes the last directory, `popd -1' the next to last. -You can see the directory stack with the `dirs' command. +The `dirs' builtin displays the directory stack. $END $BUILTIN dirs @@ -76,18 +83,21 @@ Display the list of currently remembered directories. Directories find their way onto the list with the `pushd' command; you can get back up through the list with the `popd' command. -The -c flag clears the directory stack by deleting all of the elements. -The -l flag specifies that `dirs' should not print shorthand versions -of directories which are relative to your home directory. This means -that `~/bin' might be displayed as `/homes/bfox/bin'. The -p flag -causes `dirs' to print the directory stack with one entry per line. -The -v flag does the same thing, prefixing each directory name with its -position in the stack. +Options: + + -c clear the directory stack by deleting all of the elements + -l do not print tilde-prefixed versions of directories relative + to your home directory + -p print the directory stack with one entry per line + -v print the directory stack with one entry per line prefixed + with its position in the stack -+N Displays the Nth entry counting from the left of the list shown by +Arguments: + + +N Displays the Nth entry counting from the left of the list shown by dirs when invoked without options, starting with zero. --N Displays the Nth entry counting from the right of the list shown by + -N Displays the Nth entry counting from the right of the list shown by dirs when invoked without options, starting with zero. $END @@ -448,7 +458,7 @@ dirs_builtin (list) if (index_flag) { putchar ('\n'); - return EXECUTION_SUCCESS; + return (sh_chkwrite (EXECUTION_SUCCESS)); } } @@ -473,8 +483,8 @@ dirs_builtin (list) printf ("%s%s", (vflag & 1) ? "\n" : " ", DIRSTACK_ENTRY (i)); putchar ('\n'); - fflush (stdout); - return (EXECUTION_SUCCESS); + + return (sh_chkwrite (EXECUTION_SUCCESS)); } static void @@ -664,18 +674,18 @@ N_("Display the list of currently remembered directories. Directories\n\ find their way onto the list with the `pushd' command; you can get\n\ back up through the list with the `popd' command.\n\ \n\ + The -c flag clears the directory stack by deleting all of the elements.\n\ The -l flag specifies that `dirs' should not print shorthand versions\n\ of directories which are relative to your home directory. This means\n\ - that `~/bin' might be displayed as `/homes/bfox/bin'. The -v flag\n\ - causes `dirs' to print the directory stack with one entry per line,\n\ - prepending the directory name with its position in the stack. The -p\n\ - flag does the same thing, but the stack position is not prepended.\n\ - The -c flag clears the directory stack by deleting all of the elements.\n\ + that `~/bin' might be displayed as `/homes/bfox/bin'. The -p flag\n\ + causes `dirs' to print the directory stack with one entry per line.\n\ + The -v flag does the same thing, prefixing each directory name with its\n\ + position in the stack.\n\ \n\ - +N displays the Nth entry counting from the left of the list shown by\n\ + +N Displays the Nth entry counting from the left of the list shown by\n\ dirs when invoked without options, starting with zero.\n\ \n\ - -N displays the Nth entry counting from the right of the list shown by\n\ + -N Displays the Nth entry counting from the right of the list shown by\n\ dirs when invoked without options, starting with zero."), (char *)NULL }; @@ -685,6 +695,9 @@ N_("Adds a directory to the top of the directory stack, or rotates\n\ the stack, making the new top of the stack the current working\n\ directory. With no arguments, exchanges the top two directories.\n\ \n\ + -n Suppresses the normal change of directory when adding directories\n\ + to the stack, so only the stack is manipulated.\n\ + \n\ +N Rotates the stack so that the Nth directory (counting\n\ from the left of the list shown by `dirs', starting with\n\ zero) is at the top.\n\ @@ -693,10 +706,7 @@ N_("Adds a directory to the top of the directory stack, or rotates\n\ from the right of the list shown by `dirs', starting with\n\ zero) is at the top.\n\ \n\ - -n suppress the normal change of directory when adding directories\n\ - to the stack, so only the stack is manipulated.\n\ - \n\ - dir adds DIR to the directory stack at the top, making it the\n\ + dir Adds DIR to the directory stack at the top, making it the\n\ new current working directory.\n\ \n\ You can see the directory stack with the `dirs' command."), @@ -708,17 +718,17 @@ N_("Removes entries from the directory stack. With no arguments,\n\ removes the top directory from the stack, and cd's to the new\n\ top directory.\n\ \n\ - +N removes the Nth entry counting from the left of the list\n\ + -n Suppresses the normal change of directory when removing directories\n\ + from the stack, so only the stack is manipulated.\n\ + \n\ + +N Removes the Nth entry counting from the left of the list\n\ shown by `dirs', starting with zero. For example: `popd +0'\n\ removes the first directory, `popd +1' the second.\n\ \n\ - -N removes the Nth entry counting from the right of the list\n\ + -N Removes the Nth entry counting from the right of the list\n\ shown by `dirs', starting with zero. For example: `popd -0'\n\ removes the last directory, `popd -1' the next to last.\n\ \n\ - -n suppress the normal change of directory when removing directories\n\ - from the stack, so only the stack is manipulated.\n\ - \n\ You can see the directory stack with the `dirs' command."), (char *)NULL }; diff --git a/builtins/read.def b/builtins/read.def index bdd290b9c..a84533ce4 100644 --- a/builtins/read.def +++ b/builtins/read.def @@ -1,7 +1,7 @@ This file is read.def, from which is created read.c. It implements the builtin "read" in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,27 +24,34 @@ $PRODUCES read.c $BUILTIN read $FUNCTION read_builtin $SHORT_DOC read [-ers] [-a array] [-d delim] [-n nchars] [-p prompt] [-t timeout] [-u fd] [name ...] -One line is read from the standard input, or from file descriptor FD if the --u option is supplied, and the first word is assigned to the first NAME, -the second word to the second NAME, and so on, with leftover words assigned -to the last NAME. Only the characters found in $IFS are recognized as word -delimiters. If no NAMEs are supplied, the line read is stored in the REPLY -variable. If the -r option is given, this signifies `raw' input, and -backslash escaping is disabled. The -d option causes read to continue -until the first character of DELIM is read, rather than newline. If the -p -option is supplied, the string PROMPT is output without a trailing newline -before attempting to read. If -a is supplied, the words read are assigned -to sequential indices of ARRAY, starting at zero. If -e is supplied and -the shell is interactive, readline is used to obtain the line. If -n is -supplied with a non-zero NCHARS argument, read returns after NCHARS -characters have been read. The -s option causes input coming from a -terminal to not be echoed. - -The -t option causes read to time out and return failure if a complete line -of input is not read within TIMEOUT seconds. If the TMOUT variable is set, -its value is the default timeout. The return code is zero, unless end-of-file -is encountered, read times out, or an invalid file descriptor is supplied as -the argument to -u. +Reads a single line from the standard input, or from file descriptor FD +if the -u option is supplied. The line is split into fields as with word +splitting, and the first word is assigned to the first NAME, the second +word to the second NAME, and so on, with any leftover words assigned to +the last NAME. Only the characters found in $IFS are recognized as word +delimiters. + +If no NAMEs are supplied, the line read is stored in the REPLY variable. + +Options: + -a array assign the words read to sequential indices of the array + variable ARRAY, starting at zero + -d delim continue until the first character of DELIM is read, rather + than newline + -e use Readline to obtain the line in an interactive shell + -n nchars return after reading NCHARS characters rather than waiting + for a newline + -p prompt output the string PROMPT without a trailing newline before + attempting to read + -r do not allow backslashes to escape any characters + -s do not echo input coming from a terminal + -t timeout time out and return failure if a complete line of input is + not read withint TIMEOUT seconds. The value of the TMOUT + variable is the default timeout. + -u fd read from file descriptor FD instead of the standard input + +The return code is zero, unless end-of-file is encountered, read times out, +or an invalid file descriptor is supplied as the argument to -u. $END #include diff --git a/builtins/read.def~ b/builtins/read.def~ index f6582d369..1c2d89dab 100644 --- a/builtins/read.def~ +++ b/builtins/read.def~ @@ -1,7 +1,7 @@ This file is read.def, from which is created read.c. It implements the builtin "read" in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,27 +24,34 @@ $PRODUCES read.c $BUILTIN read $FUNCTION read_builtin $SHORT_DOC read [-ers] [-a array] [-d delim] [-n nchars] [-p prompt] [-t timeout] [-u fd] [name ...] -One line is read from the standard input, or from file descriptor FD if the --u option is supplied, and the first word is assigned to the first NAME, -the second word to the second NAME, and so on, with leftover words assigned -to the last NAME. Only the characters found in $IFS are recognized as word -delimiters. If no NAMEs are supplied, the line read is stored in the REPLY -variable. If the -r option is given, this signifies `raw' input, and -backslash escaping is disabled. The -d option causes read to continue -until the first character of DELIM is read, rather than newline. If the -p -option is supplied, the string PROMPT is output without a trailing newline -before attempting to read. If -a is supplied, the words read are assigned -to sequential indices of ARRAY, starting at zero. If -e is supplied and -the shell is interactive, readline is used to obtain the line. If -n is -supplied with a non-zero NCHARS argument, read returns after NCHARS -characters have been read. The -s option causes input coming from a -terminal to not be echoed. - -The -t option causes read to time out and return failure if a complete line -of input is not read within TIMEOUT seconds. If the TMOUT variable is set, -its value is the default timeout. The return code is zero, unless end-of-file -is encountered, read times out, or an invalid file descriptor is supplied as -the argument to -u. +Reads a single line from the standard input, or from file descriptor FD +if the -u option is supplied. The line is split into fields as with word +splitting, and the first word is assigned to the first NAME, the second +word to the second NAME, and so on, with any leftover words assigned to +the last NAME. Only the characters found in $IFS are recognized as word +delimiters. + +If no NAMEs are supplied, the line read is stored in the REPLY variable. + +Options: + -a array assign the words read to sequential indices of the array + variable ARRAY, starting at zero + -d delim continue until the first character of DELIM is read, rather + than newline + -e use Readline to obtain the line in an interactive shell + -n nchars return after reading NCHARS characters rather than waiting + for a newline + -p prompt output the string PROMPT without a trailing newline before + attempting to read + -r do not allow backslashes to escape any characters + -s do not echo input coming from a terminal + -t timeout time out and return failure if a complete line of input is + not read withint TIMEOUT seconds. The value of the TMOUT + variable is the default timeout. + -u fd read from file descriptor FD instead of the standard input + +The return code is zero, unless end-of-file is encountered, read times out, +or an invalid file descriptor is supplied as the argument to -u. $END #include @@ -340,7 +347,6 @@ read_builtin (list) code = setjmp (alrmbuf); if (code) { -itrace("sigalrm: input_string = %s input_is_tty = %d", input_string, input_is_tty); #if 0 run_unwind_frame ("read_builtin"); return (EXECUTION_FAILURE); diff --git a/builtins/reserved.def b/builtins/reserved.def index a7200dce0..82be20c3e 100644 --- a/builtins/reserved.def +++ b/builtins/reserved.def @@ -60,9 +60,12 @@ $BUILTIN time $SHORT_DOC time [-p] pipeline Execute PIPELINE and print a summary of the real time, user CPU time, and system CPU time spent executing PIPELINE when it terminates. -The return status is the return status of PIPELINE. The `-p' option -prints the timing summary in the portable Posix format; otherwise, the -the value of the TIMEFORMAT variable is used as the output format. + +Options: + -p print the timing summary in the portable Posix format + +The value of the TIMEFORMAT variable is used as the output format. The +return status is the return status of PIPELINE. $END $BUILTIN case @@ -95,10 +98,11 @@ Expand and execute COMMANDS as long as the final command in the $END $BUILTIN function -$SHORT_DOC function NAME { COMMANDS ; } or NAME () { COMMANDS ; } -Create a simple command invoked by NAME which runs COMMANDS. -Arguments on the command line along with NAME are passed to the -function as $0 .. $n. +$SHORT_DOC function name { COMMANDS ; } or name () { COMMANDS ; } +Create a shell function named NAME. When invoked as a simple command, +NAME runs COMMANDs in the calling shell's context. When NAME is invoked, +the arguments are passed to the function as $1...$n, and the function's +name is in $FUNCNAME. $END $BUILTIN { ... } @@ -130,16 +134,19 @@ $DOCNAME conditional $SHORT_DOC [[ expression ]] Returns a status of 0 or 1 depending on the evaluation of the conditional expression EXPRESSION. Expressions are composed of the same primaries used -by the `test' builtin, and may be combined using the following operators +by the `test' builtin, and may be combined using the following operators: + + ( EXPRESSION ) Returns the value of EXPRESSION + ! EXPRESSION True if EXPRESSION is false; else false + EXPR1 && EXPR2 True if both EXPR1 and EXPR2 are true; else false + EXPR1 || EXPR2 True if either EXPR1 or EXPR2 is true; else false - ( EXPRESSION ) Returns the value of EXPRESSION - ! EXPRESSION True if EXPRESSION is false; else false - EXPR1 && EXPR2 True if both EXPR1 and EXPR2 are true; else false - EXPR1 || EXPR2 True if either EXPR1 or EXPR2 is true; else false +When the `==' and `!=' operators are used, the string to the right of +the operator is used as a pattern and pattern matching is performed. +When the `=~' operator is used, the string to the right of the operator +is matched as a regular expression. -When the `==' and `!=' operators are used, the string to the right of the -operator is used as a pattern and pattern matching is performed. The -&& and || operators do not evaluate EXPR2 if EXPR1 is sufficient to +The && and || operators do not evaluate EXPR2 if EXPR1 is sufficient to determine the expression's value. $END diff --git a/builtins/reserved.def~ b/builtins/reserved.def~ index 2ef303b3c..e03b98d44 100644 --- a/builtins/reserved.def~ +++ b/builtins/reserved.def~ @@ -2,7 +2,7 @@ This file is reserved.def, in which the shell reserved words are defined. It has no direct C file production, but defines builtins for the Bash builtin help command. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2007 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -21,7 +21,7 @@ with Bash; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. $BUILTIN for -$SHORT_DOC for NAME [in WORDS ... ;] do COMMANDS; done +$SHORT_DOC for NAME [in WORDS ... ] ; do COMMANDS; done The `for' loop executes a sequence of commands for each member in a list of items. If `in WORDS ...;' is not present, then `in "$@"' is assumed. For each element in WORDS, NAME is set to that element, and @@ -60,9 +60,12 @@ $BUILTIN time $SHORT_DOC time [-p] pipeline Execute PIPELINE and print a summary of the real time, user CPU time, and system CPU time spent executing PIPELINE when it terminates. -The return status is the return status of PIPELINE. The `-p' option -prints the timing summary in the standard Posix format; otherwise, the -the value of the TIMEFORMAT variable is used as the output format. + +Options: + -p print the timing summary in the portable Posix format + +The value of the TIMEFORMAT variable is used as the output format. The +return status is the return status of PIPELINE. $END $BUILTIN case @@ -95,10 +98,11 @@ Expand and execute COMMANDS as long as the final command in the $END $BUILTIN function -$SHORT_DOC function NAME { COMMANDS ; } or NAME () { COMMANDS ; } -Create a simple command invoked by NAME which runs COMMANDS. -Arguments on the command line along with NAME are passed to the -function as $0 .. $n. +$SHORT_DOC function name { COMMANDS ; } or name () { COMMANDS ; } +Create a shell function named NAME. When invoked as a simple command, +NAME runs COMMANDs in the calling shell's context. When NAME is invoked, +the arguments are passed to the function as $1...$n, and the function's +name is in $FUNCNAME. $END $BUILTIN { ... } @@ -130,25 +134,28 @@ $DOCNAME conditional $SHORT_DOC [[ expression ]] Returns a status of 0 or 1 depending on the evaluation of the conditional expression EXPRESSION. Expressions are composed of the same primaries used -by the `test' builtin, and may be combined using the following operators +by the `test' builtin, and may be combined using the following operators: - ( EXPRESSION ) Returns the value of EXPRESSION - ! EXPRESSION True if EXPRESSION is false; else false - EXPR1 && EXPR2 True if both EXPR1 and EXPR2 are true; else false - EXPR1 || EXPR2 True if either EXPR1 or EXPR2 is true; else false + ( EXPRESSION ) Returns the value of EXPRESSION + ! EXPRESSION True if EXPRESSION is false; else false + EXPR1 && EXPR2 True if both EXPR1 and EXPR2 are true; else false + EXPR1 || EXPR2 True if either EXPR1 or EXPR2 is true; else false When the `==' and `!=' operators are used, the string to the right of the -operator is used as a pattern and pattern matching is performed. The -&& and || operators do not evaluate EXPR2 if EXPR1 is sufficient to +operator is used as a pattern and pattern matching is performed. When +the `=~' operator is used, the string to the right of the operator is +matched as a regular expression. + +The && and || operators do not evaluate EXPR2 if EXPR1 is sufficient to determine the expression's value. $END $BUILTIN variables $DOCNAME variable_help -$SHORT_DOC variables - Some variable names and meanings +$SHORT_DOC variables - Names and meanings of some shell variables BASH_VERSION Version information for this Bash. CDPATH A colon-separated list of directories to search - for directries given as arguments to `cd'. + for directories given as arguments to `cd'. GLOBIGNORE A colon-separated list of patterns describing filenames to be ignored by pathname expansion. #if defined (HISTORY) diff --git a/builtins/return.def b/builtins/return.def index 23389c070..d945354df 100644 --- a/builtins/return.def +++ b/builtins/return.def @@ -25,8 +25,9 @@ $BUILTIN return $FUNCTION return_builtin $SHORT_DOC return [n] -Causes a function to exit with the return value specified by N. If N -is omitted, the return status is that of the last command. +Causes a function or sourced script to exit with the return value +specified by N. If N is omitted, the return status is that of the +last command executed within the function or script. $END #include diff --git a/builtins/return.def~ b/builtins/return.def~ new file mode 100644 index 000000000..23389c070 --- /dev/null +++ b/builtins/return.def~ @@ -0,0 +1,66 @@ +This file is return.def, from which is created return.c. +It implements the builtin "return" in Bash. + +Copyright (C) 1987-2003 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES return.c + +$BUILTIN return + +$FUNCTION return_builtin +$SHORT_DOC return [n] +Causes a function to exit with the return value specified by N. If N +is omitted, the return status is that of the last command. +$END + +#include + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "../bashintl.h" + +#include "../shell.h" +#include "common.h" + +extern int last_command_exit_value; +extern int subshell_environment; +extern int return_catch_flag, return_catch_value; + +/* If we are executing a user-defined function then exit with the value + specified as an argument. if no argument is given, then the last + exit status is used. */ +int +return_builtin (list) + WORD_LIST *list; +{ + return_catch_value = get_exitstat (list); + + if (return_catch_flag) + longjmp (return_catch, 1); + else + { + builtin_error (_("can only `return' from a function or sourced script")); + return (EXECUTION_FAILURE); + } +} diff --git a/builtins/set.def b/builtins/set.def index 5c2d0e1d4..397598ef9 100644 --- a/builtins/set.def +++ b/builtins/set.def @@ -1,7 +1,7 @@ This file is set.def, from which is created set.c. It implements the "set" and "unset" builtins in Bash. -Copyright (C) 1987-2004 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -61,83 +61,84 @@ extern int no_line_editing; $BUILTIN set $FUNCTION set_builtin $SHORT_DOC set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...] -Change the value of shell attributes and positional parameters, or display -the names and values of shell variables. Available -shell options are: - -a Mark variables which are modified or created for export. - -b Notify of job termination immediately. - -e Exit immediately if a command exits with a non-zero status. - -f Disable file name generation (globbing). - -h Remember the location of commands as they are looked up. - -k All assignment arguments are placed in the environment for a - command, not just those that precede the command name. - -m Job control is enabled. - -n Read commands but do not execute them. - -o option-name - Set the variable corresponding to option-name: - allexport same as -a - braceexpand same as -B +Changes the value of shell attributes and positional parameters, or +displays the names and values of shell variables. + +Options: + -a Mark variables which are modified or created for export. + -b Notify of job termination immediately. + -e Exit immediately if a command exits with a non-zero status. + -f Disable file name generation (globbing). + -h Remember the location of commands as they are looked up. + -k All assignment arguments are placed in the environment for a + command, not just those that precede the command name. + -m Job control is enabled. + -n Read commands but do not execute them. + -o option-name + Set the variable corresponding to option-name: + allexport same as -a + braceexpand same as -B #if defined (READLINE) - emacs use an emacs-style line editing interface + emacs use an emacs-style line editing interface #endif /* READLINE */ - errexit same as -e - errtrace same as -E - functrace same as -T - hashall same as -h + errexit same as -e + errtrace same as -E + functrace same as -T + hashall same as -h #if defined (BANG_HISTORY) - histexpand same as -H + histexpand same as -H #endif /* BANG_HISTORY */ #if defined (HISTORY) - history enable command history + history enable command history #endif - ignoreeof the shell will not exit upon reading EOF - interactive-comments - allow comments to appear in interactive commands - keyword same as -k - monitor same as -m - noclobber same as -C - noexec same as -n - noglob same as -f - nolog currently accepted but ignored - notify same as -b - nounset same as -u - onecmd same as -t - physical same as -P - pipefail the return value of a pipeline is the status of - the last command to exit with a non-zero status, - or zero if no command exited with a non-zero status - posix change the behavior of bash where the default - operation differs from the 1003.2 standard to - match the standard - privileged same as -p - verbose same as -v + ignoreeof the shell will not exit upon reading EOF + interactive-comments + allow comments to appear in interactive commands + keyword same as -k + monitor same as -m + noclobber same as -C + noexec same as -n + noglob same as -f + nolog currently accepted but ignored + notify same as -b + nounset same as -u + onecmd same as -t + physical same as -P + pipefail the return value of a pipeline is the status of + the last command to exit with a non-zero status, + or zero if no command exited with a non-zero status + posix change the behavior of bash where the default + operation differs from the Posix standard to + match the standard + privileged same as -p + verbose same as -v #if defined (READLINE) - vi use a vi-style line editing interface + vi use a vi-style line editing interface #endif /* READLINE */ - xtrace same as -x - -p Turned on whenever the real and effective user ids do not match. - Disables processing of the $ENV file and importing of shell - functions. Turning this option off causes the effective uid and - gid to be set to the real uid and gid. - -t Exit after reading and executing one command. - -u Treat unset variables as an error when substituting. - -v Print shell input lines as they are read. - -x Print commands and their arguments as they are executed. + xtrace same as -x + -p Turned on whenever the real and effective user ids do not match. + Disables processing of the $ENV file and importing of shell + functions. Turning this option off causes the effective uid and + gid to be set to the real uid and gid. + -t Exit after reading and executing one command. + -u Treat unset variables as an error when substituting. + -v Print shell input lines as they are read. + -x Print commands and their arguments as they are executed. #if defined (BRACE_EXPANSION) - -B the shell will perform brace expansion + -B the shell will perform brace expansion #endif /* BRACE_EXPANSION */ - -C If set, disallow existing regular files to be overwritten - by redirection of output. - -E If set, the ERR trap is inherited by shell functions. + -C If set, disallow existing regular files to be overwritten + by redirection of output. + -E If set, the ERR trap is inherited by shell functions. #if defined (BANG_HISTORY) - -H Enable ! style history substitution. This flag is on - by default when the shell is interactive. + -H Enable ! style history substitution. This flag is on + by default when the shell is interactive. #endif /* BANG_HISTORY */ - -P If set, do not follow symbolic links when executing commands - such as cd which change the current directory. - -T If set, the DEBUG trap is inherited by shell functions. - - Assign any remaining arguments to the positional parameters. - The -x and -v options are turned off. + -P If set, do not follow symbolic links when executing commands + such as cd which change the current directory. + -T If set, the DEBUG trap is inherited by shell functions. + - Assign any remaining arguments to the positional parameters. + The -x and -v options are turned off. Using + rather than - causes these flags to be turned off. The flags can also be used upon invocation of the shell. The current @@ -707,11 +708,16 @@ set_builtin (list) $BUILTIN unset $FUNCTION unset_builtin $SHORT_DOC unset [-f] [-v] [name ...] -For each NAME, remove the corresponding variable or function. Given -the `-v', unset will only act on variables. Given the `-f' flag, -unset will only act on functions. With neither flag, unset first -tries to unset a variable, and if that fails, then tries to unset a -function. Some variables cannot be unset; also see readonly. +For each NAME, remove the corresponding variable or function. + +Options: + -f treat each NAME as a shell function + -v treat each NAME as a shell variable + +Without options, unset first tries to unset a variable, and if that fails, +tries to unset a function. + +Some variables cannot be unset; also see `readonly'. $END #define NEXT_VARIABLE() any_failed++; list = list->next; continue; diff --git a/builtins/set.def~ b/builtins/set.def~ index 45c0f7074..4ced73d9d 100644 --- a/builtins/set.def~ +++ b/builtins/set.def~ @@ -1,7 +1,7 @@ This file is set.def, from which is created set.c. It implements the "set" and "unset" builtins in Bash. -Copyright (C) 1987-2004 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -61,83 +61,84 @@ extern int no_line_editing; $BUILTIN set $FUNCTION set_builtin $SHORT_DOC set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...] -Change the value of shell attributes and positional parameters, or display -the names and values of shell variables. Available -shell options are: - -a Mark variables which are modified or created for export. - -b Notify of job termination immediately. - -e Exit immediately if a command exits with a non-zero status. - -f Disable file name generation (globbing). - -h Remember the location of commands as they are looked up. - -k All assignment arguments are placed in the environment for a - command, not just those that precede the command name. - -m Job control is enabled. - -n Read commands but do not execute them. - -o option-name - Set the variable corresponding to option-name: - allexport same as -a - braceexpand same as -B +Changes the value of shell attributes and positional parameters, or +displays the names and values of shell variables. + +Options: + -a Mark variables which are modified or created for export. + -b Notify of job termination immediately. + -e Exit immediately if a command exits with a non-zero status. + -f Disable file name generation (globbing). + -h Remember the location of commands as they are looked up. + -k All assignment arguments are placed in the environment for a + command, not just those that precede the command name. + -m Job control is enabled. + -n Read commands but do not execute them. + -o option-name + Set the variable corresponding to option-name: + allexport same as -a + braceexpand same as -B #if defined (READLINE) - emacs use an emacs-style line editing interface + emacs use an emacs-style line editing interface #endif /* READLINE */ - errexit same as -e - errtrace same as -E - functrace same as -T - hashall same as -h + errexit same as -e + errtrace same as -E + functrace same as -T + hashall same as -h #if defined (BANG_HISTORY) - histexpand same as -H + histexpand same as -H #endif /* BANG_HISTORY */ #if defined (HISTORY) - history enable command history + history enable command history #endif - ignoreeof the shell will not exit upon reading EOF - interactive-comments - allow comments to appear in interactive commands - keyword same as -k - monitor same as -m - noclobber same as -C - noexec same as -n - noglob same as -f - nolog currently accepted but ignored - notify same as -b - nounset same as -u - onecmd same as -t - physical same as -P - pipefail the return value of a pipeline is the status of - the last command to exit with a non-zero status, - or zero if no command exited with a non-zero status - posix change the behavior of bash where the default - operation differs from the 1003.2 standard to - match the standard - privileged same as -p - verbose same as -v + ignoreeof the shell will not exit upon reading EOF + interactive-comments + allow comments to appear in interactive commands + keyword same as -k + monitor same as -m + noclobber same as -C + noexec same as -n + noglob same as -f + nolog currently accepted but ignored + notify same as -b + nounset same as -u + onecmd same as -t + physical same as -P + pipefail the return value of a pipeline is the status of + the last command to exit with a non-zero status, + or zero if no command exited with a non-zero status + posix change the behavior of bash where the default + operation differs from the 1003.2 standard to + match the standard + privileged same as -p + verbose same as -v #if defined (READLINE) - vi use a vi-style line editing interface + vi use a vi-style line editing interface #endif /* READLINE */ - xtrace same as -x - -p Turned on whenever the real and effective user ids do not match. - Disables processing of the $ENV file and importing of shell - functions. Turning this option off causes the effective uid and - gid to be set to the real uid and gid. - -t Exit after reading and executing one command. - -u Treat unset variables as an error when substituting. - -v Print shell input lines as they are read. - -x Print commands and their arguments as they are executed. + xtrace same as -x + -p Turned on whenever the real and effective user ids do not match. + Disables processing of the $ENV file and importing of shell + functions. Turning this option off causes the effective uid and + gid to be set to the real uid and gid. + -t Exit after reading and executing one command. + -u Treat unset variables as an error when substituting. + -v Print shell input lines as they are read. + -x Print commands and their arguments as they are executed. #if defined (BRACE_EXPANSION) - -B the shell will perform brace expansion + -B the shell will perform brace expansion #endif /* BRACE_EXPANSION */ - -C If set, disallow existing regular files to be overwritten - by redirection of output. - -E If set, the ERR trap is inherited by shell functions. + -C If set, disallow existing regular files to be overwritten + by redirection of output. + -E If set, the ERR trap is inherited by shell functions. #if defined (BANG_HISTORY) - -H Enable ! style history substitution. This flag is on - by default when the shell is interactive. + -H Enable ! style history substitution. This flag is on + by default when the shell is interactive. #endif /* BANG_HISTORY */ - -P If set, do not follow symbolic links when executing commands - such as cd which change the current directory. - -T If set, the DEBUG trap is inherited by shell functions. - - Assign any remaining arguments to the positional parameters. - The -x and -v options are turned off. + -P If set, do not follow symbolic links when executing commands + such as cd which change the current directory. + -T If set, the DEBUG trap is inherited by shell functions. + - Assign any remaining arguments to the positional parameters. + The -x and -v options are turned off. Using + rather than - causes these flags to be turned off. The flags can also be used upon invocation of the shell. The current @@ -170,7 +171,7 @@ static const char * const off = "off"; /* A struct used to match long options for set -o to the corresponding option letter or internal variable. The functions can be called to dynamically generate values. */ -struct { +const struct { char *name; int letter; int *variable; @@ -425,7 +426,7 @@ set_minus_o_option (on_or_off, option_name) } sh_invalidoptname (option_name); - return (EXECUTION_FAILURE); + return (EX_USAGE); } static void @@ -580,17 +581,18 @@ int set_builtin (list) WORD_LIST *list; { - int on_or_off, flag_name, force_assignment, opts_changed; + int on_or_off, flag_name, force_assignment, opts_changed, rv, r; register char *arg; char s[3]; if (list == 0) { print_all_shell_variables (); - return (EXECUTION_SUCCESS); + return (sh_chkwrite (EXECUTION_SUCCESS)); } /* Check validity of flag arguments. */ + rv = EXECUTION_SUCCESS; reset_internal_getopt (); while ((flag_name = internal_getopt (list, optflags)) != -1) { @@ -653,6 +655,7 @@ set_builtin (list) if (opt == 0) { list_minus_o_opts (-1, (on_or_off == '+')); + rv = sh_chkwrite (rv); continue; } @@ -667,10 +670,10 @@ set_builtin (list) list = list->next; /* Skip over option name. */ opts_changed = 1; - if (set_minus_o_option (on_or_off, option_name) != EXECUTION_SUCCESS) + if ((r = set_minus_o_option (on_or_off, option_name)) != EXECUTION_SUCCESS) { set_shellopts (); - return (EXECUTION_FAILURE); + return (r); } } else if (change_flag (flag_name, on_or_off) == FLAG_ERROR) @@ -699,17 +702,22 @@ set_builtin (list) /* Set up new value of $SHELLOPTS */ if (opts_changed) set_shellopts (); - return (EXECUTION_SUCCESS); + return (rv); } $BUILTIN unset $FUNCTION unset_builtin $SHORT_DOC unset [-f] [-v] [name ...] -For each NAME, remove the corresponding variable or function. Given -the `-v', unset will only act on variables. Given the `-f' flag, -unset will only act on functions. With neither flag, unset first -tries to unset a variable, and if that fails, then tries to unset a -function. Some variables cannot be unset; also see readonly. +For each NAME, remove the corresponding variable or function. + +Options: + -f treat each NAME as a shell function + -v treat each NAME as a shell variable + +Without options, unset first tries to unset a variable, and if that fails, +tries to unset a function. + +Some variables cannot be unset; also see `readonly'. $END #define NEXT_VARIABLE() any_failed++; list = list->next; continue; diff --git a/builtins/setattr.def b/builtins/setattr.def index a44bfde84..be3d10432 100644 --- a/builtins/setattr.def +++ b/builtins/setattr.def @@ -1,7 +1,7 @@ This file is setattr.def, from which is created setattr.c. It implements the builtins "export" and "readonly", in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -53,13 +53,15 @@ extern int declare_builtin __P((WORD_LIST *)); $BUILTIN export $FUNCTION export_builtin $SHORT_DOC export [-fn] [name[=value] ...] or export -p -NAMEs are marked for automatic export to the environment of -subsequently executed commands. If the -f option is given, -the NAMEs refer to functions. If no NAMEs are given, or if `-p' -is given, a list of all names that are exported in this shell is -printed. An argument of `-n' says to remove the export property -from subsequent NAMEs. An argument of `--' disables further option -processing. +Marks each NAME for automatic export to the environment of subsequently +executed commands. If VALUE is supplied, assign VALUE before exporting. + +Options: + -f refer to shell functions + -n remove the export property from each NAME + -p display a list of all exported variables and functions + +An argument of `--' disables further option processing. $END /* For each variable name in LIST, make that variable appear in the @@ -77,13 +79,16 @@ export_builtin (list) $BUILTIN readonly $FUNCTION readonly_builtin $SHORT_DOC readonly [-af] [name[=value] ...] or readonly -p -The given NAMEs are marked readonly and the values of these NAMEs may -not be changed by subsequent assignment. If the -f option is given, -then functions corresponding to the NAMEs are so marked. If no -arguments are given, or if `-p' is given, a list of all readonly names -is printed. The `-a' option means to treat each NAME as -an array variable. An argument of `--' disables further option -processing. +Mark each NAME as read-only; the values of these NAMEs may not be +changed by subsequent assignment. If VALUE is supplied, assign VALUE +before marking as read-only. + +Options: + -a refer to array variables + -f refer to shell functions + -p display a list of all readonly variables and functions + +An argument of `--' disables further option processing. $END /* For each variable name in LIST, make that variable readonly. Given an diff --git a/builtins/setattr.def~ b/builtins/setattr.def~ index 72bde0d1d..b577a5b36 100644 --- a/builtins/setattr.def~ +++ b/builtins/setattr.def~ @@ -1,7 +1,7 @@ This file is setattr.def, from which is created setattr.c. It implements the builtins "export" and "readonly", in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -53,13 +53,16 @@ extern int declare_builtin __P((WORD_LIST *)); $BUILTIN export $FUNCTION export_builtin $SHORT_DOC export [-fn] [name[=value] ...] or export -p -NAMEs are marked for automatic export to the environment of -subsequently executed commands. If the -f option is given, -the NAMEs refer to functions. If no NAMEs are given, or if `-p' -is given, a list of all names that are exported in this shell is -printed. An argument of `-n' says to remove the export property -from subsequent NAMEs. An argument of `--' disables further option -processing. +Marks each NAME for automatic export to the environment of subsequently +executed commands. If VALUE is supplied, assign VALUE before exporting. + +Options: + + -f refer to shell functions + -n remove the export property from each NAME + -p display a list of all exported variables and functions + +An argument of `--' disables further option processing. $END /* For each variable name in LIST, make that variable appear in the @@ -77,13 +80,17 @@ export_builtin (list) $BUILTIN readonly $FUNCTION readonly_builtin $SHORT_DOC readonly [-af] [name[=value] ...] or readonly -p -The given NAMEs are marked readonly and the values of these NAMEs may -not be changed by subsequent assignment. If the -f option is given, -then functions corresponding to the NAMEs are so marked. If no -arguments are given, or if `-p' is given, a list of all readonly names -is printed. The `-a' option means to treat each NAME as -an array variable. An argument of `--' disables further option -processing. +Mark each NAME as read-only; the values of these NAMEs may not be +changed by subsequent assignment. If VALUE is supplied, assign VALUE +before marking as read-only. + +Options: + + -a refer to array variables + -f refer to shell functions + -p display a list of all readonly variables and functions + +An argument of `--' disables further option processing. $END /* For each variable name in LIST, make that variable readonly. Given an @@ -340,7 +347,7 @@ show_var_attributes (var, pattr, nodefs) reused as input to recreate the current state. */ if (function_p (var) && nodefs == 0 && (pattr == 0 || posixly_correct == 0)) { - printf ("%s\n", named_function_string (var->name, function_cell (var), FUNC_MULTILINE)); + printf ("%s\n", named_function_string (var->name, function_cell (var), FUNC_MULTILINE|FUNC_EXTERNAL)); nodefs++; if (pattr == 0 && i == 1 && flags[0] == 'f') return 0; /* don't print `declare -f name' */ @@ -363,7 +370,7 @@ show_var_attributes (var, pattr, nodefs) if (nodefs || (function_p (var) && pattr != 0 && posixly_correct)) printf ("%s\n", var->name); else if (function_p (var)) - printf ("%s\n", named_function_string (var->name, function_cell (var), FUNC_MULTILINE)); + printf ("%s\n", named_function_string (var->name, function_cell (var), FUNC_MULTILINE|FUNC_EXTERNAL)); else if (invisible_p (var)) printf ("%s\n", var->name); else diff --git a/builtins/shift.def b/builtins/shift.def index e20b4d542..5f600dd56 100644 --- a/builtins/shift.def +++ b/builtins/shift.def @@ -1,7 +1,7 @@ This file is shift.def, from which is created shift.c. It implements the builtin "shift" in Bash. -Copyright (C) 1987-2003 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -39,7 +39,7 @@ $PRODUCES shift.c $BUILTIN shift $FUNCTION shift_builtin $SHORT_DOC shift [n] -The positional parameters from $N+1 ... are renamed to $1 ... If N is +Rename the positional parameters $N+1,$N+2 ... to $1,$2 ... If N is not given, it is assumed to be 1. $END diff --git a/builtins/shift.def~ b/builtins/shift.def~ new file mode 100644 index 000000000..158e0606a --- /dev/null +++ b/builtins/shift.def~ @@ -0,0 +1,96 @@ +This file is shift.def, from which is created shift.c. +It implements the builtin "shift" in Bash. + +Copyright (C) 1987-2003 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES shift.c + +#include + +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "../bashansi.h" +#include "../bashintl.h" + +#include "../shell.h" +#include "common.h" + +$BUILTIN shift +$FUNCTION shift_builtin +$SHORT_DOC shift [n] +Rename the positional parameters $N+1 ... to $1 ... If N is not +given, it is assumed to be 1. +$END + +int print_shift_error; + +/* Shift the arguments ``left''. Shift DOLLAR_VARS down then take one + off of REST_OF_ARGS and place it into DOLLAR_VARS[9]. If LIST has + anything in it, it is a number which says where to start the + shifting. Return > 0 if `times' > $#, otherwise 0. */ +int +shift_builtin (list) + WORD_LIST *list; +{ + intmax_t times; + register int count; + WORD_LIST *temp; + + times = get_numeric_arg (list, 0); + + if (times == 0) + return (EXECUTION_SUCCESS); + else if (times < 0) + { + sh_erange (list ? list->word->word : NULL, _("shift count")); + return (EXECUTION_FAILURE); + } + else if (times > number_of_args ()) + { + if (print_shift_error) + sh_erange (list ? list->word->word : NULL, _("shift count")); + return (EXECUTION_FAILURE); + } + + while (times-- > 0) + { + if (dollar_vars[1]) + free (dollar_vars[1]); + + for (count = 1; count < 9; count++) + dollar_vars[count] = dollar_vars[count + 1]; + + if (rest_of_args) + { + temp = rest_of_args; + dollar_vars[9] = savestring (temp->word->word); + rest_of_args = rest_of_args->next; + temp->next = (WORD_LIST *)NULL; + dispose_words (temp); + } + else + dollar_vars[9] = (char *)NULL; + } + return (EXECUTION_SUCCESS); +} diff --git a/builtins/shopt.def b/builtins/shopt.def index 080a03f40..f86764f85 100644 --- a/builtins/shopt.def +++ b/builtins/shopt.def @@ -1,7 +1,7 @@ This file is shopt.def, from which is created shopt.c. It implements the Bash `shopt' builtin. -Copyright (C) 1994-2006 Free Software Foundation, Inc. +Copyright (C) 1994-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,14 +24,17 @@ $PRODUCES shopt.c $BUILTIN shopt $FUNCTION shopt_builtin $SHORT_DOC shopt [-pqsu] [-o] [optname ...] -Toggle the values of variables controlling optional behavior. -The -s flag means to enable (set) each OPTNAME; the -u flag -unsets each OPTNAME. The -q flag suppresses output; the exit -status indicates whether each OPTNAME is set or unset. The -o -option restricts the OPTNAMEs to those defined for use with -`set -o'. With no options, or with the -p option, a list of all -settable options is displayed, with an indication of whether or -not each is set. +Set and unset shell options. Without any option arguments, list all +shell options with an indication of whether or not each is set. + +Options: + -o restrict OPTNAMEs to those defined for use with `set -o' + -p print each shell option with an indication of its status + -q suppress output + -s enable (set) each OPTNAME + -u disable (unset) each OPTNAME + +The exit status indicates whether or not each OPTNAME is set. $END #include diff --git a/builtins/shopt.def~ b/builtins/shopt.def~ index 0ee794d40..390478d73 100644 --- a/builtins/shopt.def~ +++ b/builtins/shopt.def~ @@ -1,7 +1,7 @@ This file is shopt.def, from which is created shopt.c. It implements the Bash `shopt' builtin. -Copyright (C) 1994-2006 Free Software Foundation, Inc. +Copyright (C) 1994-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,14 +24,18 @@ $PRODUCES shopt.c $BUILTIN shopt $FUNCTION shopt_builtin $SHORT_DOC shopt [-pqsu] [-o] [optname ...] -Toggle the values of variables controlling optional behavior. -The -s flag means to enable (set) each OPTNAME; the -u flag -unsets each OPTNAME. The -q flag suppresses output; the exit -status indicates whether each OPTNAME is set or unset. The -o -option restricts the OPTNAMEs to those defined for use with -`set -o'. With no options, or with the -p option, a list of all -settable options is displayed, with an indication of whether or -not each is set. +Set and unset shell options. Without any option arguments, list all +shell options with an indication of whether or not each is set. + +Options: + + -o restrict OPTNAMEs to those defined for use with `set -o' + -p print each shell option with an indication of its status + -q suppress output + -s enable (set) each OPTNAME + -u disable (unset) each OPTNAME + +The exit status indicates whether or not each OPTNAME is set. $END #include @@ -174,8 +178,8 @@ static struct { { (char *)0, (int *)0, (shopt_set_func_t *)NULL } }; -static char *on = "on"; -static char *off = "off"; +static const char * const on = "on"; +static const char * const off = "off"; static int find_shopt __P((char *)); static int toggle_shopts __P((int, WORD_LIST *, int)); @@ -352,7 +356,7 @@ list_shopts (list, flags) if ((flags & QFLAG) == 0) print_shopt (shopt_vars[i].name, val, flags); } - return (EXECUTION_SUCCESS); + return (sh_chkwrite (EXECUTION_SUCCESS)); } for (l = list, rval = EXECUTION_SUCCESS; l; l = l->next) @@ -371,7 +375,7 @@ list_shopts (list, flags) print_shopt (l->word->word, val, flags); } - return (rval); + return (sh_chkwrite (rval)); } static int @@ -386,7 +390,7 @@ list_some_shopts (mode, flags) if (((flags & QFLAG) == 0) && mode == val) print_shopt (shopt_vars[i].name, val, flags); } - return (EXECUTION_SUCCESS); + return (sh_chkwrite (EXECUTION_SUCCESS)); } static int @@ -401,7 +405,7 @@ list_shopt_o_options (list, flags) { if ((flags & QFLAG) == 0) list_minus_o_opts (-1, (flags & PFLAG)); - return (EXECUTION_SUCCESS); + return (sh_chkwrite (EXECUTION_SUCCESS)); } for (l = list, rval = EXECUTION_SUCCESS; l; l = l->next) @@ -423,7 +427,7 @@ list_shopt_o_options (list, flags) printf (OPTFMT, l->word->word, val ? on : off); } } - return (rval); + return (sh_chkwrite (rval)); } static int @@ -432,7 +436,7 @@ list_some_o_options (mode, flags) { if ((flags & QFLAG) == 0) list_minus_o_opts (mode, (flags & PFLAG)); - return (EXECUTION_SUCCESS); + return (sh_chkwrite (EXECUTION_SUCCESS)); } static int @@ -540,5 +544,5 @@ shopt_listopt (name, reusable) } print_shopt (name, *shopt_vars[i].value, reusable ? PFLAG : 0); - return (EXECUTION_SUCCESS); + return (sh_chkwrite (EXECUTION_SUCCESS)); } diff --git a/builtins/source.def b/builtins/source.def index 0a8eb0ffa..25d5626b6 100644 --- a/builtins/source.def +++ b/builtins/source.def @@ -1,7 +1,7 @@ This file is source.def, from which is created source.c. It implements the builtins "." and "source" in Bash. -Copyright (C) 1987-2003 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,19 +24,19 @@ $PRODUCES source.c $BUILTIN source $FUNCTION source_builtin $SHORT_DOC source filename [arguments] -Read and execute commands from FILENAME and return. The pathnames -in $PATH are used to find the directory containing FILENAME. If any -ARGUMENTS are supplied, they become the positional parameters when -FILENAME is executed. +Read and execute commands from FILENAME in the current shell. The +entries in $PATH are used to find the directory containing FILENAME. +If any ARGUMENTS are supplied, they become the positional parameters +when FILENAME is executed. $END $BUILTIN . $DOCNAME dot $FUNCTION source_builtin $SHORT_DOC . filename [arguments] -Read and execute commands from FILENAME and return. The pathnames -in $PATH are used to find the directory containing FILENAME. If any -ARGUMENTS are supplied, they become the positional parameters when -FILENAME is executed. +Read and execute commands from FILENAME in the current shell. The +entries in $PATH are used to find the directory containing FILENAME. +If any ARGUMENTS are supplied, they become the positional parameters +when FILENAME is executed. $END #include diff --git a/builtins/source.def~ b/builtins/source.def~ new file mode 100644 index 000000000..5a3615cea --- /dev/null +++ b/builtins/source.def~ @@ -0,0 +1,171 @@ +This file is source.def, from which is created source.c. +It implements the builtins "." and "source" in Bash. + +Copyright (C) 1987-2008 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES source.c + +$BUILTIN source +$FUNCTION source_builtin +$SHORT_DOC source filename [arguments] +Read and execute commands from FILENAME in the current shell. The entries +in $PATH are used to find the directory containing FILENAME. If any +ARGUMENTS are supplied, they become the positional parameters when +FILENAME is executed. +$END +$BUILTIN . +$DOCNAME dot +$FUNCTION source_builtin +$SHORT_DOC . filename [arguments] +Read and execute commands from FILENAME in the current shell. The entries +in $PATH are used to find the directory containing FILENAME. If any +ARGUMENTS are supplied, they become the positional parameters when +FILENAME is executed. +$END + +#include + +#include "../bashtypes.h" +#include "posixstat.h" +#include "filecntl.h" +#if ! defined(_MINIX) && defined (HAVE_SYS_FILE_H) +# include +#endif +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include "../bashansi.h" +#include "../bashintl.h" + +#include "../shell.h" +#include "../flags.h" +#include "../findcmd.h" +#include "common.h" +#include "bashgetopt.h" +#include "../trap.h" + +#if !defined (errno) +extern int errno; +#endif /* !errno */ + +static void maybe_pop_dollar_vars __P((void)); + +/* If non-zero, `.' uses $PATH to look up the script to be sourced. */ +int source_uses_path = 1; + +/* If non-zero, `.' looks in the current directory if the filename argument + is not found in the $PATH. */ +int source_searches_cwd = 1; + +/* If this . script is supplied arguments, we save the dollar vars and + replace them with the script arguments for the duration of the script's + execution. If the script does not change the dollar vars, we restore + what we saved. If the dollar vars are changed in the script, and we are + not executing a shell function, we leave the new values alone and free + the saved values. */ +static void +maybe_pop_dollar_vars () +{ + if (variable_context == 0 && (dollar_vars_changed () & ARGS_SETBLTIN)) + dispose_saved_dollar_vars (); + else + pop_dollar_vars (); + if (debugging_mode) + pop_args (); /* restore BASH_ARGC and BASH_ARGV */ + set_dollar_vars_unchanged (); +} + +/* Read and execute commands from the file passed as argument. Guess what. + This cannot be done in a subshell, since things like variable assignments + take place in there. So, I open the file, place it into a large string, + close the file, and then execute the string. */ +int +source_builtin (list) + WORD_LIST *list; +{ + int result; + char *filename, *debug_trap; + + if (no_options (list)) + return (EX_USAGE); + list = loptend; + + if (list == 0) + { + builtin_error (_("filename argument required")); + builtin_usage (); + return (EX_USAGE); + } + +#if defined (RESTRICTED_SHELL) + if (restricted && strchr (list->word->word, '/')) + { + sh_restricted (list->word->word); + return (EXECUTION_FAILURE); + } +#endif + + filename = (char *)NULL; + if (source_uses_path) + filename = find_path_file (list->word->word); + if (filename == 0) + { + if (source_searches_cwd == 0) + { + builtin_error (_("%s: file not found"), list->word->word); + return (EXECUTION_FAILURE); + } + else + filename = savestring (list->word->word); + } + + begin_unwind_frame ("source"); + add_unwind_protect ((Function *)xfree, filename); + + if (list->next) + { + push_dollar_vars (); + add_unwind_protect ((Function *)maybe_pop_dollar_vars, (char *)NULL); + remember_args (list->next, 1); + if (debugging_mode) + push_args (list->next); /* Update BASH_ARGV and BASH_ARGC */ + } + set_dollar_vars_unchanged (); + + /* Don't inherit the DEBUG trap unless function_trace_mode (overloaded) + is set. XXX - should sourced files inherit the RETURN trap? Functions + don't. */ + debug_trap = TRAP_STRING (DEBUG_TRAP); + if (debug_trap && function_trace_mode == 0) + { + debug_trap = savestring (debug_trap); + add_unwind_protect (xfree, debug_trap); + add_unwind_protect (set_debug_trap, debug_trap); + restore_default_signal (DEBUG_TRAP); + } + + result = source_file (filename, (list && list->next)); + + run_unwind_frame ("source"); + + return (result); +} diff --git a/builtins/suspend.def b/builtins/suspend.def index ea86ae22c..deb44b3db 100644 --- a/builtins/suspend.def +++ b/builtins/suspend.def @@ -1,7 +1,7 @@ This file is suspend.def, from which is created suspend.c. It implements the builtin "suspend" in Bash. -Copyright (C) 1987-2003 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,9 +25,10 @@ $BUILTIN suspend $DEPENDS_ON JOB_CONTROL $FUNCTION suspend_builtin $SHORT_DOC suspend [-f] -Suspend the execution of this shell until it receives a SIGCONT -signal. The `-f' if specified says not to complain about this -being a login shell if it is; just suspend anyway. +Suspend the execution of this shell until it receives a SIGCONT signal. + +Options: + -f force the suspend, even if the shell is a login shell $END #include diff --git a/builtins/suspend.def~ b/builtins/suspend.def~ new file mode 100644 index 000000000..a84a6e3c5 --- /dev/null +++ b/builtins/suspend.def~ @@ -0,0 +1,123 @@ +This file is suspend.def, from which is created suspend.c. +It implements the builtin "suspend" in Bash. + +Copyright (C) 1987-2008 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES suspend.c + +$BUILTIN suspend +$DEPENDS_ON JOB_CONTROL +$FUNCTION suspend_builtin +$SHORT_DOC suspend [-f] +Suspend the execution of this shell until it receives a SIGCONT signal. + +Options: + + -f force the suspend, even if the shell is a login shell +$END + +#include + +#if defined (JOB_CONTROL) +#if defined (HAVE_UNISTD_H) +# ifdef _MINIX +# include +# endif +# include +#endif + +#include "../bashtypes.h" +#include +#include "../bashintl.h" +#include "../shell.h" +#include "../jobs.h" +#include "common.h" +#include "bashgetopt.h" + +static sighandler suspend_continue __P((int)); + +static SigHandler *old_cont; +#if 0 +static SigHandler *old_stop; +#endif + +/* Continue handler. */ +static sighandler +suspend_continue (sig) + int sig; +{ + set_signal_handler (SIGCONT, old_cont); +#if 0 + set_signal_handler (SIGSTOP, old_stop); +#endif + SIGRETURN (0); +} + +/* Suspending the shell. If -f is the arg, then do the suspend + no matter what. Otherwise, complain if a login shell. */ +int +suspend_builtin (list) + WORD_LIST *list; +{ + int opt, force; + + reset_internal_getopt (); + force = 0; + while ((opt = internal_getopt (list, "f")) != -1) + switch (opt) + { + case 'f': + force++; + break; + default: + builtin_usage (); + return (EX_USAGE); + } + + list = loptend; + + if (job_control == 0) + { + sh_nojobs (_("cannot suspend")); + return (EXECUTION_FAILURE); + } + + if (force == 0) + { + no_args (list); + + if (login_shell) + { + builtin_error (_("cannot suspend a login shell")); + return (EXECUTION_FAILURE); + } + } + + /* XXX - should we put ourselves back into the original pgrp now? If so, + call end_job_control() here and do the right thing in suspend_continue + (that is, call restart_job_control()). */ + old_cont = (SigHandler *)set_signal_handler (SIGCONT, suspend_continue); +#if 0 + old_stop = (SigHandler *)set_signal_handler (SIGSTOP, SIG_DFL); +#endif + killpg (shell_pgrp, SIGSTOP); + return (EXECUTION_SUCCESS); +} + +#endif /* JOB_CONTROL */ diff --git a/builtins/test.def b/builtins/test.def index f74cb0aa4..2354e6ead 100644 --- a/builtins/test.def +++ b/builtins/test.def @@ -1,7 +1,7 @@ This file is test.def, from which is created test.c. It implements the builtin "test" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -31,27 +31,27 @@ are string operators as well, and numeric comparison operators. File operators: - -a FILE True if file exists. - -b FILE True if file is block special. - -c FILE True if file is character special. - -d FILE True if file is a directory. - -e FILE True if file exists. - -f FILE True if file exists and is a regular file. - -g FILE True if file is set-group-id. - -h FILE True if file is a symbolic link. - -L FILE True if file is a symbolic link. - -k FILE True if file has its `sticky' bit set. - -p FILE True if file is a named pipe. - -r FILE True if file is readable by you. - -s FILE True if file exists and is not empty. - -S FILE True if file is a socket. - -t FD True if FD is opened on a terminal. - -u FILE True if the file is set-user-id. - -w FILE True if the file is writable by you. - -x FILE True if the file is executable by you. - -O FILE True if the file is effectively owned by you. - -G FILE True if the file is effectively owned by your group. - -N FILE True if the file has been modified since it was last read. + -a FILE True if file exists. + -b FILE True if file is block special. + -c FILE True if file is character special. + -d FILE True if file is a directory. + -e FILE True if file exists. + -f FILE True if file exists and is a regular file. + -g FILE True if file is set-group-id. + -h FILE True if file is a symbolic link. + -L FILE True if file is a symbolic link. + -k FILE True if file has its `sticky' bit set. + -p FILE True if file is a named pipe. + -r FILE True if file is readable by you. + -s FILE True if file exists and is not empty. + -S FILE True if file is a socket. + -t FD True if FD is opened on a terminal. + -u FILE True if the file is set-user-id. + -w FILE True if the file is writable by you. + -x FILE True if the file is executable by you. + -O FILE True if the file is effectively owned by you. + -G FILE True if the file is effectively owned by your group. + -N FILE True if the file has been modified since it was last read. FILE1 -nt FILE2 True if file1 is newer than file2 (according to modification date). @@ -62,29 +62,29 @@ File operators: String operators: - -z STRING True if string is empty. + -z STRING True if string is empty. - -n STRING - STRING True if string is not empty. + -n STRING + STRING True if string is not empty. - STRING1 = STRING2 - True if the strings are equal. - STRING1 != STRING2 - True if the strings are not equal. - STRING1 < STRING2 - True if STRING1 sorts before STRING2 lexicographically. - STRING1 > STRING2 - True if STRING1 sorts after STRING2 lexicographically. + STRING1 = STRING2 + True if the strings are equal. + STRING1 != STRING2 + True if the strings are not equal. + STRING1 < STRING2 + True if STRING1 sorts before STRING2 lexicographically. + STRING1 > STRING2 + True if STRING1 sorts after STRING2 lexicographically. Other operators: - -o OPTION True if the shell option OPTION is enabled. - ! EXPR True if expr is false. - EXPR1 -a EXPR2 True if both expr1 AND expr2 are true. - EXPR1 -o EXPR2 True if either expr1 OR expr2 is true. + -o OPTION True if the shell option OPTION is enabled. + ! EXPR True if expr is false. + EXPR1 -a EXPR2 True if both expr1 AND expr2 are true. + EXPR1 -o EXPR2 True if either expr1 OR expr2 is true. - arg1 OP arg2 Arithmetic tests. OP is one of -eq, -ne, - -lt, -le, -gt, or -ge. + arg1 OP arg2 Arithmetic tests. OP is one of -eq, -ne, + -lt, -le, -gt, or -ge. Arithmetic binary operators return true if ARG1 is equal, not-equal, less-than, less-than-or-equal, greater-than, or greater-than-or-equal @@ -95,8 +95,8 @@ $BUILTIN [ $DOCNAME test_bracket $FUNCTION test_builtin $SHORT_DOC [ arg... ] -This is a synonym for the "test" builtin, but the last -argument must be a literal `]', to match the opening `['. +This is a synonym for the "test" builtin, but the last argument must +be a literal `]', to match the opening `['. $END #include diff --git a/builtins/test.def~ b/builtins/test.def~ index b776e5ae7..f74cb0aa4 100644 --- a/builtins/test.def~ +++ b/builtins/test.def~ @@ -109,6 +109,7 @@ $END #endif #include "../bashansi.h" +#include "../bashintl.h" #include "../shell.h" #include "../test.h" diff --git a/builtins/times.def b/builtins/times.def index 42a160f3a..fc2371a16 100644 --- a/builtins/times.def +++ b/builtins/times.def @@ -1,7 +1,7 @@ This file is times.def, from which is created times.c. It implements the builtin "times" in Bash. -Copyright (C) 1987-2002 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,7 +24,7 @@ $PRODUCES times.c $BUILTIN times $FUNCTION times_builtin $SHORT_DOC times -Print the accumulated user and system times for the shell and all of its +Prints the accumulated user and system times for the shell and all of its child processes. $END diff --git a/builtins/times.def~ b/builtins/times.def~ index 22304fc2f..fc2371a16 100644 --- a/builtins/times.def~ +++ b/builtins/times.def~ @@ -1,7 +1,7 @@ This file is times.def, from which is created times.c. It implements the builtin "times" in Bash. -Copyright (C) 1987-2002 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,8 +24,8 @@ $PRODUCES times.c $BUILTIN times $FUNCTION times_builtin $SHORT_DOC times -Print the accumulated user and system times for processes run from -the shell. +Prints the accumulated user and system times for the shell and all of its +child processes. $END #include @@ -111,5 +111,5 @@ times_builtin (list) # endif /* HAVE_TIMES */ #endif /* !HAVE_TIMES */ - return (EXECUTION_SUCCESS); + return (sh_chkwrite (EXECUTION_SUCCESS)); } diff --git a/builtins/trap.def b/builtins/trap.def index 7affa1cd1..5cc14c9f7 100644 --- a/builtins/trap.def +++ b/builtins/trap.def @@ -1,7 +1,7 @@ This file is trap.def, from which is created trap.c. It implements the builtin "trap" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,20 +24,28 @@ $PRODUCES trap.c $BUILTIN trap $FUNCTION trap_builtin $SHORT_DOC trap [-lp] [[arg] signal_spec ...] -The command ARG is to be read and executed when the shell receives +Defines and activates handlers to be run when the shell receives signals +or other conditions. + +ARG is a command to be read and executed when the shell receives the signal(s) SIGNAL_SPEC. If ARG is absent (and a single SIGNAL_SPEC is supplied) or `-', each specified signal is reset to its original value. If ARG is the null string each SIGNAL_SPEC is ignored by the -shell and by the commands it invokes. If a SIGNAL_SPEC is EXIT (0) -the command ARG is executed on exit from the shell. If a SIGNAL_SPEC -is DEBUG, ARG is executed before every simple command. If the`-p' option -is supplied then the trap commands associated with each SIGNAL_SPEC are -displayed. If no arguments are supplied or if only `-p' is given, trap -prints the list of commands associated with each signal. Each SIGNAL_SPEC -is either a signal name in or a signal number. Signal names -are case insensitive and the SIG prefix is optional. `trap -l' prints -a list of signal names and their corresponding numbers. Note that a -signal can be sent to the shell with "kill -signal $$". +shell and by the commands it invokes. + +If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell. If +a SIGNAL_SPEC is DEBUG, ARG is executed before every simple command. + +If no arguments are supplied, trap prints the list of commands associated +with each signal. + +Options: + -l print a list of signal names and their corresponding numbers + -p display the trap commands associated with each SIGNAL_SPEC + +Each SIGNAL_SPEC is either a signal name in or a signal number. +Signal names are case insensitive and the SIG prefix is optional. A +signal may be sent to the shell with "kill -signal $$". $END #include diff --git a/builtins/trap.def~ b/builtins/trap.def~ index 2735791e4..804330996 100644 --- a/builtins/trap.def~ +++ b/builtins/trap.def~ @@ -1,7 +1,7 @@ This file is trap.def, from which is created trap.c. It implements the builtin "trap" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -23,20 +23,28 @@ $PRODUCES trap.c $BUILTIN trap $FUNCTION trap_builtin -$SHORT_DOC trap [-lp] [arg signal_spec ...] -The command ARG is to be read and executed when the shell receives +$SHORT_DOC trap [-lp] [[arg] signal_spec ...] +Defines and activates handlers to be run when the shell receives signals +or other conditions. + +ARG is a command to be read and executed when the shell receives the signal(s) SIGNAL_SPEC. If ARG is absent (and a single SIGNAL_SPEC is supplied) or `-', each specified signal is reset to its original value. If ARG is the null string each SIGNAL_SPEC is ignored by the -shell and by the commands it invokes. If a SIGNAL_SPEC is EXIT (0) -the command ARG is executed on exit from the shell. If a SIGNAL_SPEC -is DEBUG, ARG is executed after every simple command. If the`-p' option -is supplied then the trap commands associated with each SIGNAL_SPEC are -displayed. If no arguments are supplied or if only `-p' is given, trap -prints the list of commands associated with each signal. Each SIGNAL_SPEC -is either a signal name in or a signal number. Signal names -are case insensitive and the SIG prefix is optional. `trap -l' prints -a list of signal names and their corresponding numbers. Note that a +shell and by the commands it invokes. + +If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell. If +a SIGNAL_SPEC is DEBUG, ARG is executed before every simple command. + +If no arguments are supplied, trap prints the list of commands associated +with each signal. + +Options: + -l print a list of signal names and their corresponding numbers + -p display the trap commands associated with each SIGNAL_SPEC + +Each SIGNAL_SPEC is either a signal name in or a signal number. +Signal names are case insensitive and the SIG prefix is optional. A signal can be sent to the shell with "kill -signal $$". $END @@ -112,9 +120,9 @@ trap_builtin (list) opt = DSIG_NOCASE|DSIG_SIGPREFIX; /* flags for decode_signal */ if (list_signal_names) - return (display_signal_list ((WORD_LIST *)NULL, 1)); + return (sh_chkwrite (display_signal_list ((WORD_LIST *)NULL, 1))); else if (display || list == 0) - return (display_traps (list)); + return (sh_chkwrite (display_traps (list))); else { char *first_arg; diff --git a/builtins/type.def b/builtins/type.def index eebd5f947..bb5327615 100644 --- a/builtins/type.def +++ b/builtins/type.def @@ -1,7 +1,7 @@ This file is type.def, from which is created type.c. It implements the builtin "type" in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -27,24 +27,20 @@ $SHORT_DOC type [-afptP] name [name ...] For each NAME, indicate how it would be interpreted if used as a command name. -If the -t option is used, `type' outputs a single word which is one of -`alias', `keyword', `function', `builtin', `file' or `', if NAME is an -alias, shell reserved word, shell function, shell builtin, disk file, -or unfound, respectively. - -If the -p flag is used, `type' either returns the name of the disk -file that would be executed, or nothing if `type -t NAME' would not -return `file'. - -If the -a flag is used, `type' displays all of the places that contain -an executable named `file'. This includes aliases, builtins, and -functions, if and only if the -p flag is not also used. - -The -f flag suppresses shell function lookup. - -The -P flag forces a PATH search for each NAME, even if it is an alias, -builtin, or function, and returns the name of the disk file that would -be executed. +Options: + -a display all locations containing an executable named NAME; + includes aliases, builtins, and functions, if and only if + the `-p' option is not also used + -f suppress shell function lookup + -P force a PATH search for each NAME, even if it is an alias, + builtin, or function, and returns the name of the disk file + that would be executed + -p returns either the name of the disk file that would be executed, + or nothing if `type -t NAME' would not return `file'. + -t output a single word which is one of `alias', `keyword', + `function', `builtin', `file' or `', if NAME is an alias, shell + reserved word, shell function, shell builtin, disk file, or not + found, respectively $END #include diff --git a/builtins/type.def~ b/builtins/type.def~ index fa40ad253..ed135dd41 100644 --- a/builtins/type.def~ +++ b/builtins/type.def~ @@ -1,7 +1,7 @@ This file is type.def, from which is created type.c. It implements the builtin "type" in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -27,24 +27,19 @@ $SHORT_DOC type [-afptP] name [name ...] For each NAME, indicate how it would be interpreted if used as a command name. -If the -t option is used, `type' outputs a single word which is one of -`alias', `keyword', `function', `builtin', `file' or `', if NAME is an -alias, shell reserved word, shell function, shell builtin, disk file, -or unfound, respectively. - -If the -p flag is used, `type' either returns the name of the disk -file that would be executed, or nothing if `type -t NAME' would not -return `file'. - -If the -a flag is used, `type' displays all of the places that contain -an executable named `file'. This includes aliases, builtins, and -functions, if and only if the -p flag is not also used. - -The -f flag suppresses shell function lookup. - -The -P flag forces a PATH search for each NAME, even if it is an alias, -builtin, or function, and returns the name of the disk file that would -be executed. +Options: + -a display all locations containing an executable named NAME; + includes aliases, builtins, and functions, if and only if + the `-p' option is not also used + -f suppress shell function lookup + -P force a PATH search for each NAME, even if it is an alias, + builtin, or function, and returns the name of the disk file + that would be executed + -p returns either the name of the disk file that would be executed, + or nothing if `type -t NAME' would not return `file'. + -t output a single word which is one of `alias', `keyword', `function', + `builtin', `file' or `', if NAME is an alias, shell reserved word, + shell function, shell builtin, disk file, or not found, respectively $END #include @@ -108,14 +103,14 @@ int type_builtin (list) WORD_LIST *list; { - int dflags, successful_finds, opt; + int dflags, any_failed, opt; WORD_LIST *this; if (list == 0) return (EXECUTION_SUCCESS); dflags = CDESC_SHORTDESC; /* default */ - successful_finds = 0; + any_failed = 0; /* Handle the obsolescent `-type', `-path', and `-all' by prescanning the arguments and converting those options to the form that @@ -181,11 +176,11 @@ type_builtin (list) if (!found && (dflags & (CDESC_PATH_ONLY|CDESC_TYPE)) == 0) sh_notfound (list->word->word); - successful_finds += found; + any_failed += found == 0; list = list->next; } - opt = (successful_finds != 0) ? EXECUTION_SUCCESS : EXECUTION_FAILURE; + opt = (any_failed == 0) ? EXECUTION_SUCCESS : EXECUTION_FAILURE; return (sh_chkwrite (opt)); } diff --git a/builtins/ulimit.def b/builtins/ulimit.def index c8d50c27e..1ea2c2a2b 100644 --- a/builtins/ulimit.def +++ b/builtins/ulimit.def @@ -1,7 +1,7 @@ This file is ulimit.def, from which is created ulimit.c. It implements the builtin "ulimit" in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,38 +25,39 @@ $BUILTIN ulimit $FUNCTION ulimit_builtin $DEPENDS_ON !_MINIX $SHORT_DOC ulimit [-SHacdefilmnpqrstuvx] [limit] -Ulimit provides control over the resources available to processes -started by the shell, on systems that allow such control. If an -option is given, it is interpreted as follows: - - -S use the `soft' resource limit - -H use the `hard' resource limit - -a all current limits are reported - -c the maximum size of core files created - -d the maximum size of a process's data segment - -e the maximum scheduling priority (`nice') - -f the maximum size of files written by the shell and its children - -i the maximum number of pending signals - -l the maximum size a process may lock into memory - -m the maximum resident set size - -n the maximum number of open file descriptors - -p the pipe buffer size - -q the maximum number of bytes in POSIX message queues - -r the maximum real-time scheduling priority - -s the maximum stack size - -t the maximum amount of cpu time in seconds - -u the maximum number of user processes - -v the size of virtual memory - -x the maximum number of file locks - -If LIMIT is given, it is the new value of the specified resource; -the special LIMIT values `soft', `hard', and `unlimited' stand for -the current soft limit, the current hard limit, and no limit, respectively. -Otherwise, the current value of the specified resource is printed. -If no option is given, then -f is assumed. Values are in 1024-byte -increments, except for -t, which is in seconds, -p, which is in -increments of 512 bytes, and -u, which is an unscaled number of -processes. +Provides control over the resources available to the shell and processes +it creates, on systems that allow such control. + +Options: + -S use the `soft' resource limit + -H use the `hard' resource limit + -a all current limits are reported + -c the maximum size of core files created + -d the maximum size of a process's data segment + -e the maximum scheduling priority (`nice') + -f the maximum size of files written by the shell and its children + -i the maximum number of pending signals + -l the maximum size a process may lock into memory + -m the maximum resident set size + -n the maximum number of open file descriptors + -p the pipe buffer size + -q the maximum number of bytes in POSIX message queues + -r the maximum real-time scheduling priority + -s the maximum stack size + -t the maximum amount of cpu time in seconds + -u the maximum number of user processes + -v the size of virtual memory + -x the maximum number of file locks + +If LIMIT is given, it is the new value of the specified resource; the +special LIMIT values `soft', `hard', and `unlimited' stand for the +current soft limit, the current hard limit, and no limit, respectively. +Otherwise, the current value of the specified resource is printed. If +no option is given, then -f is assumed. + +Values are in 1024-byte increments, except for -t, which is in seconds, +-p, which is in increments of 512 bytes, and -u, which is an unscaled +number of processes. $END #if !defined (_MINIX) diff --git a/builtins/ulimit.def~ b/builtins/ulimit.def~ index fd21e7296..332a06340 100644 --- a/builtins/ulimit.def~ +++ b/builtins/ulimit.def~ @@ -1,7 +1,7 @@ This file is ulimit.def, from which is created ulimit.c. It implements the builtin "ulimit" in Bash. -Copyright (C) 1987-2007 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -25,38 +25,37 @@ $BUILTIN ulimit $FUNCTION ulimit_builtin $DEPENDS_ON !_MINIX $SHORT_DOC ulimit [-SHacdefilmnpqrstuvx] [limit] -Ulimit provides control over the resources available to processes -started by the shell, on systems that allow such control. If an -option is given, it is interpreted as follows: - - -S use the `soft' resource limit - -H use the `hard' resource limit - -a all current limits are reported - -c the maximum size of core files created - -d the maximum size of a process's data segment - -e the maximum scheduling priority (`nice') - -f the maximum size of files written by the shell and its children - -i the maximum number of pending signals - -l the maximum size a process may lock into memory - -m the maximum resident set size - -n the maximum number of open file descriptors - -p the pipe buffer size - -q the maximum number of bytes in POSIX message queues - -r the maximum real-time scheduling priority - -s the maximum stack size - -t the maximum amount of cpu time in seconds - -u the maximum number of user processes - -v the size of virtual memory - -x the maximum number of file locks - -If LIMIT is given, it is the new value of the specified resource; -the special LIMIT values `soft', `hard', and `unlimited' stand for -the current soft limit, the current hard limit, and no limit, respectively. -Otherwise, the current value of the specified resource is printed. -If no option is given, then -f is assumed. Values are in 1024-byte -increments, except for -t, which is in seconds, -p, which is in -increments of 512 bytes, and -u, which is an unscaled number of -processes. +Provides control over the resources available to the shell and processes +it creates, on systems that allow such control. + +Options: + -S use the `soft' resource limit + -H use the `hard' resource limit + -a all current limits are reported + -c the maximum size of core files created + -d the maximum size of a process's data segment + -e the maximum scheduling priority (`nice') + -f the maximum size of files written by the shell and its children + -i the maximum number of pending signals + -l the maximum size a process may lock into memory + -m the maximum resident set size + -n the maximum number of open file descriptors + -p the pipe buffer size + -q the maximum number of bytes in POSIX message queues + -r the maximum real-time scheduling priority + -s the maximum stack size + -t the maximum amount of cpu time in seconds + -u the maximum number of user processes + -v the size of virtual memory + -x the maximum number of file locks + +If LIMIT is given, it is the new value of the specified resource; the +special LIMIT values `soft', `hard', and `unlimited' stand for the +current soft limit, the current hard limit, and no limit, respectively. +Otherwise, the current value of the specified resource is printed. If +no option is given, then -f is assumed. Values are in 1024-byte +increments, except for -t, which is in seconds, -p, which is in increments +of 512 bytes, and -u, which is an unscaled number of processes. $END #if !defined (_MINIX) @@ -199,15 +198,16 @@ typedef struct { static RESOURCE_LIMITS limits[] = { #ifdef RLIMIT_CORE - { 'c', RLIMIT_CORE, 1024, "core file size", "blocks" }, + { 'c', RLIMIT_CORE, 512, "core file size", "blocks" }, #endif #ifdef RLIMIT_DATA { 'd', RLIMIT_DATA, 1024, "data seg size", "kbytes" }, + #endif #ifdef RLIMIT_NICE { 'e', RLIMIT_NICE, 1, "scheduling priority", (char *)NULL }, #endif - { 'f', RLIMIT_FILESIZE, 1024, "file size", "blocks" }, + { 'f', RLIMIT_FILESIZE, 512, "file size", "blocks" }, #ifdef RLIMIT_SIGPENDING { 'i', RLIMIT_SIGPENDING, 1, "pending signals", (char *)NULL }, #endif diff --git a/builtins/umask.def b/builtins/umask.def index 23e819941..8703a828c 100644 --- a/builtins/umask.def +++ b/builtins/umask.def @@ -1,7 +1,7 @@ This file is umask.def, from which is created umask.c. It implements the builtin "umask" in Bash. -Copyright (C) 1987-2004 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -24,13 +24,15 @@ $PRODUCES umask.c $BUILTIN umask $FUNCTION umask_builtin $SHORT_DOC umask [-p] [-S] [mode] -The user file-creation mask is set to MODE. If MODE is omitted, or if -`-S' is supplied, the current value of the mask is printed. The `-S' -option makes the output symbolic; otherwise an octal number is output. -If `-p' is supplied, and MODE is omitted, the output is in a form -that may be used as input. If MODE begins with a digit, it is -interpreted as an octal number, otherwise it is a symbolic mode string -like that accepted by chmod(1). +Sets the user file-creation mask to MODE. If MODE is omitted, prints +the current value of the mask. + +If MODE begins with a digit, it is interpreted as an octal number; +otherwise it is a symbolic mode string like that accepted by chmod(1). + +Options: + -p if MODE is omitted, output in a form that may be reused as input + -S makes the output symbolic; otherwise an octal number is output $END #include diff --git a/builtins/umask.def~ b/builtins/umask.def~ new file mode 100644 index 000000000..34ac3baaa --- /dev/null +++ b/builtins/umask.def~ @@ -0,0 +1,313 @@ +This file is umask.def, from which is created umask.c. +It implements the builtin "umask" in Bash. + +Copyright (C) 1987-2008 Free Software Foundation, Inc. + +This file is part of GNU Bash, the Bourne Again SHell. + +Bash is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with Bash; see the file COPYING. If not, write to the Free Software +Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. + +$PRODUCES umask.c + +$BUILTIN umask +$FUNCTION umask_builtin +$SHORT_DOC umask [-p] [-S] [mode] +Sets the user file-creation mask to MODE. If MODE is omitted, prints +the current value of the mask. + +If MODE begins with a digit, it is interpreted as an octal number; +otherwise it is a symbolic mode string like that accepted by chmod(1). + +Options: + + -p if MODE is omitted, output in a form that may be reused as input + -S makes the output symbolic; otherwise an octal number is output +$END + +#include + +#include "../bashtypes.h" +#include "filecntl.h" +#if ! defined(_MINIX) && defined (HAVE_SYS_FILE_H) +# include +#endif + +#if defined (HAVE_UNISTD_H) +#include +#endif + +#include +#include + +#include "../bashintl.h" + +#include "../shell.h" +#include "posixstat.h" +#include "common.h" +#include "bashgetopt.h" + +#ifdef __LCC__ +#define mode_t int +#endif + +/* **************************************************************** */ +/* */ +/* UMASK Builtin and Helpers */ +/* */ +/* **************************************************************** */ + +static void print_symbolic_umask __P((mode_t)); +static int symbolic_umask __P((WORD_LIST *)); + +/* Set or display the mask used by the system when creating files. Flag + of -S means display the umask in a symbolic mode. */ +int +umask_builtin (list) + WORD_LIST *list; +{ + int print_symbolically, opt, umask_value, pflag; + mode_t umask_arg; + + print_symbolically = pflag = 0; + reset_internal_getopt (); + while ((opt = internal_getopt (list, "Sp")) != -1) + { + switch (opt) + { + case 'S': + print_symbolically++; + break; + case 'p': + pflag++; + break; + default: + builtin_usage (); + return (EX_USAGE); + } + } + + list = loptend; + + if (list) + { + if (DIGIT (*list->word->word)) + { + umask_value = read_octal (list->word->word); + + /* Note that other shells just let you set the umask to zero + by specifying a number out of range. This is a problem + with those shells. We don't change the umask if the input + is lousy. */ + if (umask_value == -1) + { + sh_erange (list->word->word, _("octal number")); + return (EXECUTION_FAILURE); + } + } + else + { + umask_value = symbolic_umask (list); + if (umask_value == -1) + return (EXECUTION_FAILURE); + } + umask_arg = (mode_t)umask_value; + umask (umask_arg); + if (print_symbolically) + print_symbolic_umask (umask_arg); + } + else /* Display the UMASK for this user. */ + { + umask_arg = umask (022); + umask (umask_arg); + + if (pflag) + printf ("umask%s ", (print_symbolically ? " -S" : "")); + if (print_symbolically) + print_symbolic_umask (umask_arg); + else + printf ("%04lo\n", (unsigned long)umask_arg); + } + + return (sh_chkwrite (EXECUTION_SUCCESS)); +} + +/* Print the umask in a symbolic form. In the output, a letter is + printed if the corresponding bit is clear in the umask. */ +static void +print_symbolic_umask (um) + mode_t um; +{ + char ubits[4], gbits[4], obits[4]; /* u=rwx,g=rwx,o=rwx */ + int i; + + i = 0; + if ((um & S_IRUSR) == 0) + ubits[i++] = 'r'; + if ((um & S_IWUSR) == 0) + ubits[i++] = 'w'; + if ((um & S_IXUSR) == 0) + ubits[i++] = 'x'; + ubits[i] = '\0'; + + i = 0; + if ((um & S_IRGRP) == 0) + gbits[i++] = 'r'; + if ((um & S_IWGRP) == 0) + gbits[i++] = 'w'; + if ((um & S_IXGRP) == 0) + gbits[i++] = 'x'; + gbits[i] = '\0'; + + i = 0; + if ((um & S_IROTH) == 0) + obits[i++] = 'r'; + if ((um & S_IWOTH) == 0) + obits[i++] = 'w'; + if ((um & S_IXOTH) == 0) + obits[i++] = 'x'; + obits[i] = '\0'; + + printf ("u=%s,g=%s,o=%s\n", ubits, gbits, obits); +} + +int +parse_symbolic_mode (mode, initial_bits) + char *mode; + int initial_bits; +{ + int who, op, perm, bits, c; + char *s; + + for (s = mode, bits = initial_bits;;) + { + who = op = perm = 0; + + /* Parse the `who' portion of the symbolic mode clause. */ + while (member (*s, "agou")) + { + switch (c = *s++) + { + case 'u': + who |= S_IRWXU; + continue; + case 'g': + who |= S_IRWXG; + continue; + case 'o': + who |= S_IRWXO; + continue; + case 'a': + who |= S_IRWXU | S_IRWXG | S_IRWXO; + continue; + default: + break; + } + } + + /* The operation is now sitting in *s. */ + op = *s++; + switch (op) + { + case '+': + case '-': + case '=': + break; + default: + builtin_error (_("`%c': invalid symbolic mode operator"), op); + return (-1); + } + + /* Parse out the `perm' section of the symbolic mode clause. */ + while (member (*s, "rwx")) + { + c = *s++; + + switch (c) + { + case 'r': + perm |= S_IRUGO; + break; + case 'w': + perm |= S_IWUGO; + break; + case 'x': + perm |= S_IXUGO; + break; + } + } + + /* Now perform the operation or return an error for a + bad permission string. */ + if (!*s || *s == ',') + { + if (who) + perm &= who; + + switch (op) + { + case '+': + bits |= perm; + break; + case '-': + bits &= ~perm; + break; + case '=': + if (who == 0) + who = S_IRWXU | S_IRWXG | S_IRWXO; + bits &= ~who; + bits |= perm; + break; + + /* No other values are possible. */ + } + + if (*s == '\0') + break; + else + s++; /* skip past ',' */ + } + else + { + builtin_error (_("`%c': invalid symbolic mode character"), *s); + return (-1); + } + } + + return (bits); +} + +/* Set the umask from a symbolic mode string similar to that accepted + by chmod. If the -S argument is given, then print the umask in a + symbolic form. */ +static int +symbolic_umask (list) + WORD_LIST *list; +{ + int um, bits; + + /* Get the initial umask. Don't change it yet. */ + um = umask (022); + umask (um); + + /* All work is done with the complement of the umask -- it's + more intuitive and easier to deal with. It is complemented + again before being returned. */ + bits = parse_symbolic_mode (list->word->word, ~um & 0777); + if (bits == -1) + return (-1); + + um = ~bits & 0777; + return (um); +} diff --git a/builtins/wait.def b/builtins/wait.def index 94e525f54..3e018044d 100644 --- a/builtins/wait.def +++ b/builtins/wait.def @@ -1,7 +1,7 @@ This file is wait.def, from which is created wait.c. It implements the builtin "wait" in Bash. -Copyright (C) 1987-2006 Free Software Foundation, Inc. +Copyright (C) 1987-2008 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -23,21 +23,21 @@ $BUILTIN wait $FUNCTION wait_builtin $DEPENDS_ON JOB_CONTROL $PRODUCES wait.c -$SHORT_DOC wait [n] -Wait for the specified process and report its termination status. If -N is not given, all currently active child processes are waited for, -and the return code is zero. N may be a process ID or a job -specification; if a job spec is given, all processes in the job's -pipeline are waited for. +$SHORT_DOC wait [id] +Waits for the process identified by ID, which may be a process ID or a +job specification, and reports its termination status. If ID is not +given, waits for all currently active child processes, and the return +status is zero. If ID is a a job specification, waits for all processes +in the job's pipeline. $END $BUILTIN wait $FUNCTION wait_builtin $DEPENDS_ON !JOB_CONTROL -$SHORT_DOC wait [n] -Wait for the specified process and report its termination status. If -N is not given, all currently active child processes are waited for, -and the return code is zero. N must be a process ID. +$SHORT_DOC wait [pid] +Waits for the specified process and reports its termination status. If +PID is not given, all currently active child processes are waited for, +and the return code is zero. PID must be a process ID. $END #include diff --git a/builtins/wait.def~ b/builtins/wait.def~ index ece836044..94e525f54 100644 --- a/builtins/wait.def~ +++ b/builtins/wait.def~ @@ -1,7 +1,7 @@ This file is wait.def, from which is created wait.c. It implements the builtin "wait" in Bash. -Copyright (C) 1987-2005 Free Software Foundation, Inc. +Copyright (C) 1987-2006 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. diff --git a/doc/bash.pdf b/doc/bash.pdf index f127e51be..51c81b772 100644 Binary files a/doc/bash.pdf and b/doc/bash.pdf differ diff --git a/doc/bashref.texi b/doc/bashref.texi index 3614838d6..433e61b02 100644 --- a/doc/bashref.texi +++ b/doc/bashref.texi @@ -3438,7 +3438,7 @@ parent. @item printf @btindex printf @example -@code{printf} [-v @var{var}] @var{format} [@var{arguments}] +printf [-v @var{var}] @var{format} [@var{arguments}] @end example Write the formatted @var{arguments} to the standard output under the control of the @var{format}. diff --git a/doc/bashref.texi~ b/doc/bashref.texi~ index 797740d9d..3614838d6 100644 --- a/doc/bashref.texi~ +++ b/doc/bashref.texi~ @@ -16,7 +16,7 @@ This is Edition @value{EDITION}, last updated @value{UPDATED}, of @cite{The GNU Bash Reference Manual}, for @code{Bash}, Version @value{VERSION}. -Copyright @copyright{} 1988-2005 Free Software Foundation, Inc. +Copyright @copyright{} 1988--2007 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -26,13 +26,14 @@ are preserved on all copies. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU Manual,'' +Invariant Sections, with the Front-Cover texts being ``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A copy of the license is -included in the section entitled ``GNU Free Documentation License.'' +included in the section entitled ``GNU Free Documentation License''. + +(a) The FSF's Back-Cover Text is: ``You have the freedom to +copy and modify this GNU manual. Buying copies from the FSF +supports it in developing GNU and promoting software freedom.'' -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' @end quotation @end copying @@ -110,7 +111,7 @@ reference on shell behavior. * Major Differences From The Bourne Shell:: A terse list of the differences between Bash and historical versions of /bin/sh. -* Copying This Manual:: Copying this manual. +* GNU Free Documentation License:: Copying and sharing this documentation. * Indexes:: Various indexes for this manual. @end menu @end ifnottex @@ -7468,12 +7469,8 @@ The SVR4.2 shell behaves differently when invoked as @code{jsh} (it turns on job control). @end itemize -@node Copying This Manual -@appendix Copying This Manual - -@menu -* GNU Free Documentation License:: License for copying this manual. -@end menu +@node GNU Free Documentation License +@appendix GNU Free Documentation License @include fdl.texi diff --git a/lib/sh/Makefile.in b/lib/sh/Makefile.in index 76ca594ef..d584a68d1 100644 --- a/lib/sh/Makefile.in +++ b/lib/sh/Makefile.in @@ -91,7 +91,7 @@ CSOURCES = clktck.c clock.c getcwd.c getenv.c oslib.c setlinebuf.c \ fmtulong.c fmtullong.c fmtumax.c shmatch.c strnlen.c \ strtoll.c strtoull.c strtoimax.c strtoumax.c memset.c strstr.c \ mktime.c strftime.c xstrchr.c zcatfd.c zmapfd.c winsize.c eaccess.c \ - wcsdup.c fpurge.c + wcsdup.c fpurge.c zgetline.c # The header files for this library. HSOURCES = @@ -104,7 +104,7 @@ OBJECTS = clktck.o clock.o getenv.o oslib.o setlinebuf.o strnlen.o \ pathphys.o tmpfile.o stringlist.o stringvec.o spell.o shquote.o \ strtrans.o strindex.o snprintf.o mailstat.o fmtulong.o \ fmtullong.o fmtumax.o xstrchr.o zcatfd.o zmapfd.o winsize.o wcsdup.o \ - fpurge.o ${LIBOBJS} + fpurge.o zgetline.o ${LIBOBJS} SUPPORT = Makefile @@ -186,6 +186,7 @@ wcsdup.o: wcsdup.c xstrchr.o: xstrchr.c zcatfd.o: zcatfd.c zmapfd.o: zmapfd.c +zgetline.o: zgetline.c zread.o: zread.c zwrite.o: zwrite.c @@ -246,6 +247,7 @@ vprint.o: ${BUILD_DIR}/config.h wcsdup.o: ${BUILD_DIR}/config.h xstrchr.o: ${BUILD_DIR}/config.h zcatfd.o: ${BUILD_DIR}/config.h +zgetline.o: ${BUILD_DIR}/config.h zmapfd.o: ${BUILD_DIR}/config.h zread.o: ${BUILD_DIR}/config.h zwrite.o: ${BUILD_DIR}/config.h @@ -482,3 +484,8 @@ wcsdup.o: ${topdir}/xmalloc.h xstrchr.o: ${topdir}/bashansi.h xstrchr.o: ${BASHINCDIR}/ansi_stdlib.h xstrchr.o: ${BASHINCDIR}/shmbutil.h + +zgetline.o: ${topdir}/bashansi.h ${BASHINCDIR}/ansi_stdlib.h +zgetline.o: ${BASHINCDIR}/stdc.h +zgetline.o: ${topdir}/xmalloc.h +zgetline.o: ${topdir}/bashtypes.h diff --git a/lib/sh/Makefile.in~ b/lib/sh/Makefile.in~ index 53e5ca5d1..76ca594ef 100644 --- a/lib/sh/Makefile.in~ +++ b/lib/sh/Makefile.in~ @@ -40,6 +40,8 @@ INTL_BUILDDIR = ${LIBBUILD}/intl INTL_INC = @INTL_INC@ LIBINTL_H = @LIBINTL_H@ +datarootdir = @datarootdir@ + INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ @@ -89,7 +91,7 @@ CSOURCES = clktck.c clock.c getcwd.c getenv.c oslib.c setlinebuf.c \ fmtulong.c fmtullong.c fmtumax.c shmatch.c strnlen.c \ strtoll.c strtoull.c strtoimax.c strtoumax.c memset.c strstr.c \ mktime.c strftime.c xstrchr.c zcatfd.c zmapfd.c winsize.c eaccess.c \ - wcsdup.c + wcsdup.c fpurge.c # The header files for this library. HSOURCES = @@ -102,7 +104,7 @@ OBJECTS = clktck.o clock.o getenv.o oslib.o setlinebuf.o strnlen.o \ pathphys.o tmpfile.o stringlist.o stringvec.o spell.o shquote.o \ strtrans.o strindex.o snprintf.o mailstat.o fmtulong.o \ fmtullong.o fmtumax.o xstrchr.o zcatfd.o zmapfd.o winsize.o wcsdup.o \ - ${LIBOBJS} + fpurge.o ${LIBOBJS} SUPPORT = Makefile @@ -140,6 +142,7 @@ eaccess.o: eaccess.c fmtullong.o: fmtullong.c fmtulong.o: fmtulong.c fmtumax.o: fmtumax.c +fpurge.o: fpurge.c getcwd.o: getcwd.c getenv.o: getenv.c inet_aton.o: inet_aton.c @@ -200,6 +203,7 @@ eaccess.o: ${BUILD_DIR}/config.h fmtullong.o: ${BUILD_DIR}/config.h fmtulong.o: ${BUILD_DIR}/config.h fmtumax.o: ${BUILD_DIR}/config.h +fpurge.o: ${BUILD_DIR}/config.h getcwd.o: ${BUILD_DIR}/config.h getenv.o: ${BUILD_DIR}/config.h inet_aton.o: ${BUILD_DIR}/config.h diff --git a/lib/sh/zgetline.c b/lib/sh/zgetline.c new file mode 100644 index 000000000..5ef63927f --- /dev/null +++ b/lib/sh/zgetline.c @@ -0,0 +1,109 @@ +/* Copyright (C) 2008 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. + + Bash is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2, or (at your option) any later + version. + + Bash is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License along + with Bash; see the file COPYING. If not, write to the Free Software + Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + +#include + +#include + +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include +#include "xmalloc.h" + +#if !defined (errno) +extern int errno; +#endif + +/* Initial memory allocation for automatic growing buffer in zreadlinec */ +#define GET_LINE_INITIAL_ALLOCATION 16 + +/* Derived from GNU libc's getline. + The behavior is almost the same as getline. See man getline. + The differences are + (1) using file descriptor instead of FILE *, + (2) the order of arguments; the file descriptor comes the first, and + (3) the addtion of thired argument, UNBUFFERED_READ; this argument + controls whether get_line uses buffering or not to get a byte data + from FD. get_line uses zreadc if UNBUFFERED_READ is zero; and + uses zread if UNBUFFERED_READ is non-zero. + + Returns number of bytes read or -1 on error. */ + +ssize_t +zgetline (fd, lineptr, n, unbuffered_read) + int fd; + char **lineptr; + size_t *n; + int unbuffered_read; +{ + int nr, retval; + char *line, c; + + if (lineptr == 0 || n == 0 || (*lineptr == 0 && *n != 0)) + return -1; + + nr = 0; + line = *lineptr; + + while (1) + { + retval = unbuffered_read ? zread (fd, &c, 1) : zreadc(fd, &c); + + if (retval <= 0) + { + line[nr] = '\0'; + break; + } + + if (nr + 2 >= *n) + { + size_t new_size; + + new_size = (*n == 0) ? GET_LINE_INITIAL_ALLOCATION : *n * 2; + line = xrealloc (*lineptr, new_size); + + if (line) + { + *lineptr = line; + *n = new_size; + } + else + { + if (*n > 0) + { + (*lineptr)[*n - 1] = '\0'; + nr = *n - 2; + } + break; + } + } + + line[nr] = c; + nr++; + + if (c == '\n') + { + line[nr] = '\0'; + break; + } + } + + return nr - 1; +}