Imported from ../bash-2.01.1.tar.gz.
This commit is contained in:
parent
d166f04881
commit
e8ce775db8
50 changed files with 2170 additions and 1502 deletions
103
CHANGES
103
CHANGES
|
@ -1,3 +1,106 @@
|
|||
This document details the changes between this version, bash-2.01.1-release,
|
||||
and the previous version, bash-2.01-release.
|
||||
|
||||
1. Changes to Bash
|
||||
|
||||
a. The select command was fixed to check the validity of the user's
|
||||
input more strenuously.
|
||||
|
||||
b. A bug was fixed that prevented `time' from timing commands correctly
|
||||
when supplied as an argument to `bash -c'.
|
||||
|
||||
c. A fix was made to the mail checking code to keep from adding the same
|
||||
mail file to the list of files to check multiple times when parsing
|
||||
$MAILPATH.
|
||||
|
||||
d. Fixed an off-by-one error in the tilde expansion library.
|
||||
|
||||
e. When using the compound array assignment syntax, the old value of
|
||||
the array is cleared before assigning the new value.
|
||||
|
||||
f. Fixed a bug that could cause a core dump when a trap handler was reset
|
||||
to the default in the trap command associated with that signal.
|
||||
|
||||
g. Fixed a bug in the locale code that occurred when assigning a value
|
||||
to LC_ALL.
|
||||
|
||||
h. A change was made to the parser so that words of the form xxx=(...)
|
||||
are not considered compound assignment statements unless there are
|
||||
characters before the `='.
|
||||
|
||||
i. A fix was made to the command tracing code to correctly quote each
|
||||
word of output.
|
||||
|
||||
j. Some changes were made to the bash-specific autoconf tests to make them
|
||||
more portable.
|
||||
|
||||
k. Completion of words with globbing characters now correctly quotes the
|
||||
result.
|
||||
|
||||
l. The directory /var/spool/mail is now preferred to /usr/spool/mail when
|
||||
configure is deciding on the default mail directory.
|
||||
|
||||
m. The brace completion code was fixed to not quote the `{' and `}'.
|
||||
|
||||
n. Some fixes were made to make $RANDOM more random in subshells.
|
||||
|
||||
o. System-specific changes were made to configure for: SVR4.2
|
||||
|
||||
p. Changes were made so that completion of words containing globbing chars
|
||||
substitutes the result only if a single filename was matched.
|
||||
|
||||
q. The window size is now recomputed after a job is stopped with SIGTSTP if
|
||||
the user has set `checkwinsize' with `shopt'.
|
||||
|
||||
r. When doing substring expansion, out-of-range substring specifiers now
|
||||
cause nothing to be substituted rather than an expansion error.
|
||||
|
||||
s. A fix was made so that you can no longer trap `SIGEXIT' or `SIGDEBUG' --
|
||||
only `EXIT' and `DEBUG' are accepted.
|
||||
|
||||
t. The display of trapped signals now uses the signal number if signals
|
||||
for which bash does not know the name are trapped.
|
||||
|
||||
u. A fix was made so that `bash -r' does not turn on restricted mode until
|
||||
after the startup files are executed.
|
||||
|
||||
v. A bug was fixed that occasionally caused a core dump when a variable
|
||||
found in the temporary environment of export/declare/readonly had a
|
||||
null value.
|
||||
|
||||
w. A bug that occasionally caused unallocated memory to be passed to free()
|
||||
when doing arithmetic substitution was fixed.
|
||||
|
||||
x. A bug that caused a buffer overrun when expanding a prompt string
|
||||
containing `\w' and ${#PWD} exceeded PATH_MAX was fixed.
|
||||
|
||||
y. A problem with the completion code that occasionally caused it to
|
||||
refer to a character before the beginning of the readline line buffer
|
||||
was fixed.
|
||||
|
||||
z. A bug was fixed so that the `read' builtin restarts reads when
|
||||
interrupted by signals other than SIGINT.
|
||||
|
||||
aa. Fixed a bug that caused a command to be freed twice when there was
|
||||
an evaluation error in the `eval' command.
|
||||
|
||||
2. Changes to Readline
|
||||
|
||||
a. Added a missing `extern' to a declaration in readline.h that kept
|
||||
readline from compiling cleanly on some systems.
|
||||
|
||||
b. The history file is now opened with mode 0600 when it is written for
|
||||
better security.
|
||||
|
||||
c. Changes were made to the SIGWINCH handling code so that prompt redisplay
|
||||
is done better.
|
||||
|
||||
d. ^G now interrupts incremental searches correctly.
|
||||
|
||||
e. A bug that caused a core dump when the set of characters to be quoted
|
||||
when completing words was empty was fixed.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
This document details the changes between this version, bash-2.01-release,
|
||||
and the previous version, bash-2.01-beta2.
|
||||
|
||||
|
|
35
aclocal.m4
vendored
35
aclocal.m4
vendored
|
@ -197,8 +197,26 @@ fi
|
|||
dnl
|
||||
dnl Check for sys_siglist[] or _sys_siglist[]
|
||||
dnl
|
||||
AC_DEFUN(BASH_DECL_UNDER_SYS_SIGLIST,
|
||||
[AC_MSG_CHECKING([for _sys_siglist in signal.h or unistd.h])
|
||||
AC_CACHE_VAL(bash_cv_decl_under_sys_siglist,
|
||||
[AC_TRY_COMPILE([
|
||||
#include <sys/types.h>
|
||||
#include <signal.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif], [ char *msg = _sys_siglist[2]; ],
|
||||
bash_cv_decl_under_sys_siglist=yes, bash_cv_decl_under_sys_siglist=no,
|
||||
AC_MSG_ERROR(cannot check for _sys_siglist[] if cross compiling))])dnl
|
||||
AC_MSG_RESULT($bash_cv_decl_under_sys_siglist)
|
||||
if test $bash_cv_decl_under_sys_siglist = yes; then
|
||||
AC_DEFINE(UNDER_SYS_SIGLIST_DECLARED)
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN(BASH_UNDER_SYS_SIGLIST,
|
||||
[AC_MSG_CHECKING([for _sys_siglist in system C library])
|
||||
[AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST])
|
||||
AC_MSG_CHECKING([for _sys_siglist in system C library])
|
||||
AC_CACHE_VAL(bash_cv_under_sys_siglist,
|
||||
[AC_TRY_RUN([
|
||||
#include <sys/types.h>
|
||||
|
@ -206,12 +224,12 @@ AC_CACHE_VAL(bash_cv_under_sys_siglist,
|
|||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#ifndef _sys_siglist
|
||||
#ifndef UNDER_SYS_SIGLIST_DECLARED
|
||||
extern char *_sys_siglist[];
|
||||
#endif
|
||||
main()
|
||||
{
|
||||
char *msg = _sys_siglist[2];
|
||||
char *msg = (char *)_sys_siglist[2];
|
||||
exit(msg == 0);
|
||||
}],
|
||||
bash_cv_under_sys_siglist=yes, bash_cv_under_sys_siglist=no,
|
||||
|
@ -434,7 +452,7 @@ typedef int (*_bashfunc)();
|
|||
main()
|
||||
{
|
||||
_bashfunc pf;
|
||||
pf = printf;
|
||||
pf = (_bashfunc) printf;
|
||||
exit(pf == 0);
|
||||
}
|
||||
],bash_cv_printf_declared=yes, bash_cv_printf_declared=no,
|
||||
|
@ -911,7 +929,10 @@ AC_DEFUN(BASH_CHECK_GETPW_FUNCS,
|
|||
AC_CACHE_VAL(bash_cv_can_redecl_getpw,
|
||||
[AC_TRY_COMPILE([#include <sys/types.h>
|
||||
#include <pwd.h>
|
||||
extern struct passwd *getpwent();], [struct passwd *z; z = getpwent();],
|
||||
extern struct passwd *getpwent();
|
||||
extern struct passwd *getpwuid();
|
||||
extern struct passwd *getpwnam();],
|
||||
[struct passwd *z; z = getpwent(); z = getpwuid(0); z = getpwnam("root");],
|
||||
bash_cv_can_redecl_getpw=yes,bash_cv_can_redecl_getpw=no)])
|
||||
AC_MSG_RESULT($bash_cv_can_redecl_getpw)
|
||||
if test $bash_cv_can_redecl_getpw = no; then
|
||||
|
@ -994,10 +1015,10 @@ AC_CACHE_VAL(bash_cv_mail_dir,
|
|||
bash_cv_mail_dir=/var/mail
|
||||
elif test -d /usr/mail; then
|
||||
bash_cv_mail_dir=/usr/mail
|
||||
elif test -d /usr/spool/mail; then
|
||||
bash_cv_mail_dir=/usr/spool/mail
|
||||
elif test -d /var/spool/mail; then
|
||||
bash_cv_mail_dir=/var/spool/mail
|
||||
elif test -d /usr/spool/mail; then
|
||||
bash_cv_mail_dir=/usr/spool/mail
|
||||
else
|
||||
bash_cv_mail_dir=unknown
|
||||
fi
|
||||
|
|
14
bashline.c
14
bashline.c
|
@ -700,8 +700,8 @@ attempt_shell_completion (text, start, end)
|
|||
|
||||
/* Check that we haven't incorrectly flagged a closed command substitution
|
||||
as indicating we're in a command position. */
|
||||
if (in_command_position && rl_line_buffer[ti] == '`' && *text != '`' &&
|
||||
unclosed_pair (rl_line_buffer, 0, "`") == 0)
|
||||
if (in_command_position && ti >= 0 && rl_line_buffer[ti] == '`' &&
|
||||
*text != '`' && unclosed_pair (rl_line_buffer, 0, "`") == 0)
|
||||
in_command_position = 0;
|
||||
|
||||
/* Special handling for command substitution. If *TEXT is a backquote,
|
||||
|
@ -744,7 +744,16 @@ attempt_shell_completion (text, start, end)
|
|||
/* This could be a globbing pattern, so try to expand it using pathname
|
||||
expansion. */
|
||||
if (!matches && glob_pattern_p (text))
|
||||
{
|
||||
matches = completion_matches (text, glob_complete_word);
|
||||
/* A glob expression that matches more than one filename is problematic.
|
||||
If we match more than one filename, punt. */
|
||||
if (matches && matches[1])
|
||||
{
|
||||
free_array (matches);
|
||||
matches = (char **)0;
|
||||
}
|
||||
}
|
||||
|
||||
return (matches);
|
||||
}
|
||||
|
@ -1801,6 +1810,7 @@ glob_complete_word (text, state)
|
|||
|
||||
if (state == 0)
|
||||
{
|
||||
rl_filename_completion_desired = 1;
|
||||
if (matches)
|
||||
free (matches);
|
||||
matches = shell_glob_filename (text);
|
||||
|
|
47
bracecomp.c
47
bracecomp.c
|
@ -36,6 +36,8 @@
|
|||
#include "shell.h"
|
||||
#include <readline/readline.h>
|
||||
|
||||
extern char *backslash_quote ();
|
||||
|
||||
/* Find greatest common prefix of two strings. */
|
||||
static int
|
||||
string_gcd (s1, s2)
|
||||
|
@ -61,20 +63,19 @@ really_munge_braces (array, real_start, real_end, gcd_zero)
|
|||
int real_start, real_end, gcd_zero;
|
||||
{
|
||||
int start, end, gcd;
|
||||
char *result, *subterm;
|
||||
int result_size, flag;
|
||||
char *result, *subterm, *x;
|
||||
int result_size, flag, tlen;
|
||||
|
||||
flag = 0;
|
||||
|
||||
if (real_start == real_end)
|
||||
{
|
||||
if (array[real_start])
|
||||
return (savestring (array[real_start] + gcd_zero));
|
||||
else
|
||||
return (savestring (array[0]));
|
||||
x = array[real_start] ? backslash_quote (array[real_start] + gcd_zero)
|
||||
: backslash_quote (array[0]);
|
||||
return x;
|
||||
}
|
||||
|
||||
result = xmalloc (result_size = 1);
|
||||
result = xmalloc (result_size = 16);
|
||||
*result = '\0';
|
||||
|
||||
for (start = real_start; start < real_end; start = end + 1)
|
||||
|
@ -103,15 +104,29 @@ really_munge_braces (array, real_start, real_end, gcd_zero)
|
|||
flag++;
|
||||
}
|
||||
|
||||
/* Make sure we backslash quote every substring we insert into the
|
||||
resultant brace expression. This is so the default filename
|
||||
quoting function won't inappropriately quote the braces. */
|
||||
if (start == end)
|
||||
subterm = savestring (array[start] + gcd_zero);
|
||||
{
|
||||
x = savestring (array[start] + gcd_zero);
|
||||
subterm = backslash_quote (x);
|
||||
free (x);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* If there is more than one element in the subarray,
|
||||
insert the prefix and an opening brace. */
|
||||
result_size += gcd - gcd_zero + 1;
|
||||
insert the (quoted) prefix and an opening brace. */
|
||||
tlen = gcd - gcd_zero;
|
||||
x = xmalloc (tlen + 1);
|
||||
strncpy (x, array[start] + gcd_zero, tlen);
|
||||
x[tlen] = '\0';
|
||||
subterm = backslash_quote (x);
|
||||
free (x);
|
||||
result_size += strlen (subterm) + 1;
|
||||
result = xrealloc (result, result_size);
|
||||
strncat (result, array[start] + gcd_zero, gcd - gcd_zero);
|
||||
strcat (result, subterm);
|
||||
free (subterm);
|
||||
strcat (result, "{");
|
||||
subterm = really_munge_braces (array, start, end + 1, gcd);
|
||||
subterm[strlen (subterm) - 1] = '}';
|
||||
|
@ -146,25 +161,35 @@ hack_braces_completion (names)
|
|||
names[0] = temp;
|
||||
}
|
||||
|
||||
/* We handle quoting ourselves within hack_braces_completion, so we turn off
|
||||
rl_filename_quoting_desired and rl_filename_quoting_function. */
|
||||
void
|
||||
bash_brace_completion ()
|
||||
{
|
||||
Function *orig_ignore_func;
|
||||
Function *orig_entry_func;
|
||||
CPFunction *orig_quoting_func;
|
||||
CPPFunction *orig_attempt_func;
|
||||
int orig_quoting_desired;
|
||||
|
||||
orig_ignore_func = rl_ignore_some_completions_function;
|
||||
orig_attempt_func = rl_attempted_completion_function;
|
||||
orig_entry_func = rl_completion_entry_function;
|
||||
orig_quoting_func = rl_filename_quoting_function;
|
||||
orig_quoting_desired = rl_filename_quoting_desired;
|
||||
|
||||
rl_completion_entry_function = (Function *) filename_completion_function;
|
||||
rl_attempted_completion_function = NULL;
|
||||
rl_ignore_some_completions_function = (Function *) hack_braces_completion;
|
||||
rl_filename_quoting_function = NULL;
|
||||
rl_filename_quoting_desired = 0;
|
||||
|
||||
rl_complete_internal (TAB);
|
||||
|
||||
rl_ignore_some_completions_function = orig_ignore_func;
|
||||
rl_attempted_completion_function = orig_attempt_func;
|
||||
rl_completion_entry_function = orig_entry_func;
|
||||
rl_filename_quoting_function = orig_quoting_func;
|
||||
rl_filename_quoting_desired = orig_quoting_desired;
|
||||
}
|
||||
#endif /* BRACE_EXPANSION && READLINE */
|
||||
|
|
|
@ -97,8 +97,11 @@ mkbuiltins: $(srcdir)/mkbuiltins.c ../config.h
|
|||
common.o: common.c
|
||||
bashgetopt.o: bashgetopt.c
|
||||
getopt.o: getopt.c
|
||||
evalstring.o: evalstring.c
|
||||
evalfile.o: evalfile.c
|
||||
|
||||
ulimit.o: ulimit.def pipesize.h
|
||||
ulimit.o: ulimit.def
|
||||
ulimit.o: pipesize.h
|
||||
|
||||
pipesize.h: psize.aux
|
||||
$(SHELL) $(srcdir)/psize.sh > pipesize.h
|
||||
|
@ -149,6 +152,7 @@ return.o: return.def
|
|||
set.o: set.def
|
||||
setattr.o: setattr.def
|
||||
shift.o: shift.def
|
||||
shopt.o: shopt.def
|
||||
source.o: source.def
|
||||
suspend.o: suspend.def
|
||||
test.o: test.def
|
||||
|
|
|
@ -369,8 +369,10 @@ declare_internal (list, local_var)
|
|||
assign_array_var_from_string (var, value);
|
||||
else
|
||||
#endif
|
||||
/* This essentially duplicates the internals of bind_variable() */
|
||||
if (offset)
|
||||
{
|
||||
var->attributes &= ~att_invisible;
|
||||
t = make_variable_value (var, value);
|
||||
FREE (var->value);
|
||||
var->value = t;
|
||||
|
|
|
@ -160,7 +160,9 @@ parse_and_execute (string, from_file, flags)
|
|||
}
|
||||
else
|
||||
{
|
||||
dispose_command (command); /* XXX */
|
||||
#if 0
|
||||
dispose_command (command); /* pe_dispose does this */
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -192,7 +194,8 @@ parse_and_execute (string, from_file, flags)
|
|||
#if defined (ONESHOT)
|
||||
if (startup_state == 2 && *bash_input.location.string == '\0' &&
|
||||
command->type == cm_simple && !command->redirects &&
|
||||
!command->value.Simple->redirects)
|
||||
!command->value.Simple->redirects &&
|
||||
((command->flags & CMD_TIME_PIPELINE) == 0))
|
||||
{
|
||||
command->flags |= CMD_NO_FORK;
|
||||
command->value.Simple->flags |= CMD_NO_FORK;
|
||||
|
|
|
@ -46,6 +46,8 @@ $END
|
|||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include "../shell.h"
|
||||
#include "common.h"
|
||||
#include "bashgetopt.h"
|
||||
|
@ -55,6 +57,10 @@ $END
|
|||
#include <readline/readline.h>
|
||||
#endif
|
||||
|
||||
#if !defined(errno)
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#define issep(c) (strchr (ifs_chars, (c)))
|
||||
|
||||
extern int interrupt_immediately;
|
||||
|
@ -181,7 +187,10 @@ read_builtin (list)
|
|||
}
|
||||
else
|
||||
#endif
|
||||
if (read (0, &c, 1) != 1)
|
||||
|
||||
while (((retval = read (0, &c, 1)) < 0) && errno == EINTR)
|
||||
;
|
||||
if (retval <= 0)
|
||||
{
|
||||
eof = 1;
|
||||
break;
|
||||
|
|
|
@ -326,7 +326,7 @@ show_var_attributes (var, pattr, nodefs)
|
|||
printf ("%s\n", named_function_string (var->name, function_cell (var), 1));
|
||||
else
|
||||
{
|
||||
x = double_quote (value_cell (var));
|
||||
x = double_quote (value_cell (var) ? value_cell (var) : "");
|
||||
printf ("%s=%s\n", var->name, x);
|
||||
free (x);
|
||||
}
|
||||
|
@ -366,7 +366,7 @@ set_var_attribute (name, attribute, undo)
|
|||
{
|
||||
if (tv = find_tempenv_variable (name))
|
||||
{
|
||||
var = bind_variable (tv->name, tv->value);
|
||||
var = bind_variable (tv->name, tv->value ? tv->value : "");
|
||||
dispose_variable (tv);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -191,7 +191,7 @@ static void
|
|||
showtrap (i)
|
||||
int i;
|
||||
{
|
||||
char *t, *p;
|
||||
char *t, *p, *sn;
|
||||
|
||||
p = trap_list[i];
|
||||
|
||||
|
@ -199,9 +199,15 @@ showtrap (i)
|
|||
return;
|
||||
|
||||
t = (p == (char *)IGNORE_SIG) ? (char *)NULL : single_quote (p);
|
||||
printf ("trap -- %s %s\n", t ? t : "''", signal_name (i));
|
||||
if (t)
|
||||
free (t);
|
||||
sn = signal_name (i);
|
||||
/* Make sure that signals whose names are unknown (for whatever reason)
|
||||
are printed as signal numbers. */
|
||||
if (STREQN (sn, "SIGJUNK", 7) || STREQN (sn, "unknown", 7))
|
||||
printf ("trap -- %s %d\n", t ? t : "''", i);
|
||||
else
|
||||
printf ("trap -- %s %s\n", t ? t : "''", sn);
|
||||
|
||||
FREE (t);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -215,6 +215,9 @@
|
|||
/* Define if `sys_siglist' is declared by <signal.h>. */
|
||||
#undef SYS_SIGLIST_DECLARED
|
||||
|
||||
/* Define if `_sys_siglist' is declared by <signal.h> or <unistd.h>. */
|
||||
#undef UNDER_SYS_SIGLIST_DECLARED
|
||||
|
||||
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||
#undef uid_t
|
||||
|
||||
|
@ -515,4 +518,3 @@
|
|||
#include "config.h.bot"
|
||||
|
||||
#endif /* _CONFIG_H_ */
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ dnl
|
|||
dnl Process this file with autoconf to produce a configure script.
|
||||
dnl checks for version info
|
||||
|
||||
AC_REVISION([for Bash 2.01, version 1.26, from autoconf version] AC_ACVERSION)dnl
|
||||
AC_REVISION([for Bash 2.01, version 1.28, from autoconf version] AC_ACVERSION)dnl
|
||||
|
||||
AC_INIT(shell.h)
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
@ -38,7 +38,7 @@ alpha-*) opt_gnu_malloc=no ;; # alpha running osf/1 or linux
|
|||
*-osf1*) opt_gnu_malloc=no ;; # other osf/1 machines
|
||||
sparc-svr4*) opt_gnu_malloc=no ;; # sparc SVR4, SVR4.2
|
||||
sparc-netbsd*) opt_gnu_malloc=no ;; # needs 8-byte alignment
|
||||
*-sgi-irix6*) opt_gnu_malloc=no ;; # needs 8-byte alignment
|
||||
sgi-irix6*) opt_gnu_malloc=no ;; # needs 8-byte alignment
|
||||
sparc-linux*) opt_gnu_malloc=no ;; # sparc running linux; requires ELF
|
||||
*-freebsd*) opt_gnu_malloc=no ;; # they claim it's better
|
||||
*-aix*) opt_gnu_malloc=no ;; # AIX machines
|
||||
|
@ -46,7 +46,7 @@ sparc-linux*) opt_gnu_malloc=no ;; # sparc running linux; requires ELF
|
|||
*-dgux*) opt_gnu_malloc=no ;; # DG/UX machines
|
||||
*-qnx*) opt_gnu_malloc=no ;; # QNX 4.2
|
||||
*-machten4) opt_gnu_malloc=no ;; # MachTen 4.x
|
||||
*-bsdi2.1) opt_gnu_malloc=no ; : ${CC:=shlicc2} ;; # for loadable builtins
|
||||
*-bsdi2.1|*-bsdi3.0) opt_gnu_malloc=no ; : ${CC:=shlicc2} ;; # for loadable builtins
|
||||
esac
|
||||
|
||||
dnl arguments to configure
|
||||
|
@ -456,7 +456,7 @@ dnl
|
|||
dnl this should really go away someday
|
||||
|
||||
case "$host_os" in
|
||||
sysv4.2) AC_DEFINE(SVR4_2)
|
||||
sysv4.2*) AC_DEFINE(SVR4_2)
|
||||
AC_DEFINE(SVR4) ;;
|
||||
sysv4*) AC_DEFINE(SVR4) ;;
|
||||
hpux*) LOCAL_CFLAGS=-DHPUX ;;
|
||||
|
|
|
@ -142,7 +142,8 @@ maintainer-clean: clean
|
|||
|
||||
installdirs:
|
||||
-test -d $(man1dir) || $(SHELL) ${MKDIRS} $(man1dir)
|
||||
-test -d $(man3dir) || $(SHELL) ${MKDIRS} $(man3dir)
|
||||
# uncomment the next line to create the directory for the readline man page
|
||||
# -test -d $(man3dir) || $(SHELL) ${MKDIRS} $(man3dir)
|
||||
-test -d $(infodir) || $(SHELL) ${MKDIRS} $(infodir)
|
||||
|
||||
install: info installdirs
|
||||
|
|
362
doc/bashref.info
362
doc/bashref.info
|
@ -1,5 +1,10 @@
|
|||
This is Info file bashref.info, produced by Makeinfo-1.64 from the
|
||||
input file ./bashref.texi.
|
||||
This is Info file bashref.info, produced by Makeinfo version 1.67 from
|
||||
the input file /usr/homes/chet/src/bash/bash-2.01.1/doc/bashref.texi.
|
||||
|
||||
INFO-DIR-SECTION Utilities
|
||||
START-INFO-DIR-ENTRY
|
||||
* Bash: (bash). GNU Bourne-Again SHell
|
||||
END-INFO-DIR-ENTRY
|
||||
|
||||
This text is a brief description of the features that are present in
|
||||
the Bash shell.
|
||||
|
@ -2412,7 +2417,7 @@ the `alias' and `unalias' builtin commands.
|
|||
has an alias. If so, that word is replaced by the text of the alias.
|
||||
The alias name and the replacement text may contain any valid shell
|
||||
input, including shell metacharacters, with the exception that the
|
||||
alias name may not contain =. The first word of the replacement text
|
||||
alias name may not contain <=>. The first word of the replacement text
|
||||
is tested for aliases, but a word that is identical to an alias being
|
||||
expanded is not expanded a second time. This means that one may alias
|
||||
`ls' to `"ls -F"', for instance, and Bash does not try to recursively
|
||||
|
@ -4464,7 +4469,7 @@ history list.
|
|||
|
||||
`!'
|
||||
Start a history substitution, except when followed by a space, tab,
|
||||
the end of the line, = or (.
|
||||
the end of the line, <=> or <(>.
|
||||
|
||||
`!N'
|
||||
Refer to command line N.
|
||||
|
@ -4610,21 +4615,22 @@ Introduction to Line Editing
|
|||
The following paragraphs describe the notation used to represent
|
||||
keystrokes.
|
||||
|
||||
The text C-k is read as `Control-K' and describes the character
|
||||
produced when the k key is pressed while the Control key is depressed.
|
||||
The text <C-k> is read as `Control-K' and describes the character
|
||||
produced when the <k> key is pressed while the Control key is depressed.
|
||||
|
||||
The text M-k is read as `Meta-K' and describes the character
|
||||
produced when the meta key (if you have one) is depressed, and the k
|
||||
The text <M-k> is read as `Meta-K' and describes the character
|
||||
produced when the meta key (if you have one) is depressed, and the <k>
|
||||
key is pressed. If you do not have a meta key, the identical keystroke
|
||||
can be generated by typing ESC first, and then typing k. Either
|
||||
process is known as "metafying" the k key.
|
||||
can be generated by typing <ESC> first, and then typing <k>. Either
|
||||
process is known as "metafying" the <k> key.
|
||||
|
||||
The text M-C-k is read as `Meta-Control-k' and describes the
|
||||
character produced by "metafying" C-k.
|
||||
The text <M-C-k> is read as `Meta-Control-k' and describes the
|
||||
character produced by "metafying" <C-k>.
|
||||
|
||||
In addition, several keys have their own names. Specifically, DEL,
|
||||
ESC, LFD, SPC, RET, and TAB all stand for themselves when seen in this
|
||||
text, or in an init file (*note Readline Init File::.).
|
||||
In addition, several keys have their own names. Specifically,
|
||||
<DEL>, <ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves
|
||||
when seen in this text, or in an init file (*note Readline Init
|
||||
File::.).
|
||||
|
||||
|
||||
File: bashref.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing
|
||||
|
@ -4639,9 +4645,9 @@ as you type it in, allowing you to just fix your typo, and not forcing
|
|||
you to retype the majority of the line. Using these editing commands,
|
||||
you move the cursor to the place that needs correction, and delete or
|
||||
insert the text of the corrections. Then, when you are satisfied with
|
||||
the line, you simply press RETURN. You do not have to be at the end of
|
||||
the line to press RETURN; the entire line is accepted regardless of the
|
||||
location of the cursor within the line.
|
||||
the line, you simply press <RETURN>. You do not have to be at the end
|
||||
of the line to press <RETURN>; the entire line is accepted regardless
|
||||
of the location of the cursor within the line.
|
||||
|
||||
* Menu:
|
||||
|
||||
|
@ -4664,9 +4670,9 @@ erase character to back up and delete the mistyped character.
|
|||
|
||||
Sometimes you may miss typing a character that you wanted to type,
|
||||
and not notice your error until you have typed several other
|
||||
characters. In that case, you can type C-b to move the cursor to the
|
||||
characters. In that case, you can type <C-b> to move the cursor to the
|
||||
left, and then correct your mistake. Afterwards, you can move the
|
||||
cursor to the right with C-f.
|
||||
cursor to the right with <C-f>.
|
||||
|
||||
When you add text in the middle of a line, you will notice that
|
||||
characters to the right of the cursor are `pushed over' to make room
|
||||
|
@ -4676,22 +4682,22 @@ back' to fill in the blank space created by the removal of the text. A
|
|||
list of the basic bare essentials for editing the text of an input line
|
||||
follows.
|
||||
|
||||
C-b
|
||||
<C-b>
|
||||
Move back one character.
|
||||
|
||||
C-f
|
||||
<C-f>
|
||||
Move forward one character.
|
||||
|
||||
DEL
|
||||
<DEL>
|
||||
Delete the character to the left of the cursor.
|
||||
|
||||
C-d
|
||||
<C-d>
|
||||
Delete the character underneath the cursor.
|
||||
|
||||
Printing characters
|
||||
Insert the character into the line at the cursor.
|
||||
|
||||
C-_
|
||||
<C-_>
|
||||
Undo the last thing that you did. You can undo all the way back
|
||||
to an empty line.
|
||||
|
||||
|
@ -4703,28 +4709,28 @@ Readline Movement Commands
|
|||
|
||||
The above table describes the most basic possible keystrokes that
|
||||
you need in order to do editing of the input line. For your
|
||||
convenience, many other commands have been added in addition to C-b,
|
||||
C-f, C-d, and DEL. Here are some commands for moving more rapidly
|
||||
convenience, many other commands have been added in addition to <C-b>,
|
||||
<C-f>, <C-d>, and <DEL>. Here are some commands for moving more rapidly
|
||||
about the line.
|
||||
|
||||
C-a
|
||||
<C-a>
|
||||
Move to the start of the line.
|
||||
|
||||
C-e
|
||||
<C-e>
|
||||
Move to the end of the line.
|
||||
|
||||
M-f
|
||||
<M-f>
|
||||
Move forward a word.
|
||||
|
||||
M-b
|
||||
<M-b>
|
||||
Move backward a word.
|
||||
|
||||
C-l
|
||||
<C-l>
|
||||
Clear the screen, reprinting the current line at the top.
|
||||
|
||||
Notice how C-f moves forward a character, while M-f moves forward a
|
||||
word. It is a loose convention that control keystrokes operate on
|
||||
characters while meta keystrokes operate on words.
|
||||
Notice how <C-f> moves forward a character, while <M-f> moves
|
||||
forward a word. It is a loose convention that control keystrokes
|
||||
operate on characters while meta keystrokes operate on words.
|
||||
|
||||
|
||||
File: bashref.info, Node: Readline Killing Commands, Next: Readline Arguments, Prev: Readline Movement Commands, Up: Readline Interaction
|
||||
|
@ -4746,32 +4752,32 @@ available to be yanked back later, when you are typing another line.
|
|||
|
||||
Here is the list of commands for killing text.
|
||||
|
||||
C-k
|
||||
<C-k>
|
||||
Kill the text from the current cursor position to the end of the
|
||||
line.
|
||||
|
||||
M-d
|
||||
<M-d>
|
||||
Kill from the cursor to the end of the current word, or if between
|
||||
words, to the end of the next word.
|
||||
|
||||
M-DEL
|
||||
<M-DEL>
|
||||
Kill from the cursor the start of the previous word, or if between
|
||||
words, to the start of the previous word.
|
||||
|
||||
C-w
|
||||
<C-w>
|
||||
Kill from the cursor to the previous whitespace. This is
|
||||
different than M-DEL because the word boundaries differ.
|
||||
different than <M-DEL> because the word boundaries differ.
|
||||
|
||||
And, here is how to "yank" the text back into the line. Yanking
|
||||
means to copy the most-recently-killed text from the kill buffer.
|
||||
|
||||
C-y
|
||||
<C-y>
|
||||
Yank the most recently killed text back into the buffer at the
|
||||
cursor.
|
||||
|
||||
M-y
|
||||
<M-y>
|
||||
Rotate the kill-ring, and yank the new top. You can only do this
|
||||
if the prior command is C-y or M-y.
|
||||
if the prior command is <C-y> or <M-y>.
|
||||
|
||||
|
||||
File: bashref.info, Node: Readline Arguments, Next: Searching, Prev: Readline Killing Commands, Up: Readline Interaction
|
||||
|
@ -4788,10 +4794,10 @@ start of the line, you might type `M-- C-k'.
|
|||
|
||||
The general way to pass numeric arguments to a command is to type
|
||||
meta digits before the command. If the first `digit' you type is a
|
||||
minus sign (-), then the sign of the argument will be negative. Once
|
||||
minus sign (<->), then the sign of the argument will be negative. Once
|
||||
you have typed one meta digit to get the argument started, you can type
|
||||
the remainder of the digits, and then the command. For example, to give
|
||||
the C-d command an argument of 10, you could type `M-1 0 C-d'.
|
||||
the <C-d> command an argument of 10, you could type `M-1 0 C-d'.
|
||||
|
||||
|
||||
File: bashref.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction
|
||||
|
@ -4897,7 +4903,7 @@ Variable Settings
|
|||
`convert-meta'
|
||||
If set to `on', Readline will convert characters with the
|
||||
eigth bit set to an ASCII key sequence by stripping the eigth
|
||||
bit and prepending an ESC character, converting them to a
|
||||
bit and prepending an <ESC> character, converting them to a
|
||||
meta-prefixed key sequence. The default value is `on'.
|
||||
|
||||
`disable-completion'
|
||||
|
@ -5011,23 +5017,23 @@ Key Bindings
|
|||
The following escape sequences are available when specifying
|
||||
key sequences:
|
||||
|
||||
``\C-''
|
||||
`\C-'
|
||||
control prefix
|
||||
|
||||
``\M-''
|
||||
`\M-'
|
||||
meta prefix
|
||||
|
||||
``\e''
|
||||
`\e'
|
||||
an escape character
|
||||
|
||||
``\\''
|
||||
`\\'
|
||||
backslash
|
||||
|
||||
``\"''
|
||||
"
|
||||
`\"'
|
||||
<">
|
||||
|
||||
``\'''
|
||||
'
|
||||
`\''
|
||||
<'>
|
||||
|
||||
When entering the text of a macro, single or double quotes
|
||||
should be used to indicate a macro definition. Unquoted text
|
||||
|
@ -5331,7 +5337,7 @@ Commands For Changing Text
|
|||
|
||||
`quoted-insert (C-q, C-v)'
|
||||
Add the next character that you type to the line verbatim. This is
|
||||
how to insert key sequences like C-q, for example.
|
||||
how to insert key sequences like <C-q>, for example.
|
||||
|
||||
`tab-insert (M-TAB)'
|
||||
Insert a tab character.
|
||||
|
@ -5432,7 +5438,7 @@ Specifying Numeric Arguments
|
|||
|
||||
`digit-argument (M-0, M-1, ... M--)'
|
||||
Add this digit to the argument already accumulating, or start a new
|
||||
argument. M- starts a negative argument.
|
||||
argument. <M-> starts a negative argument.
|
||||
|
||||
`universal-argument ()'
|
||||
This is another way to specify an argument. If this command is
|
||||
|
@ -5672,7 +5678,7 @@ modes, use the `set -o emacs' and `set -o vi' commands (*note The Set
|
|||
Builtin::.). The Readline default is `emacs' mode.
|
||||
|
||||
When you enter a line in `vi' mode, you are already placed in
|
||||
`insertion' mode, as if you had typed an `i'. Pressing ESC switches
|
||||
`insertion' mode, as if you had typed an `i'. Pressing <ESC> switches
|
||||
you into `command' mode, where you can edit the text of the line with
|
||||
the standard `vi' movement keys, move to previous history lines with
|
||||
`k' and subsequent lines with `j', and so forth.
|
||||
|
@ -6146,8 +6152,6 @@ Shell Reserved Words
|
|||
* Menu:
|
||||
|
||||
* !: Pipelines.
|
||||
* {: Command Grouping.
|
||||
* }: Command Grouping.
|
||||
* case: Conditional Constructs.
|
||||
* do: Looping Constructs.
|
||||
* done: Looping Constructs.
|
||||
|
@ -6164,6 +6168,8 @@ Shell Reserved Words
|
|||
* time: Pipelines.
|
||||
* until: Looping Constructs.
|
||||
* while: Looping Constructs.
|
||||
* {: Command Grouping.
|
||||
* }: Command Grouping.
|
||||
|
||||
|
||||
File: bashref.info, Node: Variable Index, Next: Function Index, Prev: Reserved Word Index, Up: Top
|
||||
|
@ -6285,7 +6291,7 @@ Function Index
|
|||
* copy-region-as-kill (): Commands For Killing.
|
||||
* delete-char (C-d): Commands For Text.
|
||||
* delete-horizontal-space (): Commands For Killing.
|
||||
* digit-argument (M-0, M-1, ... M-): Numeric Arguments.
|
||||
* digit-argument (M-0, M-1, ... M--): Numeric Arguments.
|
||||
* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands.
|
||||
* downcase-word (M-l): Commands For Text.
|
||||
* dump-functions (): Miscellaneous Commands.
|
||||
|
@ -6445,123 +6451,123 @@ Concept Index
|
|||
|
||||
|
||||
Tag Table:
|
||||
Node: Top1005
|
||||
Node: Introduction3109
|
||||
Node: What is Bash?3334
|
||||
Node: What is a shell?4418
|
||||
Node: Definitions6299
|
||||
Node: Basic Shell Features8960
|
||||
Node: Shell Syntax10481
|
||||
Node: Shell Operation10771
|
||||
Node: Quoting12005
|
||||
Node: Escape Character13040
|
||||
Node: Single Quotes13471
|
||||
Node: Double Quotes13800
|
||||
Node: ANSI-C Quoting14496
|
||||
Node: Locale Translation15228
|
||||
Node: Comments15649
|
||||
Node: Simple Commands16173
|
||||
Node: Pipelines16762
|
||||
Node: Lists17833
|
||||
Node: Looping Constructs19108
|
||||
Node: Conditional Constructs20285
|
||||
Node: Command Grouping22352
|
||||
Node: Shell Functions23738
|
||||
Node: Shell Parameters25511
|
||||
Node: Positional Parameters26834
|
||||
Node: Special Parameters27528
|
||||
Node: Shell Expansions30094
|
||||
Node: Shell Parameter Expansion32098
|
||||
Node: Command Substitution38106
|
||||
Node: Process Substitution39106
|
||||
Node: Word Splitting40012
|
||||
Node: Filename Expansion41464
|
||||
Node: Quote Removal43830
|
||||
Node: Redirections44116
|
||||
Node: Executing Commands49857
|
||||
Node: Command Search and Execution50312
|
||||
Node: Environment52046
|
||||
Node: Exit Status53682
|
||||
Node: Signals54699
|
||||
Node: Shell Scripts55910
|
||||
Node: Bourne Shell Features57779
|
||||
Node: Bourne Shell Builtins58449
|
||||
Node: Bourne Shell Variables66803
|
||||
Node: Other Bourne Shell Features68340
|
||||
Node: Major Differences From The Bourne Shell69097
|
||||
Node: Csh Features79457
|
||||
Node: Brace Expansion80375
|
||||
Node: Tilde Expansion81930
|
||||
Node: C Shell Builtins82562
|
||||
Node: C Shell Variables87118
|
||||
Node: Korn Shell Features87526
|
||||
Node: Korn Shell Constructs88254
|
||||
Node: Korn Shell Builtins89969
|
||||
Node: Korn Shell Variables92127
|
||||
Node: Aliases93686
|
||||
Node: Alias Builtins96150
|
||||
Node: Bash Features96766
|
||||
Node: Invoking Bash97757
|
||||
Node: Bash Startup Files101622
|
||||
Node: Is This Shell Interactive?105197
|
||||
Node: Bash Builtins106180
|
||||
Node: The Set Builtin122035
|
||||
Node: Bash Conditional Expressions127410
|
||||
Node: Bash Variables132061
|
||||
Node: Shell Arithmetic142095
|
||||
Node: Arithmetic Evaluation142563
|
||||
Node: Arithmetic Expansion144593
|
||||
Node: Arithmetic Builtins145397
|
||||
Node: Arrays145868
|
||||
Node: Printing a Prompt148895
|
||||
Node: The Restricted Shell150493
|
||||
Node: Bash POSIX Mode151723
|
||||
Node: Job Control155407
|
||||
Node: Job Control Basics155872
|
||||
Node: Job Control Builtins160015
|
||||
Node: Job Control Variables162938
|
||||
Node: Using History Interactively164085
|
||||
Node: Bash History Facilities164674
|
||||
Node: History Interaction167072
|
||||
Node: Event Designators169634
|
||||
Node: Word Designators170557
|
||||
Node: Modifiers171806
|
||||
Node: Command Line Editing173123
|
||||
Node: Introduction and Notation173783
|
||||
Node: Readline Interaction174791
|
||||
Node: Readline Bare Essentials175979
|
||||
Node: Readline Movement Commands177508
|
||||
Node: Readline Killing Commands178398
|
||||
Node: Readline Arguments180100
|
||||
Node: Searching181073
|
||||
Node: Readline Init File182709
|
||||
Node: Readline Init File Syntax183765
|
||||
Node: Conditional Init Constructs191554
|
||||
Node: Sample Init File193835
|
||||
Node: Bindable Readline Commands196868
|
||||
Node: Commands For Moving197618
|
||||
Node: Commands For History198465
|
||||
Node: Commands For Text201138
|
||||
Node: Commands For Killing202880
|
||||
Node: Numeric Arguments204906
|
||||
Node: Commands For Completion206030
|
||||
Node: Keyboard Macros208992
|
||||
Node: Miscellaneous Commands209550
|
||||
Node: Readline vi Mode213766
|
||||
Node: Installing Bash214642
|
||||
Node: Basic Installation215711
|
||||
Node: Compilers and Options218636
|
||||
Node: Compiling For Multiple Architectures219370
|
||||
Node: Installation Names221027
|
||||
Node: Specifying the System Type221749
|
||||
Node: Sharing Defaults222460
|
||||
Node: Operation Controls223125
|
||||
Node: Optional Features224030
|
||||
Node: Reporting Bugs228913
|
||||
Node: Builtin Index229993
|
||||
Node: Reserved Word Index233406
|
||||
Node: Variable Index234714
|
||||
Node: Function Index239899
|
||||
Node: Concept Index244257
|
||||
Node: Top1179
|
||||
Node: Introduction3283
|
||||
Node: What is Bash?3508
|
||||
Node: What is a shell?4592
|
||||
Node: Definitions6473
|
||||
Node: Basic Shell Features9134
|
||||
Node: Shell Syntax10655
|
||||
Node: Shell Operation10945
|
||||
Node: Quoting12179
|
||||
Node: Escape Character13214
|
||||
Node: Single Quotes13645
|
||||
Node: Double Quotes13974
|
||||
Node: ANSI-C Quoting14670
|
||||
Node: Locale Translation15402
|
||||
Node: Comments15823
|
||||
Node: Simple Commands16347
|
||||
Node: Pipelines16936
|
||||
Node: Lists18007
|
||||
Node: Looping Constructs19282
|
||||
Node: Conditional Constructs20459
|
||||
Node: Command Grouping22526
|
||||
Node: Shell Functions23912
|
||||
Node: Shell Parameters25685
|
||||
Node: Positional Parameters27008
|
||||
Node: Special Parameters27702
|
||||
Node: Shell Expansions30268
|
||||
Node: Shell Parameter Expansion32272
|
||||
Node: Command Substitution38280
|
||||
Node: Process Substitution39280
|
||||
Node: Word Splitting40186
|
||||
Node: Filename Expansion41638
|
||||
Node: Quote Removal44004
|
||||
Node: Redirections44290
|
||||
Node: Executing Commands50031
|
||||
Node: Command Search and Execution50486
|
||||
Node: Environment52220
|
||||
Node: Exit Status53856
|
||||
Node: Signals54873
|
||||
Node: Shell Scripts56084
|
||||
Node: Bourne Shell Features57953
|
||||
Node: Bourne Shell Builtins58623
|
||||
Node: Bourne Shell Variables66977
|
||||
Node: Other Bourne Shell Features68514
|
||||
Node: Major Differences From The Bourne Shell69271
|
||||
Node: Csh Features79631
|
||||
Node: Brace Expansion80549
|
||||
Node: Tilde Expansion82104
|
||||
Node: C Shell Builtins82736
|
||||
Node: C Shell Variables87292
|
||||
Node: Korn Shell Features87700
|
||||
Node: Korn Shell Constructs88428
|
||||
Node: Korn Shell Builtins90143
|
||||
Node: Korn Shell Variables92301
|
||||
Node: Aliases93860
|
||||
Node: Alias Builtins96326
|
||||
Node: Bash Features96942
|
||||
Node: Invoking Bash97933
|
||||
Node: Bash Startup Files101798
|
||||
Node: Is This Shell Interactive?105373
|
||||
Node: Bash Builtins106356
|
||||
Node: The Set Builtin122211
|
||||
Node: Bash Conditional Expressions127586
|
||||
Node: Bash Variables132237
|
||||
Node: Shell Arithmetic142271
|
||||
Node: Arithmetic Evaluation142739
|
||||
Node: Arithmetic Expansion144769
|
||||
Node: Arithmetic Builtins145573
|
||||
Node: Arrays146044
|
||||
Node: Printing a Prompt149071
|
||||
Node: The Restricted Shell150669
|
||||
Node: Bash POSIX Mode151899
|
||||
Node: Job Control155583
|
||||
Node: Job Control Basics156048
|
||||
Node: Job Control Builtins160191
|
||||
Node: Job Control Variables163114
|
||||
Node: Using History Interactively164261
|
||||
Node: Bash History Facilities164850
|
||||
Node: History Interaction167248
|
||||
Node: Event Designators169810
|
||||
Node: Word Designators170737
|
||||
Node: Modifiers171986
|
||||
Node: Command Line Editing173303
|
||||
Node: Introduction and Notation173963
|
||||
Node: Readline Interaction175001
|
||||
Node: Readline Bare Essentials176193
|
||||
Node: Readline Movement Commands177736
|
||||
Node: Readline Killing Commands178648
|
||||
Node: Readline Arguments180368
|
||||
Node: Searching181345
|
||||
Node: Readline Init File182981
|
||||
Node: Readline Init File Syntax184037
|
||||
Node: Conditional Init Constructs191820
|
||||
Node: Sample Init File194101
|
||||
Node: Bindable Readline Commands197134
|
||||
Node: Commands For Moving197884
|
||||
Node: Commands For History198731
|
||||
Node: Commands For Text201404
|
||||
Node: Commands For Killing203148
|
||||
Node: Numeric Arguments205174
|
||||
Node: Commands For Completion206300
|
||||
Node: Keyboard Macros209262
|
||||
Node: Miscellaneous Commands209820
|
||||
Node: Readline vi Mode214036
|
||||
Node: Installing Bash214914
|
||||
Node: Basic Installation215983
|
||||
Node: Compilers and Options218908
|
||||
Node: Compiling For Multiple Architectures219642
|
||||
Node: Installation Names221299
|
||||
Node: Specifying the System Type222021
|
||||
Node: Sharing Defaults222732
|
||||
Node: Operation Controls223397
|
||||
Node: Optional Features224302
|
||||
Node: Reporting Bugs229185
|
||||
Node: Builtin Index230265
|
||||
Node: Reserved Word Index233732
|
||||
Node: Variable Index235059
|
||||
Node: Function Index240327
|
||||
Node: Concept Index244750
|
||||
|
||||
End Tag Table
|
||||
|
|
|
@ -22,6 +22,11 @@ last change: Mon May 19 12:55:22 EDT 1997
|
|||
@defcodeindex rw
|
||||
@set BashFeatures
|
||||
|
||||
@dircategory Utilities
|
||||
@direntry
|
||||
* Bash: (bash). GNU Bourne-Again SHell
|
||||
@end direntry
|
||||
|
||||
@ifinfo
|
||||
@format
|
||||
This text is a brief description of the features that are present in
|
||||
|
|
1047
doc/texinfo.tex
1047
doc/texinfo.tex
File diff suppressed because it is too large
Load diff
|
@ -586,8 +586,14 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
|
|||
|
||||
/* If this is a simple command, tell execute_disk_command that it
|
||||
might be able to get away without forking and simply exec.
|
||||
This means things like ( sleep 10 ) will only cause one fork. */
|
||||
This means things like ( sleep 10 ) will only cause one fork.
|
||||
If we're timing the command, however, we cannot do this
|
||||
optimization. */
|
||||
#if 0
|
||||
if (user_subshell && command->type == cm_simple)
|
||||
#else
|
||||
if (user_subshell && command->type == cm_simple && (command->flags & CMD_TIME_PIPELINE) == 0)
|
||||
#endif
|
||||
{
|
||||
command->flags |= CMD_NO_FORK;
|
||||
command->value.Simple->flags |= CMD_NO_FORK;
|
||||
|
@ -1068,7 +1074,8 @@ print_formatted_time (fp, format, rs, rsf, us, usf, ss, ssf, cpu)
|
|||
{
|
||||
int prec, lng, len;
|
||||
char *str, *s, ts[32];
|
||||
int sum, sum_frac;
|
||||
long sum;
|
||||
int sum_frac;
|
||||
int sindex, ssize;
|
||||
|
||||
len = strlen (format);
|
||||
|
@ -1716,15 +1723,16 @@ print_select_list (list, list_len, max_elem_len, indices_len)
|
|||
/* Print the elements of LIST, one per line, preceded by an index from 1 to
|
||||
LIST_LEN. Then display PROMPT and wait for the user to enter a number.
|
||||
If the number is between 1 and LIST_LEN, return that selection. If EOF
|
||||
is read, return a null string. If a blank line is entered, the loop is
|
||||
executed again. */
|
||||
is read, return a null string. If a blank line is entered, or an invalid
|
||||
number is entered, the loop is executed again. */
|
||||
static char *
|
||||
select_query (list, list_len, prompt)
|
||||
WORD_LIST *list;
|
||||
int list_len;
|
||||
char *prompt;
|
||||
{
|
||||
int max_elem_len, indices_len, len, reply;
|
||||
int max_elem_len, indices_len, len;
|
||||
long reply;
|
||||
WORD_LIST *l;
|
||||
char *repl_string, *t;
|
||||
|
||||
|
@ -1767,7 +1775,8 @@ select_query (list, list_len, prompt)
|
|||
repl_string = get_string_value ("REPLY");
|
||||
if (*repl_string == 0)
|
||||
continue;
|
||||
reply = atoi (repl_string);
|
||||
if (legal_number (repl_string, &reply) == 0)
|
||||
continue;
|
||||
if (reply < 1 || reply > list_len)
|
||||
return "";
|
||||
|
||||
|
@ -2138,7 +2147,7 @@ fix_assignment_words (words)
|
|||
if (words == 0)
|
||||
return;
|
||||
|
||||
b = builtin_address_internal (words->word->word);
|
||||
b = builtin_address_internal (words->word->word, 0);
|
||||
if (b == 0 || (b->flags & ASSIGNMENT_BUILTIN) == 0)
|
||||
return;
|
||||
|
||||
|
|
|
@ -98,8 +98,8 @@ extern char *strerror __P((int));
|
|||
#endif
|
||||
|
||||
#if !defined (HAVE_STRCASECMP)
|
||||
extern int strncasecmp __P((char *, char *, int));
|
||||
extern int strcasecmp __P((char *, char *));
|
||||
extern int strncasecmp __P((const char *, const char *, int));
|
||||
extern int strcasecmp __P((const char *, const char *));
|
||||
#endif /* HAVE_STRCASECMP */
|
||||
|
||||
extern int dup2 __P((int, int));
|
||||
|
|
5
flags.c
5
flags.c
|
@ -133,8 +133,9 @@ int restricted = 0;
|
|||
#endif /* RESTRICTED_SHELL */
|
||||
|
||||
/* Non-zero means that this shell is running in `privileged' mode. This
|
||||
mode is entered on startup if the real and effective uids or gids
|
||||
differ. */
|
||||
is required if the shell is to run setuid. If the `-p' option is
|
||||
not supplied at startup, and the real and effective uids or gids
|
||||
differ, disable_priv_mode is called to relinquish setuid status. */
|
||||
int privileged_mode = 0;
|
||||
|
||||
#if defined (BRACE_EXPANSION)
|
||||
|
|
|
@ -844,8 +844,9 @@ polite_directory_format (name)
|
|||
l = home ? strlen (home) : 0;
|
||||
if (l > 1 && strncmp (home, name, l) == 0 && (!name[l] || name[l] == '/'))
|
||||
{
|
||||
strcpy (tdir + 1, name + l);
|
||||
strncpy (tdir + 1, name + l, sizeof(tdir) - 2);
|
||||
tdir[0] = '~';
|
||||
tdir[sizeof(tdir) - 1] = '\0';
|
||||
return (tdir);
|
||||
}
|
||||
else
|
||||
|
|
15
jobs.c
15
jobs.c
|
@ -1694,7 +1694,15 @@ wait_for (pid)
|
|||
if (interactive_shell && subshell_environment == 0)
|
||||
{
|
||||
if (WIFSIGNALED (child->status) || WIFSTOPPED (child->status))
|
||||
{
|
||||
set_tty_state ();
|
||||
/* If the foreground job was suspended with ^Z (SIGTSTP), and
|
||||
the user has requested it, get a new window size. */
|
||||
if (check_window_size && WIFSTOPPED (child->status) &&
|
||||
(WSTOPSIG (child->status) == SIGTSTP) &&
|
||||
job == current_job)
|
||||
get_new_window_size (0);
|
||||
}
|
||||
else
|
||||
get_tty_state ();
|
||||
|
||||
|
@ -2318,6 +2326,13 @@ waitchld (wpid, block)
|
|||
the signal to ourselves. */
|
||||
SigHandler *temp_handler;
|
||||
temp_handler = old_sigint_handler;
|
||||
/* Bogus. If we've reset the signal handler as the result
|
||||
of a trap caught on SIGINT, then old_sigint_handler
|
||||
will point to trap_handler, which now knows nothing about
|
||||
SIGINT (if we reset the sighandler to the default).
|
||||
In this case, we have to fix things up. What a crock. */
|
||||
if (temp_handler == trap_handler && signal_is_trapped (SIGINT) == 0)
|
||||
temp_handler = trap_to_sighandler (SIGINT);
|
||||
restore_sigint_handler ();
|
||||
if (temp_handler == SIG_DFL)
|
||||
termination_unwind_protect (SIGINT);
|
||||
|
|
|
@ -107,3 +107,7 @@ glob.o: $(BUILD_DIR)/config.h
|
|||
glob.o: $(topdir)/bashtypes.h $(topdir)/ansi_stdlib.h $(topdir)/bashansi.h
|
||||
glob.o: $(topdir)/posixstat.h $(topdir)/memalloc.h
|
||||
glob.o: fnmatch.h
|
||||
|
||||
# Rules for deficient makes, like SunOS and Solaris
|
||||
fnmatch.o: fnmatch.c
|
||||
glob.o: glob.c
|
||||
|
|
|
@ -91,8 +91,8 @@ stubmalloc: ${STUB_OBJS}
|
|||
${AR} cr libmalloc.a ${STUB_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
alloca.o: $(ALLOCA_SOURCE)
|
||||
$(CC) $(CCFLAGS) -c $(ALLOCA_SOURCE)
|
||||
alloca.o: $(srcdir)/$(ALLOCA_SOURCE)
|
||||
$(CC) $(CCFLAGS) -c $(srcdir)/$(ALLOCA_SOURCE)
|
||||
@- if test "$(ALLOCA_OBJECT)" != alloca.o ; then \
|
||||
mv $(ALLOCA_OBJECT) alloca.o >/dev/null 2>&1 ; \
|
||||
fi
|
||||
|
@ -103,12 +103,14 @@ mostlyclean clean:
|
|||
distclean realclean maintainer-clean: clean
|
||||
$(RM) Makefile
|
||||
|
||||
malloc.o: malloc.c
|
||||
gmalloc.o: gmalloc.c
|
||||
|
||||
alloca.o: $(BUILD_DIR)/config.h
|
||||
malloc.o: $(BUILD_DIR)/config.h $(topdir)/bashtypes.h getpagesize.h
|
||||
nmalloc.o: $(BUILD_DIR)/config.h $(topdir)/bashtypes.h getpagesize.h
|
||||
nmalloc2.o: $(BUILD_DIR)/config.h $(topdir)/bashtypes.h getpagesize.h
|
||||
xmalloc.o: $(BUILD_DIR)/config.h $(topdir)/ansi_stdlib.h
|
||||
gmalloc.o: $(BUILD_DIR)/config.h
|
||||
|
||||
# Rules for deficient makes, like SunOS and Solaris
|
||||
stub.o: stub.c
|
||||
malloc.o: malloc.c
|
||||
gmalloc.o: gmalloc.c
|
||||
|
|
|
@ -190,6 +190,7 @@ rltty.o: readline.h keymaps.h chardefs.h tilde.h
|
|||
search.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
search.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
search.o: ansi_stdlib.h history.h
|
||||
shell.o: ${BUILD_DIR}/config.h
|
||||
signals.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
|
||||
signals.o: readline.h keymaps.h chardefs.h tilde.h
|
||||
signals.o: history.h
|
||||
|
@ -212,3 +213,32 @@ vi_mode.o: readline.h keymaps.h chardefs.h tilde.h
|
|||
vi_mode.o: history.h ansi_stdlib.h
|
||||
xmalloc.o: ${BUILD_DIR}/config.h
|
||||
xmalloc.o: ansi_stdlib.h
|
||||
|
||||
# Rules for deficient makes, like SunOS and Solaris
|
||||
bind.o: bind.c
|
||||
callback.o: callback.c
|
||||
complete.o: complete.c
|
||||
display.o: display.c
|
||||
funmap.o: funmap.c
|
||||
histexpand.o: histexpand.c
|
||||
histfile.o: histfile.c
|
||||
history.o: history.c
|
||||
histsearch.o: histsearch.c
|
||||
input.o: input.c
|
||||
isearch.o: isearch.c
|
||||
keymaps.o: keymaps.c emacs_keymap.c vi_keymap.c
|
||||
kill.o: kill.c
|
||||
macro.o: macro.c
|
||||
nls.o: nls.c
|
||||
parens.o: parens.c
|
||||
readline.o: readline.c
|
||||
rltty.o: rltty.c
|
||||
search.o: search.c
|
||||
shell.o: shell.c
|
||||
signals.o: signals.c
|
||||
terminal.o: terminal.c
|
||||
tilde.o: tilde.c
|
||||
undo.o: undo.c
|
||||
util.o: util.c
|
||||
vi_mode.o: vi_mode.c
|
||||
xmalloc.o: xmalloc.c
|
||||
|
|
|
@ -796,7 +796,9 @@ make_quoted_replacement (match, mtype, qc)
|
|||
/* If there is a single match, see if we need to quote it.
|
||||
This also checks whether the common prefix of several
|
||||
matches needs to be quoted. */
|
||||
should_quote = rl_strpbrk (match, rl_filename_quote_characters) != 0;
|
||||
should_quote = rl_filename_quote_characters
|
||||
? (rl_strpbrk (match, rl_filename_quote_characters) != 0)
|
||||
: 0;
|
||||
|
||||
do_replace = should_quote ? mtype : NO_MATCH;
|
||||
/* Quote the replacement, since we found an embedded
|
||||
|
|
|
@ -1482,7 +1482,7 @@ cr ()
|
|||
void
|
||||
_rl_redisplay_after_sigwinch ()
|
||||
{
|
||||
char *t, *oldp;
|
||||
char *t, *oldp, *oldl, *oldlprefix;
|
||||
|
||||
/* Clear the current line and put the cursor at column 0. Make sure
|
||||
the right thing happens if we have wrapped to a new screen line. */
|
||||
|
@ -1508,9 +1508,14 @@ _rl_redisplay_after_sigwinch ()
|
|||
if (t)
|
||||
{
|
||||
oldp = rl_display_prompt;
|
||||
oldl = local_prompt;
|
||||
oldlprefix = local_prompt_prefix;
|
||||
rl_display_prompt = ++t;
|
||||
local_prompt = local_prompt_prefix = (char *)NULL;
|
||||
rl_forced_update_display ();
|
||||
rl_display_prompt = oldp;
|
||||
local_prompt = oldl;
|
||||
local_prompt_prefix = oldlprefix;
|
||||
}
|
||||
else
|
||||
rl_forced_update_display ();
|
||||
|
|
|
@ -246,7 +246,7 @@ history_truncate_file (fname, lines)
|
|||
|
||||
/* Write only if there are more lines in the file than we want to
|
||||
truncate to. */
|
||||
if (i && ((file = open (filename, O_WRONLY|O_TRUNC|O_BINARY, 0666)) != -1))
|
||||
if (i && ((file = open (filename, O_WRONLY|O_TRUNC|O_BINARY, 0600)) != -1))
|
||||
{
|
||||
write (file, buffer + i, finfo.st_size - i);
|
||||
close (file);
|
||||
|
@ -275,7 +275,7 @@ history_do_write (filename, nelements, overwrite)
|
|||
mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY;
|
||||
output = history_filename (filename);
|
||||
|
||||
if ((file = open (output, mode, 0666)) == -1)
|
||||
if ((file = open (output, mode, 0600)) == -1)
|
||||
{
|
||||
FREE (output);
|
||||
return (errno);
|
||||
|
|
|
@ -262,7 +262,7 @@ rl_search_history (direction, invoking_key)
|
|||
break;
|
||||
}
|
||||
|
||||
if (c >= 0 && (CTRL_CHAR (c) || META_CHAR (c) || c == RUBOUT))
|
||||
if (c >= 0 && (CTRL_CHAR (c) || META_CHAR (c) || c == RUBOUT) && c != CTRL ('g'))
|
||||
{
|
||||
rl_execute_next (c);
|
||||
break;
|
||||
|
|
|
@ -255,7 +255,7 @@ extern int rl_pending_input;
|
|||
/* Non-zero if we called this function from _rl_dispatch(). It's present
|
||||
so functions can find out whether they were called from a key binding
|
||||
or directly from an application. */
|
||||
int rl_dispatching;
|
||||
extern int rl_dispatching;
|
||||
|
||||
/* The name of the terminal to use. */
|
||||
extern char *rl_terminal_name;
|
||||
|
|
|
@ -189,7 +189,7 @@ tilde_expand (string)
|
|||
if (result = strchr (string, '~'))
|
||||
result = xmalloc (result_size = (strlen (string) + 16));
|
||||
else
|
||||
result = xmalloc (result_size = strlen (string));
|
||||
result = xmalloc (result_size = (strlen (string) + 1));
|
||||
|
||||
/* Scan through STRING expanding tildes as we come to them. */
|
||||
while (1)
|
||||
|
|
|
@ -98,3 +98,6 @@ mostlyclean: clean
|
|||
|
||||
tilde.o: tilde.h $(topdir)/ansi_stdlib.h
|
||||
tilde.o: $(BUILD_DIR)/config.h
|
||||
|
||||
# Rules for deficient makes, like SunOS and Solaris
|
||||
tilde.o: tilde.c
|
||||
|
|
|
@ -189,7 +189,7 @@ tilde_expand (string)
|
|||
if (result = strchr (string, '~'))
|
||||
result = xmalloc (result_size = (strlen (string) + 16));
|
||||
else
|
||||
result = xmalloc (result_size = strlen (string));
|
||||
result = xmalloc (result_size = (strlen (string) + 1));
|
||||
|
||||
/* Scan through STRING expanding tildes as we come to them. */
|
||||
while (1)
|
||||
|
|
10
locale.c
10
locale.c
|
@ -126,7 +126,15 @@ set_locale_var (var, value)
|
|||
else if (var[3] == 'A') /* LC_ALL */
|
||||
{
|
||||
FREE (lc_all);
|
||||
lc_all = value ? savestring (value) : savestring (default_locale);
|
||||
if (value)
|
||||
lc_all = savestring (value);
|
||||
else if (default_locale)
|
||||
lc_all = savestring (default_locale);
|
||||
else
|
||||
{
|
||||
lc_all = xmalloc (1);
|
||||
lc_all[0] = '\0';
|
||||
}
|
||||
#if defined (HAVE_SETLOCALE)
|
||||
return (setlocale (LC_ALL, value) != 0);
|
||||
#else
|
||||
|
|
|
@ -150,7 +150,7 @@ add_mail_file (file, msg)
|
|||
int i;
|
||||
|
||||
filename = full_pathname (file);
|
||||
i = find_mail_file (file);
|
||||
i = find_mail_file (filename);
|
||||
if (i >= 0)
|
||||
{
|
||||
if (stat (filename, &finfo) == 0)
|
||||
|
|
12
oslib.c
12
oslib.c
|
@ -112,7 +112,7 @@ strrchr (string, c)
|
|||
doesn't matter. */
|
||||
int
|
||||
strncasecmp (string1, string2, count)
|
||||
char *string1, *string2;
|
||||
const char *string1, *string2;
|
||||
int count;
|
||||
{
|
||||
register char *s1, *s2;
|
||||
|
@ -120,8 +120,8 @@ strncasecmp (string1, string2, count)
|
|||
|
||||
if (count > 0)
|
||||
{
|
||||
s1 = string1;
|
||||
s2 = string2;
|
||||
s1 = (char *)string1;
|
||||
s2 = (char *)string2;
|
||||
do
|
||||
{
|
||||
if ((r = to_lower (*s1) - to_lower (*s2)) != 0)
|
||||
|
@ -138,13 +138,13 @@ strncasecmp (string1, string2, count)
|
|||
/* strcmp (), but caseless. */
|
||||
int
|
||||
strcasecmp (string1, string2)
|
||||
char *string1, *string2;
|
||||
const char *string1, *string2;
|
||||
{
|
||||
register char *s1, *s2;
|
||||
register int r;
|
||||
|
||||
s1 = string1;
|
||||
s2 = string2;
|
||||
s1 = (char *)string1;
|
||||
s2 = (char *)string2;
|
||||
|
||||
while ((r = to_lower (*s1) - to_lower (*s2)) == 0)
|
||||
{
|
||||
|
|
17
parse.y
17
parse.y
|
@ -2529,7 +2529,7 @@ read_token_word (character)
|
|||
|
||||
#if defined (ARRAY_VARS)
|
||||
/* Identify possible compound array variable assignment. */
|
||||
else if (character == '=')
|
||||
else if (character == '=' && token_index > 0)
|
||||
{
|
||||
peek_char = shell_getc (1);
|
||||
if (peek_char == '(') /* ) */
|
||||
|
@ -3077,6 +3077,7 @@ decode_prompt_string (string)
|
|||
{
|
||||
/* Use the value of PWD because it is much more efficient. */
|
||||
char t_string[PATH_MAX];
|
||||
int tlen;
|
||||
|
||||
temp = get_string_value ("PWD");
|
||||
|
||||
|
@ -3085,11 +3086,17 @@ decode_prompt_string (string)
|
|||
if (getcwd (t_string, sizeof(t_string)) == 0)
|
||||
{
|
||||
t_string[0] = '.';
|
||||
t_string[1] = '\0';
|
||||
}
|
||||
tlen = 1;
|
||||
}
|
||||
else
|
||||
strcpy (t_string, temp);
|
||||
tlen = strlen (t_string);
|
||||
}
|
||||
else
|
||||
{
|
||||
tlen = sizeof (t_string) - 1;
|
||||
strncpy (t_string, temp, tlen);
|
||||
}
|
||||
t_string[tlen] = '\0';
|
||||
|
||||
if (c == 'W')
|
||||
{
|
||||
|
@ -3098,6 +3105,8 @@ decode_prompt_string (string)
|
|||
strcpy (t_string, t + 1);
|
||||
}
|
||||
else
|
||||
/* polite_directory_format is guaranteed to return a string
|
||||
no longer than PATH_MAX - 1 characters. */
|
||||
strcpy (t_string, polite_directory_format (t_string));
|
||||
|
||||
/* If we're going to be expanding the prompt string later,
|
||||
|
|
|
@ -276,7 +276,7 @@ xtrace_print_word_list (list)
|
|||
WORD_LIST *list;
|
||||
{
|
||||
WORD_LIST *w;
|
||||
char *t;
|
||||
char *t, *x;
|
||||
|
||||
fprintf (stderr, "%s", indirection_level_string ());
|
||||
for (w = list; w; w = w->next)
|
||||
|
@ -285,7 +285,11 @@ xtrace_print_word_list (list)
|
|||
if (t == 0 || *t == '\0')
|
||||
fprintf (stderr, "''%s", w->next ? " " : "");
|
||||
else if (contains_shell_metas (t))
|
||||
fprintf (stderr, "'%s'%s", t, w->next ? " " : "");
|
||||
{
|
||||
x = single_quote (t);
|
||||
fprintf (stderr, "%s%s", x, w->next ? " " : "");
|
||||
free (x);
|
||||
}
|
||||
else
|
||||
fprintf (stderr, "%s%s", t, w->next ? " " : "");
|
||||
}
|
||||
|
|
14
shell.c
14
shell.c
|
@ -248,7 +248,7 @@ main (argc, argv, env)
|
|||
char **argv, **env;
|
||||
{
|
||||
register int i;
|
||||
int code;
|
||||
int code, saverst;
|
||||
volatile int locally_skip_execution;
|
||||
volatile int arg_index, top_level_arg_index;
|
||||
|
||||
|
@ -459,6 +459,13 @@ main (argc, argv, env)
|
|||
interactive = 1;
|
||||
}
|
||||
|
||||
#if defined (RESTRICTED_SHELL)
|
||||
/* If the `-r' option is supplied at invocation, make sure that the shell
|
||||
is not in restricted mode when running the startup files. */
|
||||
saverst = restricted;
|
||||
restricted = 0;
|
||||
#endif
|
||||
|
||||
if (locally_skip_execution == 0 && running_setuid == 0)
|
||||
run_startup_files ();
|
||||
|
||||
|
@ -473,7 +480,10 @@ main (argc, argv, env)
|
|||
}
|
||||
|
||||
#if defined (RESTRICTED_SHELL)
|
||||
/* Turn on the restrictions after parsing the startup files. */
|
||||
/* Turn on the restrictions after parsing the startup files. This
|
||||
means that `bash -r' or `set -r' invoked from a startup file will
|
||||
turn on the restrictions after the startup files are executed. */
|
||||
restricted = saverst || restricted;
|
||||
maybe_make_restricted (shell_name);
|
||||
#endif /* RESTRICTED_SHELL */
|
||||
|
||||
|
|
6
sig.c
6
sig.c
|
@ -75,9 +75,9 @@ initialize_signals ()
|
|||
{
|
||||
initialize_shell_signals ();
|
||||
initialize_job_signals ();
|
||||
#if !defined (HAVE_SYS_SIGLIST) && !defined (HAVE_STRSIGNAL)
|
||||
#if !defined (HAVE_SYS_SIGLIST) && !defined (HAVE_UNDER_SYS_SIGLIST) && !defined (HAVE_STRSIGNAL)
|
||||
initialize_siglist ();
|
||||
#endif
|
||||
#endif /* !HAVE_SYS_SIGLIST && !HAVE_UNDER_SYS_SIGLIST && !HAVE_STRSIGNAL */
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -229,8 +229,10 @@ initialize_terminating_signals ()
|
|||
sigaction (XSIG (i), &oact, &act);
|
||||
set_signal_ignored (XSIG (i));
|
||||
}
|
||||
#if defined (SIGPROF)
|
||||
if (XSIG (i) == SIGPROF && XHANDLER (i) != SIG_DFL && XHANDLER (i) != SIG_IGN)
|
||||
sigaction (XSIG (i), &oact, (struct sigaction *)NULL);
|
||||
#endif /* SIGPROF */
|
||||
}
|
||||
|
||||
#else /* !HAVE_POSIX_SIGNALS */
|
||||
|
|
2
sig.h
2
sig.h
|
@ -118,5 +118,7 @@ extern void jump_to_top_level __P((int));
|
|||
|
||||
/* Functions defined in trap.c. */
|
||||
extern SigHandler *set_sigint_handler __P((void));
|
||||
extern SigHandler *trap_to_sighandler __P((int));
|
||||
extern sighandler trap_handler __P((int));
|
||||
|
||||
#endif /* _SIG_H_ */
|
||||
|
|
|
@ -20,7 +20,7 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
|
||||
#include "config.h"
|
||||
|
||||
#if !defined (HAVE_SYS_SIGLIST) && !defined (HAVE_STRSIGNAL)
|
||||
#if !defined (HAVE_SYS_SIGLIST) && !defined (HAVE_UNDER_SYS_SIGLIST) && !defined (HAVE_STRSIGNAL)
|
||||
|
||||
#include <stdio.h>
|
||||
#include "bashtypes.h"
|
||||
|
@ -225,4 +225,4 @@ initialize_siglist ()
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif /* !HAVE_SYS_SIGLIST && !HAVE_STRSIGNAL */
|
||||
#endif /* !HAVE_SYS_SIGLIST && !HAVE_UNDER_SYS_SIGLIST && !HAVE_STRSIGNAL */
|
||||
|
|
25
subst.c
25
subst.c
|
@ -3506,7 +3506,9 @@ parameter_brace_expand_length (name)
|
|||
/* Verify and limit the start and end of the desired substring. If
|
||||
VTYPE == 0, a regular shell variable is being used; if it is 1,
|
||||
then the positional paramters are being used; if it is 2, then
|
||||
VALUE is really a pointer to an array variable that should be used. */
|
||||
VALUE is really a pointer to an array variable that should be used.
|
||||
Return value is 1 if both values were OK, 0 if there was a problem
|
||||
with an invalid expression, or -1 if the values were out of range. */
|
||||
static int
|
||||
verify_substring_values (value, substr, vtype, e1p, e2p)
|
||||
char *value, *substr;
|
||||
|
@ -3548,7 +3550,7 @@ verify_substring_values (value, substr, vtype, e1p, e2p)
|
|||
*e1p += len;
|
||||
|
||||
if (*e1p >= len || *e1p < 0)
|
||||
return (0);
|
||||
return (-1);
|
||||
|
||||
if (t)
|
||||
{
|
||||
|
@ -3672,7 +3674,7 @@ parameter_brace_substring (varname, value, substr, quoted)
|
|||
char *varname, *value, *substr;
|
||||
int quoted;
|
||||
{
|
||||
int e1, e2, vtype;
|
||||
int e1, e2, vtype, r;
|
||||
char *temp, *val;
|
||||
SHELL_VAR *v;
|
||||
|
||||
|
@ -3685,11 +3687,12 @@ parameter_brace_substring (varname, value, substr, quoted)
|
|||
if (vtype == -1)
|
||||
return ((char *)NULL);
|
||||
|
||||
if (verify_substring_values (val, substr, vtype, &e1, &e2) == 0)
|
||||
r = verify_substring_values (val, substr, vtype, &e1, &e2);
|
||||
if (r <= 0)
|
||||
{
|
||||
if (val && vtype == VT_ARRAYMEMBER)
|
||||
free (val);
|
||||
return (&expand_param_error);
|
||||
return ((r == 0) ? &expand_param_error : (char *)NULL);
|
||||
}
|
||||
|
||||
switch (vtype)
|
||||
|
@ -4506,11 +4509,14 @@ expand_word_internal (word, quoted, contains_dollar_at, expanded_something)
|
|||
extract the expression and pass it to the evaluator. */
|
||||
if (temp && *temp == '(')
|
||||
{
|
||||
char *temp2;
|
||||
temp1 = temp + 1;
|
||||
t_index = strlen (temp1) - 1;
|
||||
temp2 = savestring (temp1);
|
||||
t_index = strlen (temp2) - 1;
|
||||
|
||||
if (temp1[t_index] != ')')
|
||||
if (temp2[t_index] != ')')
|
||||
{
|
||||
free (temp2);
|
||||
#if 0
|
||||
report_error ("%s: bad arithmetic substitution", temp);
|
||||
free (temp);
|
||||
|
@ -4523,10 +4529,11 @@ expand_word_internal (word, quoted, contains_dollar_at, expanded_something)
|
|||
}
|
||||
|
||||
/* Cut off ending `)' */
|
||||
temp1[t_index] = '\0';
|
||||
temp2[t_index] = '\0';
|
||||
|
||||
/* Expand variables found inside the expression. */
|
||||
temp1 = maybe_expand_string (temp1, Q_DOUBLE_QUOTES, expand_string);
|
||||
temp1 = maybe_expand_string (temp2, Q_DOUBLE_QUOTES, expand_string);
|
||||
free (temp2);
|
||||
|
||||
/* No error messages. */
|
||||
this_command_name = (char *)NULL;
|
||||
|
|
11
support/config.guess
vendored
11
support/config.guess
vendored
|
@ -206,7 +206,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
|||
# Japanese Language versions have a version number like `4.1.3-JL'.
|
||||
echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
|
||||
exit 0 ;;
|
||||
sun3*:SunOS:*:*)
|
||||
sun3*:SunOS:*:*|sun:SunOS:*:*)
|
||||
echo m68k-sun-sunos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
aushp:SunOS:*:*)
|
||||
|
@ -372,12 +372,15 @@ EOF
|
|||
hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
|
||||
echo m68k-hp-bsd4.4
|
||||
exit 0 ;;
|
||||
9000/[3478]??:HP-UX:*:*)
|
||||
9000/[34678]??:HP-UX:*:*)
|
||||
case "${UNAME_MACHINE}" in
|
||||
9000/31? ) HP_ARCH=m68000 ;;
|
||||
9000/[34]?? ) HP_ARCH=m68k ;;
|
||||
9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
|
||||
9000/8?? ) HP_ARCH=hppa1.0 ;;
|
||||
9000/78? | 9000/80[24] | 9000/8[67]1 | 9000/8[78]9 | 9000/893 )
|
||||
HP_ARCH=hppa2.0 ;;
|
||||
9000/7?? | 9000/8?[13679] | 9000/892 )
|
||||
HP_ARCH=hppa1.1 ;;
|
||||
9000/[68]?? ) HP_ARCH=hppa1.0 ;;
|
||||
esac
|
||||
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
|
||||
echo ${HP_ARCH}-hp-hpux${HPUX_REV}
|
||||
|
|
10
test.c
10
test.c
|
@ -42,6 +42,11 @@
|
|||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#if !defined (errno)
|
||||
extern int errno;
|
||||
#endif /* !errno */
|
||||
|
||||
#if !defined (_POSIX_VERSION)
|
||||
# include <sys/file.h>
|
||||
#endif /* !_POSIX_VERSION */
|
||||
|
@ -55,11 +60,6 @@
|
|||
# define STRLEN(s) ((s)[0] ? ((s)[1] ? ((s)[2] ? strlen(s) : 2) : 1) : 0)
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#if !defined (errno)
|
||||
extern int errno;
|
||||
#endif /* !errno */
|
||||
|
||||
#if !defined (STREQ)
|
||||
# define STREQ(a, b) ((a)[0] == (b)[0] && strcmp (a, b) == 0)
|
||||
#endif /* !STREQ */
|
||||
|
|
|
@ -46,7 +46,7 @@ declare -a DIRSTACK='()'
|
|||
declare -ar a='([1]="" [2]="bdef" [5]="hello world" [6]="test expression")'
|
||||
declare -a b='([0]="this" [1]="is" [2]="a" [3]="test" [4]="" [5]="/etc/passwd")'
|
||||
declare -ar c='()'
|
||||
declare -a d='([1]="test test" [2]="bdef" [5]="hello world" [6]="test" [9]="ninth element")'
|
||||
declare -a d='([1]="test test")'
|
||||
declare -a f='([0]="" [1]="bdef" [2]="hello world" [3]="test" [4]="ninth element")'
|
||||
./array.tests: unset: ps1: not an array variable
|
||||
./array.tests: declare: c: cannot destroy array variables in this way
|
||||
|
@ -56,7 +56,7 @@ declare -a DIRSTACK='()'
|
|||
declare -ar a='([1]="" [2]="bdef" [5]="hello world" [6]="test expression")'
|
||||
declare -a b='([0]="this" [1]="is" [2]="a" [3]="test" [4]="" [5]="/etc/passwd")'
|
||||
declare -ar c='()'
|
||||
declare -a d='([1]="test test" [2]="bdef" [5]="hello world" [6]="test" [9]="ninth element")'
|
||||
declare -a d='([1]="test test")'
|
||||
declare -a f='([0]="" [1]="bdef" [2]="hello world" [3]="test" [4]="ninth element")'
|
||||
declare -a rv='([0]="this" [1]="is" [2]="a" [3]="test" [4]="of" [5]="read" [6]="using" [7]="arrays")'
|
||||
abde
|
||||
|
|
26
trap.c
26
trap.c
|
@ -23,15 +23,15 @@
|
|||
|
||||
#include <stdio.h>
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "bashtypes.h"
|
||||
#include "trap.h"
|
||||
|
||||
#include "bashansi.h"
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "shell.h"
|
||||
#include "signames.h"
|
||||
#include "builtins/common.h"
|
||||
|
@ -151,9 +151,11 @@ decode_signal (string)
|
|||
if (legal_number (string, &sig))
|
||||
return ((sig >= 0 && sig <= NSIG) ? (int)sig : NO_SIG);
|
||||
|
||||
/* A leading `SIG' may be omitted. */
|
||||
for (sig = 0; sig <= NSIG; sig++)
|
||||
if (strcasecmp (string, signal_names[sig]) == 0 ||
|
||||
strcasecmp (string, &(signal_names[sig])[3]) == 0)
|
||||
(STREQN (signal_names[sig], "SIG", 3) &&
|
||||
strcasecmp (string, &(signal_names[sig])[3]) == 0))
|
||||
return ((int)sig);
|
||||
|
||||
return (NO_SIG);
|
||||
|
@ -300,6 +302,20 @@ set_sigint_handler ()
|
|||
return (set_signal_handler (SIGINT, termination_unwind_protect));
|
||||
}
|
||||
|
||||
/* Return the correct handler for signal SIG according to the values in
|
||||
sigmodes[SIG]. */
|
||||
SigHandler *
|
||||
trap_to_sighandler (sig)
|
||||
int sig;
|
||||
{
|
||||
if (sigmodes[sig] & (SIG_IGNORED|SIG_HARD_IGNORE))
|
||||
return (SIG_IGN);
|
||||
else if (sigmodes[sig] & SIG_TRAPPED)
|
||||
return (trap_handler);
|
||||
else
|
||||
return (SIG_DFL);
|
||||
}
|
||||
|
||||
/* Set SIG to call STRING as a command. */
|
||||
void
|
||||
set_signal (sig, string)
|
||||
|
|
18
variables.c
18
variables.c
|
@ -907,7 +907,11 @@ static int
|
|||
brand ()
|
||||
{
|
||||
rseed = rseed * 1103515245 + 12345;
|
||||
#if 0
|
||||
return ((unsigned int)(rseed / 65536) % 32768);
|
||||
#else
|
||||
return ((unsigned int)(rseed % 32768));
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Set the random number generator seed to SEED. */
|
||||
|
@ -916,6 +920,7 @@ sbrand (seed)
|
|||
int seed;
|
||||
{
|
||||
rseed = seed;
|
||||
last_random_value = 0;
|
||||
}
|
||||
|
||||
static SHELL_VAR *
|
||||
|
@ -936,7 +941,7 @@ get_random (var)
|
|||
|
||||
/* Reset for command and process substitution. */
|
||||
if (subshell_environment)
|
||||
sbrand ((int)(getpid() + NOW));
|
||||
sbrand (rseed + (int)(getpid() + NOW));
|
||||
|
||||
do
|
||||
rv = brand ();
|
||||
|
@ -1462,6 +1467,10 @@ assign_array_from_string (name, value)
|
|||
}
|
||||
else if (array_p (var) == 0)
|
||||
var = convert_var_to_array (var);
|
||||
#if 0
|
||||
else
|
||||
empty_array (array_cell (var));
|
||||
#endif
|
||||
|
||||
return (assign_array_var_from_string (var, value));
|
||||
}
|
||||
|
@ -1509,6 +1518,13 @@ assign_array_var_from_string (var, value)
|
|||
else
|
||||
nlist = expand_string (value, 0);
|
||||
|
||||
#if 1
|
||||
/* Now that we are ready to assign values to the array, kill the existing
|
||||
value. */
|
||||
if (a)
|
||||
empty_array (a);
|
||||
#endif
|
||||
|
||||
for (last_ind = 0, list = nlist; list; list = list->next)
|
||||
{
|
||||
w = list->word->word;
|
||||
|
|
|
@ -63,5 +63,5 @@ show_shell_version (extended)
|
|||
{
|
||||
printf ("GNU bash, version %s (%s)\n", shell_version_string (), MACHTYPE);
|
||||
if (extended)
|
||||
printf ("Copyright 1996 Free Software Foundation, Inc.\n");
|
||||
printf ("Copyright 1997 Free Software Foundation, Inc.\n");
|
||||
}
|
||||
|
|
249
y.tab.c
249
y.tab.c
|
@ -1,5 +1,5 @@
|
|||
|
||||
/* A Bison parser, made from ./parse.y
|
||||
/* A Bison parser, made from /usr/homes/chet/src/bash/bash-2.01.1/parse.y
|
||||
by GNU Bison version 1.25
|
||||
*/
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
|||
#define GREATER_BAR 289
|
||||
#define yacc_EOF 290
|
||||
|
||||
#line 21 "./parse.y"
|
||||
#line 21 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
@ -189,7 +189,7 @@ static int function_bstart;
|
|||
|
||||
static REDIRECTEE redir;
|
||||
|
||||
#line 171 "./parse.y"
|
||||
#line 171 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
typedef union {
|
||||
WORD_DESC *word; /* the word that we read. */
|
||||
int number; /* the number that we read. */
|
||||
|
@ -1071,7 +1071,7 @@ yyreduce:
|
|||
switch (yyn) {
|
||||
|
||||
case 1:
|
||||
#line 215 "./parse.y"
|
||||
#line 215 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
/* Case of regular command. Discard the error
|
||||
safety net,and return the command just parsed. */
|
||||
|
@ -1082,7 +1082,7 @@ case 1:
|
|||
;
|
||||
break;}
|
||||
case 2:
|
||||
#line 224 "./parse.y"
|
||||
#line 224 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
/* Case of regular command, but not a very
|
||||
interesting one. Return a NULL command. */
|
||||
|
@ -1091,7 +1091,7 @@ case 2:
|
|||
;
|
||||
break;}
|
||||
case 3:
|
||||
#line 231 "./parse.y"
|
||||
#line 231 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
/* Error during parsing. Return NULL command. */
|
||||
global_command = (COMMAND *)NULL;
|
||||
|
@ -1108,7 +1108,7 @@ case 3:
|
|||
;
|
||||
break;}
|
||||
case 4:
|
||||
#line 246 "./parse.y"
|
||||
#line 246 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
/* Case of EOF seen by itself. Do ignoreeof or
|
||||
not. */
|
||||
|
@ -1118,57 +1118,57 @@ case 4:
|
|||
;
|
||||
break;}
|
||||
case 5:
|
||||
#line 256 "./parse.y"
|
||||
#line 256 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.word_list = make_word_list (yyvsp[0].word, (WORD_LIST *)NULL); ;
|
||||
break;}
|
||||
case 6:
|
||||
#line 258 "./parse.y"
|
||||
#line 258 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.word_list = make_word_list (yyvsp[0].word, yyvsp[-1].word_list); ;
|
||||
break;}
|
||||
case 7:
|
||||
#line 262 "./parse.y"
|
||||
#line 262 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (1, r_output_direction, redir);
|
||||
;
|
||||
break;}
|
||||
case 8:
|
||||
#line 267 "./parse.y"
|
||||
#line 267 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (0, r_input_direction, redir);
|
||||
;
|
||||
break;}
|
||||
case 9:
|
||||
#line 272 "./parse.y"
|
||||
#line 272 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_output_direction, redir);
|
||||
;
|
||||
break;}
|
||||
case 10:
|
||||
#line 277 "./parse.y"
|
||||
#line 277 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_input_direction, redir);
|
||||
;
|
||||
break;}
|
||||
case 11:
|
||||
#line 282 "./parse.y"
|
||||
#line 282 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (1, r_appending_to, redir);
|
||||
;
|
||||
break;}
|
||||
case 12:
|
||||
#line 287 "./parse.y"
|
||||
#line 287 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_appending_to, redir);
|
||||
;
|
||||
break;}
|
||||
case 13:
|
||||
#line 292 "./parse.y"
|
||||
#line 292 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (0, r_reading_until, redir);
|
||||
|
@ -1176,7 +1176,7 @@ case 13:
|
|||
;
|
||||
break;}
|
||||
case 14:
|
||||
#line 298 "./parse.y"
|
||||
#line 298 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_reading_until, redir);
|
||||
|
@ -1184,63 +1184,63 @@ case 14:
|
|||
;
|
||||
break;}
|
||||
case 15:
|
||||
#line 304 "./parse.y"
|
||||
#line 304 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.dest = yyvsp[0].number;
|
||||
yyval.redirect = make_redirection (0, r_duplicating_input, redir);
|
||||
;
|
||||
break;}
|
||||
case 16:
|
||||
#line 309 "./parse.y"
|
||||
#line 309 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.dest = yyvsp[0].number;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_duplicating_input, redir);
|
||||
;
|
||||
break;}
|
||||
case 17:
|
||||
#line 314 "./parse.y"
|
||||
#line 314 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.dest = yyvsp[0].number;
|
||||
yyval.redirect = make_redirection (1, r_duplicating_output, redir);
|
||||
;
|
||||
break;}
|
||||
case 18:
|
||||
#line 319 "./parse.y"
|
||||
#line 319 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.dest = yyvsp[0].number;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_duplicating_output, redir);
|
||||
;
|
||||
break;}
|
||||
case 19:
|
||||
#line 324 "./parse.y"
|
||||
#line 324 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (0, r_duplicating_input_word, redir);
|
||||
;
|
||||
break;}
|
||||
case 20:
|
||||
#line 329 "./parse.y"
|
||||
#line 329 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_duplicating_input_word, redir);
|
||||
;
|
||||
break;}
|
||||
case 21:
|
||||
#line 334 "./parse.y"
|
||||
#line 334 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (1, r_duplicating_output_word, redir);
|
||||
;
|
||||
break;}
|
||||
case 22:
|
||||
#line 339 "./parse.y"
|
||||
#line 339 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_duplicating_output_word, redir);
|
||||
;
|
||||
break;}
|
||||
case 23:
|
||||
#line 344 "./parse.y"
|
||||
#line 344 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection
|
||||
|
@ -1249,7 +1249,7 @@ case 23:
|
|||
;
|
||||
break;}
|
||||
case 24:
|
||||
#line 351 "./parse.y"
|
||||
#line 351 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection
|
||||
|
@ -1258,88 +1258,88 @@ case 24:
|
|||
;
|
||||
break;}
|
||||
case 25:
|
||||
#line 358 "./parse.y"
|
||||
#line 358 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.dest = 0L;
|
||||
yyval.redirect = make_redirection (1, r_close_this, redir);
|
||||
;
|
||||
break;}
|
||||
case 26:
|
||||
#line 363 "./parse.y"
|
||||
#line 363 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.dest = 0L;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_close_this, redir);
|
||||
;
|
||||
break;}
|
||||
case 27:
|
||||
#line 368 "./parse.y"
|
||||
#line 368 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.dest = 0L;
|
||||
yyval.redirect = make_redirection (0, r_close_this, redir);
|
||||
;
|
||||
break;}
|
||||
case 28:
|
||||
#line 373 "./parse.y"
|
||||
#line 373 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.dest = 0L;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_close_this, redir);
|
||||
;
|
||||
break;}
|
||||
case 29:
|
||||
#line 378 "./parse.y"
|
||||
#line 378 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (1, r_err_and_out, redir);
|
||||
;
|
||||
break;}
|
||||
case 30:
|
||||
#line 383 "./parse.y"
|
||||
#line 383 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_input_output, redir);
|
||||
;
|
||||
break;}
|
||||
case 31:
|
||||
#line 388 "./parse.y"
|
||||
#line 388 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (0, r_input_output, redir);
|
||||
;
|
||||
break;}
|
||||
case 32:
|
||||
#line 393 "./parse.y"
|
||||
#line 393 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (1, r_output_force, redir);
|
||||
;
|
||||
break;}
|
||||
case 33:
|
||||
#line 398 "./parse.y"
|
||||
#line 398 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
redir.filename = yyvsp[0].word;
|
||||
yyval.redirect = make_redirection (yyvsp[-2].number, r_output_force, redir);
|
||||
;
|
||||
break;}
|
||||
case 34:
|
||||
#line 405 "./parse.y"
|
||||
#line 405 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.element.word = yyvsp[0].word; yyval.element.redirect = 0; ;
|
||||
break;}
|
||||
case 35:
|
||||
#line 407 "./parse.y"
|
||||
#line 407 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.element.word = yyvsp[0].word; yyval.element.redirect = 0; ;
|
||||
break;}
|
||||
case 36:
|
||||
#line 409 "./parse.y"
|
||||
#line 409 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.element.redirect = yyvsp[0].redirect; yyval.element.word = 0; ;
|
||||
break;}
|
||||
case 37:
|
||||
#line 413 "./parse.y"
|
||||
#line 413 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.redirect = yyvsp[0].redirect;
|
||||
;
|
||||
break;}
|
||||
case 38:
|
||||
#line 417 "./parse.y"
|
||||
#line 417 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
register REDIRECT *t;
|
||||
|
||||
|
@ -1350,23 +1350,23 @@ case 38:
|
|||
;
|
||||
break;}
|
||||
case 39:
|
||||
#line 428 "./parse.y"
|
||||
#line 428 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_simple_command (yyvsp[0].element, (COMMAND *)NULL); ;
|
||||
break;}
|
||||
case 40:
|
||||
#line 430 "./parse.y"
|
||||
#line 430 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_simple_command (yyvsp[0].element, yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 41:
|
||||
#line 434 "./parse.y"
|
||||
#line 434 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = clean_simple_command (yyvsp[0].command); ;
|
||||
break;}
|
||||
case 42:
|
||||
#line 436 "./parse.y"
|
||||
#line 436 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 43:
|
||||
#line 438 "./parse.y"
|
||||
#line 438 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
COMMAND *tc;
|
||||
|
||||
|
@ -1395,191 +1395,191 @@ case 43:
|
|||
;
|
||||
break;}
|
||||
case 44:
|
||||
#line 467 "./parse.y"
|
||||
#line 467 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 45:
|
||||
#line 469 "./parse.y"
|
||||
#line 469 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 46:
|
||||
#line 471 "./parse.y"
|
||||
#line 471 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_while_command (yyvsp[-3].command, yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 47:
|
||||
#line 473 "./parse.y"
|
||||
#line 473 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_until_command (yyvsp[-3].command, yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 48:
|
||||
#line 475 "./parse.y"
|
||||
#line 475 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 49:
|
||||
#line 477 "./parse.y"
|
||||
#line 477 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 50:
|
||||
#line 479 "./parse.y"
|
||||
#line 479 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 51:
|
||||
#line 481 "./parse.y"
|
||||
#line 481 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 52:
|
||||
#line 483 "./parse.y"
|
||||
#line 483 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 53:
|
||||
#line 487 "./parse.y"
|
||||
#line 487 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_for_command (yyvsp[-4].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 54:
|
||||
#line 489 "./parse.y"
|
||||
#line 489 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_for_command (yyvsp[-4].word, add_string_to_list ("$@", (WORD_LIST *)NULL), yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 55:
|
||||
#line 491 "./parse.y"
|
||||
#line 491 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_for_command (yyvsp[-5].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 56:
|
||||
#line 493 "./parse.y"
|
||||
#line 493 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_for_command (yyvsp[-5].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 57:
|
||||
#line 495 "./parse.y"
|
||||
#line 495 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_for_command (yyvsp[-8].word, REVERSE_LIST (yyvsp[-5].word_list, WORD_LIST *), yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 58:
|
||||
#line 497 "./parse.y"
|
||||
#line 497 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_for_command (yyvsp[-8].word, REVERSE_LIST (yyvsp[-5].word_list, WORD_LIST *), yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 59:
|
||||
#line 501 "./parse.y"
|
||||
#line 501 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.command = make_select_command (yyvsp[-4].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command);
|
||||
;
|
||||
break;}
|
||||
case 60:
|
||||
#line 505 "./parse.y"
|
||||
#line 505 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.command = make_select_command (yyvsp[-4].word, add_string_to_list ("$@", (WORD_LIST *)NULL), yyvsp[-1].command);
|
||||
;
|
||||
break;}
|
||||
case 61:
|
||||
#line 509 "./parse.y"
|
||||
#line 509 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.command = make_select_command (yyvsp[-5].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command);
|
||||
;
|
||||
break;}
|
||||
case 62:
|
||||
#line 513 "./parse.y"
|
||||
#line 513 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.command = make_select_command (yyvsp[-5].word, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), yyvsp[-1].command);
|
||||
;
|
||||
break;}
|
||||
case 63:
|
||||
#line 517 "./parse.y"
|
||||
#line 517 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.command = make_select_command (yyvsp[-8].word, (WORD_LIST *)reverse_list (yyvsp[-5].word_list), yyvsp[-1].command);
|
||||
;
|
||||
break;}
|
||||
case 64:
|
||||
#line 521 "./parse.y"
|
||||
#line 521 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.command = make_select_command (yyvsp[-8].word, (WORD_LIST *)reverse_list (yyvsp[-5].word_list), yyvsp[-1].command);
|
||||
;
|
||||
break;}
|
||||
case 65:
|
||||
#line 527 "./parse.y"
|
||||
#line 527 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_case_command (yyvsp[-4].word, (PATTERN_LIST *)NULL); ;
|
||||
break;}
|
||||
case 66:
|
||||
#line 529 "./parse.y"
|
||||
#line 529 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_case_command (yyvsp[-5].word, yyvsp[-2].pattern); ;
|
||||
break;}
|
||||
case 67:
|
||||
#line 531 "./parse.y"
|
||||
#line 531 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_case_command (yyvsp[-4].word, yyvsp[-1].pattern); ;
|
||||
break;}
|
||||
case 68:
|
||||
#line 535 "./parse.y"
|
||||
#line 535 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_function_def (yyvsp[-4].word, yyvsp[0].command, function_dstart, function_bstart); ;
|
||||
break;}
|
||||
case 69:
|
||||
#line 539 "./parse.y"
|
||||
#line 539 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_function_def (yyvsp[-4].word, yyvsp[0].command, function_dstart, function_bstart); ;
|
||||
break;}
|
||||
case 70:
|
||||
#line 542 "./parse.y"
|
||||
#line 542 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_function_def (yyvsp[-2].word, yyvsp[0].command, function_dstart, function_bstart); ;
|
||||
break;}
|
||||
case 71:
|
||||
#line 546 "./parse.y"
|
||||
#line 546 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyvsp[-1].command->flags |= CMD_WANT_SUBSHELL; yyval.command = yyvsp[-1].command; ;
|
||||
break;}
|
||||
case 72:
|
||||
#line 550 "./parse.y"
|
||||
#line 550 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_if_command (yyvsp[-3].command, yyvsp[-1].command, (COMMAND *)NULL); ;
|
||||
break;}
|
||||
case 73:
|
||||
#line 552 "./parse.y"
|
||||
#line 552 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_if_command (yyvsp[-5].command, yyvsp[-3].command, yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 74:
|
||||
#line 554 "./parse.y"
|
||||
#line 554 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_if_command (yyvsp[-4].command, yyvsp[-2].command, yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 75:
|
||||
#line 559 "./parse.y"
|
||||
#line 559 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_group_command (yyvsp[-1].command); ;
|
||||
break;}
|
||||
case 76:
|
||||
#line 563 "./parse.y"
|
||||
#line 563 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_if_command (yyvsp[-2].command, yyvsp[0].command, (COMMAND *)NULL); ;
|
||||
break;}
|
||||
case 77:
|
||||
#line 565 "./parse.y"
|
||||
#line 565 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_if_command (yyvsp[-4].command, yyvsp[-2].command, yyvsp[0].command); ;
|
||||
break;}
|
||||
case 78:
|
||||
#line 567 "./parse.y"
|
||||
#line 567 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = make_if_command (yyvsp[-3].command, yyvsp[-1].command, yyvsp[0].command); ;
|
||||
break;}
|
||||
case 80:
|
||||
#line 572 "./parse.y"
|
||||
#line 572 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyvsp[0].pattern->next = yyvsp[-1].pattern; yyval.pattern = yyvsp[0].pattern; ;
|
||||
break;}
|
||||
case 81:
|
||||
#line 576 "./parse.y"
|
||||
#line 576 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.pattern = make_pattern_list (yyvsp[-2].word_list, yyvsp[0].command); ;
|
||||
break;}
|
||||
case 82:
|
||||
#line 578 "./parse.y"
|
||||
#line 578 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.pattern = make_pattern_list (yyvsp[-2].word_list, (COMMAND *)NULL); ;
|
||||
break;}
|
||||
case 83:
|
||||
#line 580 "./parse.y"
|
||||
#line 580 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.pattern = make_pattern_list (yyvsp[-2].word_list, yyvsp[0].command); ;
|
||||
break;}
|
||||
case 84:
|
||||
#line 582 "./parse.y"
|
||||
#line 582 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.pattern = make_pattern_list (yyvsp[-2].word_list, (COMMAND *)NULL); ;
|
||||
break;}
|
||||
case 86:
|
||||
#line 587 "./parse.y"
|
||||
#line 587 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyvsp[-1].pattern->next = yyvsp[-2].pattern; yyval.pattern = yyvsp[-1].pattern; ;
|
||||
break;}
|
||||
case 87:
|
||||
#line 591 "./parse.y"
|
||||
#line 591 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.word_list = make_word_list (yyvsp[0].word, (WORD_LIST *)NULL); ;
|
||||
break;}
|
||||
case 88:
|
||||
#line 593 "./parse.y"
|
||||
#line 593 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.word_list = make_word_list (yyvsp[0].word, yyvsp[-2].word_list); ;
|
||||
break;}
|
||||
case 89:
|
||||
#line 602 "./parse.y"
|
||||
#line 602 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.command = yyvsp[0].command;
|
||||
if (need_here_doc)
|
||||
|
@ -1587,13 +1587,13 @@ case 89:
|
|||
;
|
||||
break;}
|
||||
case 91:
|
||||
#line 611 "./parse.y"
|
||||
#line 611 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.command = yyvsp[0].command;
|
||||
;
|
||||
break;}
|
||||
case 93:
|
||||
#line 618 "./parse.y"
|
||||
#line 618 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
if (yyvsp[-2].command->type == cm_connection)
|
||||
yyval.command = connect_async_list (yyvsp[-2].command, (COMMAND *)NULL, '&');
|
||||
|
@ -1602,15 +1602,15 @@ case 93:
|
|||
;
|
||||
break;}
|
||||
case 95:
|
||||
#line 629 "./parse.y"
|
||||
#line 629 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, AND_AND); ;
|
||||
break;}
|
||||
case 96:
|
||||
#line 631 "./parse.y"
|
||||
#line 631 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, OR_OR); ;
|
||||
break;}
|
||||
case 97:
|
||||
#line 633 "./parse.y"
|
||||
#line 633 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
if (yyvsp[-3].command->type == cm_connection)
|
||||
yyval.command = connect_async_list (yyvsp[-3].command, yyvsp[0].command, '&');
|
||||
|
@ -1619,19 +1619,19 @@ case 97:
|
|||
;
|
||||
break;}
|
||||
case 98:
|
||||
#line 640 "./parse.y"
|
||||
#line 640 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, ';'); ;
|
||||
break;}
|
||||
case 99:
|
||||
#line 642 "./parse.y"
|
||||
#line 642 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, ';'); ;
|
||||
break;}
|
||||
case 100:
|
||||
#line 644 "./parse.y"
|
||||
#line 644 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 106:
|
||||
#line 663 "./parse.y"
|
||||
#line 663 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.command = yyvsp[0].command;
|
||||
if (need_here_doc)
|
||||
|
@ -1639,7 +1639,7 @@ case 106:
|
|||
;
|
||||
break;}
|
||||
case 107:
|
||||
#line 669 "./parse.y"
|
||||
#line 669 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
if (yyvsp[-1].command->type == cm_connection)
|
||||
yyval.command = connect_async_list (yyvsp[-1].command, (COMMAND *)NULL, '&');
|
||||
|
@ -1650,7 +1650,7 @@ case 107:
|
|||
;
|
||||
break;}
|
||||
case 108:
|
||||
#line 678 "./parse.y"
|
||||
#line 678 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyval.command = yyvsp[-1].command;
|
||||
if (need_here_doc)
|
||||
|
@ -1658,15 +1658,15 @@ case 108:
|
|||
;
|
||||
break;}
|
||||
case 109:
|
||||
#line 686 "./parse.y"
|
||||
#line 686 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, AND_AND); ;
|
||||
break;}
|
||||
case 110:
|
||||
#line 688 "./parse.y"
|
||||
#line 688 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, OR_OR); ;
|
||||
break;}
|
||||
case 111:
|
||||
#line 690 "./parse.y"
|
||||
#line 690 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
if (yyvsp[-2].command->type == cm_connection)
|
||||
yyval.command = connect_async_list (yyvsp[-2].command, yyvsp[0].command, '&');
|
||||
|
@ -1675,59 +1675,59 @@ case 111:
|
|||
;
|
||||
break;}
|
||||
case 112:
|
||||
#line 697 "./parse.y"
|
||||
#line 697 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = command_connect (yyvsp[-2].command, yyvsp[0].command, ';'); ;
|
||||
break;}
|
||||
case 113:
|
||||
#line 700 "./parse.y"
|
||||
#line 700 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 114:
|
||||
#line 704 "./parse.y"
|
||||
#line 704 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 115:
|
||||
#line 706 "./parse.y"
|
||||
#line 706 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyvsp[0].command->flags |= CMD_INVERT_RETURN;
|
||||
yyval.command = yyvsp[0].command;
|
||||
;
|
||||
break;}
|
||||
case 116:
|
||||
#line 711 "./parse.y"
|
||||
#line 711 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyvsp[0].command->flags |= yyvsp[-1].number;
|
||||
yyval.command = yyvsp[0].command;
|
||||
;
|
||||
break;}
|
||||
case 117:
|
||||
#line 716 "./parse.y"
|
||||
#line 716 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyvsp[0].command->flags |= yyvsp[-2].number;
|
||||
yyval.command = yyvsp[0].command;
|
||||
;
|
||||
break;}
|
||||
case 118:
|
||||
#line 721 "./parse.y"
|
||||
#line 721 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{
|
||||
yyvsp[0].command->flags |= yyvsp[-1].number|CMD_INVERT_RETURN;
|
||||
yyval.command = yyvsp[0].command;
|
||||
;
|
||||
break;}
|
||||
case 119:
|
||||
#line 729 "./parse.y"
|
||||
#line 729 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = command_connect (yyvsp[-3].command, yyvsp[0].command, '|'); ;
|
||||
break;}
|
||||
case 120:
|
||||
#line 731 "./parse.y"
|
||||
#line 731 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.command = yyvsp[0].command; ;
|
||||
break;}
|
||||
case 121:
|
||||
#line 735 "./parse.y"
|
||||
#line 735 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.number = CMD_TIME_PIPELINE; ;
|
||||
break;}
|
||||
case 122:
|
||||
#line 737 "./parse.y"
|
||||
#line 737 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
{ yyval.number = CMD_TIME_PIPELINE|CMD_TIME_POSIX; ;
|
||||
break;}
|
||||
}
|
||||
|
@ -1928,7 +1928,7 @@ yyerrhandle:
|
|||
yystate = yyn;
|
||||
goto yynewstate;
|
||||
}
|
||||
#line 739 "./parse.y"
|
||||
#line 739 "/usr/homes/chet/src/bash/bash-2.01.1/parse.y"
|
||||
|
||||
|
||||
/* Possible states for the parser that require it to do special things. */
|
||||
|
@ -3722,7 +3722,7 @@ read_token_word (character)
|
|||
|
||||
#if defined (ARRAY_VARS)
|
||||
/* Identify possible compound array variable assignment. */
|
||||
else if (character == '=')
|
||||
else if (character == '=' && token_index > 0)
|
||||
{
|
||||
peek_char = shell_getc (1);
|
||||
if (peek_char == '(') /* ) */
|
||||
|
@ -4270,6 +4270,7 @@ decode_prompt_string (string)
|
|||
{
|
||||
/* Use the value of PWD because it is much more efficient. */
|
||||
char t_string[PATH_MAX];
|
||||
int tlen;
|
||||
|
||||
temp = get_string_value ("PWD");
|
||||
|
||||
|
@ -4278,11 +4279,17 @@ decode_prompt_string (string)
|
|||
if (getcwd (t_string, sizeof(t_string)) == 0)
|
||||
{
|
||||
t_string[0] = '.';
|
||||
t_string[1] = '\0';
|
||||
}
|
||||
tlen = 1;
|
||||
}
|
||||
else
|
||||
strcpy (t_string, temp);
|
||||
tlen = strlen (t_string);
|
||||
}
|
||||
else
|
||||
{
|
||||
tlen = sizeof (t_string) - 1;
|
||||
strncpy (t_string, temp, tlen);
|
||||
}
|
||||
t_string[tlen] = '\0';
|
||||
|
||||
if (c == 'W')
|
||||
{
|
||||
|
@ -4291,6 +4298,8 @@ decode_prompt_string (string)
|
|||
strcpy (t_string, t + 1);
|
||||
}
|
||||
else
|
||||
/* polite_directory_format is guaranteed to return a string
|
||||
no longer than PATH_MAX - 1 characters. */
|
||||
strcpy (t_string, polite_directory_format (t_string));
|
||||
|
||||
/* If we're going to be expanding the prompt string later,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue