Imported from ../bash-2.03.tar.gz.
This commit is contained in:
parent
bc4cd23ce9
commit
b72432fdcc
191 changed files with 10113 additions and 3553 deletions
321
CHANGES
321
CHANGES
|
|
@ -1,3 +1,322 @@
|
|||
This document details the changes between this version, bash-2.03-release,
|
||||
and the previous version, bash-2.03-beta2.
|
||||
|
||||
1. Changes to Bash
|
||||
|
||||
a. A file descriptor leak in the `fc' builtin was fixed.
|
||||
|
||||
b. A bug was fixed in the `read' builtin that caused occasional spurious
|
||||
failures when using `read -e'.
|
||||
|
||||
c. The version code needed to use the value of the cpp variable
|
||||
CONF_MACHTYPE rather than MACHTYPE.
|
||||
|
||||
d. A new test was added to exercise the command printing and copying code.
|
||||
|
||||
e. A bug was fixed that caused `time' to be recognized as a reserved word
|
||||
if it was the first pattern in a `case' statement pattern list.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
This document details the changes between this version, bash-2.03-beta2,
|
||||
and the previous version, bash-2.03-beta1.
|
||||
|
||||
1. Changes to Bash
|
||||
|
||||
a. Slight additions to support/shobj-conf, mostly for the benefit of AIX 4.2.
|
||||
|
||||
b. config.{guess,sub} support added for the NEC SX4.
|
||||
|
||||
c. Changed some of the cross-compiling sections of the configure macros in
|
||||
aclocal.m4 so that configure won't abort.
|
||||
|
||||
d. Slight changes to how the HTML versions of the bash and readline manuals
|
||||
are generated.
|
||||
|
||||
e. Fixed conditional command printing to avoid interpreting printf `%'-escapes
|
||||
in arguments to [[.
|
||||
|
||||
f. Don't include the bash malloc on all variants of the alpha processor.
|
||||
|
||||
g. Changes to configure to make --enable-profiling work on Solaris 2.x.
|
||||
|
||||
h. Fixed a bug that manifested itself when shell functions were called
|
||||
between calls to `getopts'.
|
||||
|
||||
i. Fixed pattern substitution so that a bare `#'as a pattern causes the
|
||||
replacement string to be prefixed to the search string, and a bare
|
||||
`%' causes the replacement string to be appended to the search string.
|
||||
|
||||
j. Fixed a bug in the command execution code that caused child processes
|
||||
to occasionally have the wrong value for $!.
|
||||
|
||||
2. Changes to Readline
|
||||
|
||||
a. Added code to the history library to catch history substitutions using
|
||||
`&' without a previous history substitution or search having been
|
||||
performed.
|
||||
|
||||
3. New Features in Bash
|
||||
|
||||
4. New Features in Readline
|
||||
|
||||
a. New bindable variable: `isearch-terminators'.
|
||||
|
||||
b. New bindable function: `forward-backward-delete-char' (unbound by default).
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
This document details the changes between this version, bash-2.03-beta1,
|
||||
and the previous version, bash-2.03-alpha.
|
||||
|
||||
1. Changes to Bash
|
||||
|
||||
a. A change was made to the help text for `{...}' to make it clear that a
|
||||
semicolon is required before the closing brace.
|
||||
|
||||
b. A fix was made to the `test' builtin so that syntax errors cause test
|
||||
to return an exit status > 1.
|
||||
|
||||
c. Globbing is no longer performed on assignment statements that appear as
|
||||
arguments to `assignment builtins' such as `export'.
|
||||
|
||||
d. System-specific configuration changes were made for: Rhapsody,
|
||||
AIX 4.2/gcc, BSD/OS 4.0.
|
||||
|
||||
e. New loadable builtins: ln, unlink.
|
||||
|
||||
f. Some fixes were made to the globbing code to handle extended glob patterns
|
||||
which immediately follow a `*'.
|
||||
|
||||
g. A fix was made to the command printing code to ensure that redirections
|
||||
following compound commands have a space separating them from the rest
|
||||
of the command.
|
||||
|
||||
h. The pathname canonicalization code was changed to produce fewer leading
|
||||
`//' sequences, since those are interpreted as network file system
|
||||
pathnames on some systems.
|
||||
|
||||
i. A fix was made so that loops containing `eval' commands in commands passed
|
||||
to `bash -c' would not exit prematurely.
|
||||
|
||||
j. Some changes were made to the job reaping code when the shell is not
|
||||
interactive, so the shell will retain exit statuses longer for examination
|
||||
by `wait'.
|
||||
|
||||
k. A fix was made so that `jobs | command' works again.
|
||||
|
||||
l. The erroneous compound array assignment var=((...)) is now a syntax error.
|
||||
|
||||
m. A change was made to the dynamic loading code in `enable' to support
|
||||
Tenon's MachTen.
|
||||
|
||||
n. A fix was made to the globbing code so that extended globbing patterns
|
||||
will correctly match `.' in a bracket expression.
|
||||
|
||||
2. Changes to Readline
|
||||
|
||||
a. A fix was made to the completion code in which a typo caused the wrong
|
||||
value to be passed to the function that computed the longest common
|
||||
prefix of the list of matches.
|
||||
|
||||
b. The completion code now checks the value of rl_filename_completion_desired,
|
||||
which is set by application-supplied completion functions to indicate
|
||||
that filename completion is being performed, to decide whether or not to
|
||||
call an application-supplied `ignore completions' function.
|
||||
|
||||
3. New Features in Bash
|
||||
|
||||
a. A change was made to the startup file code so that any shell begun with
|
||||
the `--login' option, even non-interactive shells, will source the login
|
||||
shell startup files.
|
||||
|
||||
4. New Features in Readline
|
||||
|
||||
a. A new variable, rl_erase_empty_line, which, if set by an application using
|
||||
readline, will cause readline to erase, prompt and all, lines on which the
|
||||
only thing typed was a newline.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
This document details the changes between this version, bash-2.03-alpha,
|
||||
and the previous version, bash-2.02.1-release.
|
||||
|
||||
1. Changes to Bash
|
||||
|
||||
a. System-specific configuration changes were made for: Irix 6.x, Unixware 7.
|
||||
|
||||
b. The texi2dvi and texi2html scripts were updated to the latest versions
|
||||
from the net.
|
||||
|
||||
c. The configure tests that determine which native type is 32 bits were
|
||||
changed to not require a compiled program.
|
||||
|
||||
d. Fixed a bug in shell_execve that could cause memory to be freed twice
|
||||
after a failed exec.
|
||||
|
||||
e. The `printf' test uses `diff -a' if it's available to prevent confusion
|
||||
due to the non-ascii output.
|
||||
|
||||
f. Shared object configuration is now performed by a shell script,
|
||||
support/shobj-conf, which generates values to be substituted into
|
||||
makefiles by configure.
|
||||
|
||||
g. Some changes were made to `ulimit' to avoid the use of RLIM_INVALID as a
|
||||
return value.
|
||||
|
||||
h. Changes were made to `ulimit' to work around HPUX 9.x's peculiar
|
||||
handling of RLIMIT_FILESIZE.
|
||||
|
||||
i. Some new loadable builtins were added: id, printenv, sync, whoami, push,
|
||||
mkdir. `pushd', `popd', and `dirs' can now be built as regular or
|
||||
loadable builtins from the same source file.
|
||||
|
||||
j. Changes were made to `printf' to handle NUL bytes in the expanded format
|
||||
string.
|
||||
|
||||
k. The various `make clean' Makefile targets now descend into lib/sh.
|
||||
|
||||
l. The `type' builtin was changed to use the internal `getopt' so that things
|
||||
like `type -ap' work as expected.
|
||||
|
||||
m. There is a new configuration option, --with-installed-readline, to link
|
||||
bash with a locally-installed version of readline. Only readline version
|
||||
4.0 and later releases can support this. Shared and static libraries
|
||||
are supported. The installed include files are used.
|
||||
|
||||
n. There is a new autoconf macro used to find which basic type is 64 bits.
|
||||
|
||||
o. Dynamic linking and loadable builtins should now work on SCO 3.2v5*,
|
||||
AIX 4.2 with gcc, Unixware 7, and many other systems using gcc, where
|
||||
the `-shared' options works correctly.
|
||||
|
||||
p. A bug was fixed in the bash filename completion code that caused memory to
|
||||
be freed twice if a directory name containing an unset variable was
|
||||
completed and the -u option was set.
|
||||
|
||||
q. The prompt expansion code now quotes the `$' in the `\$' expansion so it
|
||||
is not processed by subsequent parameter expansion.
|
||||
|
||||
r. Fixed a parsing bug that caused a single or double quote after a `$$' to
|
||||
trigger ANSI C expansion or locale translation.
|
||||
|
||||
s. Fixed a bug in the globbing code that caused quoted filenames containing
|
||||
no globbing characters to sometimes be incorrectly expanded.
|
||||
|
||||
t. Changes to the default prompt strings if prompt string decoding is not
|
||||
compiled into the shell.
|
||||
|
||||
u. Added `do', `then', `else', `{', and `(' to the list of keywords that may
|
||||
precede the `time' reserved word.
|
||||
|
||||
v. The shell may now be cross-built for BeOS as well as cygwin32.
|
||||
|
||||
w. The conditional command execution code now treats `=' the same as `=='
|
||||
for deciding when to perform pattern matching.
|
||||
|
||||
x. The `-e' option no longer causes the shell to exit if a command exits
|
||||
with a non-zero status while running the startup files.
|
||||
|
||||
y. The `printf' builtin no longer dumps core if a modifier is supplied in
|
||||
the format string without a conversion character (e.g. `%h').
|
||||
|
||||
z. Array assignments of the form a=(...) no longer show up in the history
|
||||
list.
|
||||
|
||||
aa. The parser was fixed to obey the POSIX.2 rules for finding the closing
|
||||
`}' in a ${...} expression.
|
||||
|
||||
bb. The history file is now opened with mode 0600 rather than 0666, so bash
|
||||
no longer relies on the user's umask being set appropriately.
|
||||
|
||||
cc. Setting LANG no longer causes LC_ALL to be assigned a value; bash now
|
||||
relies on proper behavior from the C library.
|
||||
|
||||
dd. Minor changes were made to allow quoted variable expansions using
|
||||
${...} to be completed correctly if there is no closing `"'.
|
||||
|
||||
ee. Changes were made to builtins/Makefile.in so that configuring the shell
|
||||
with `--enable-profiling' works right and builtins/mkbuiltins is
|
||||
generated.
|
||||
|
||||
2. Changes to Readline
|
||||
|
||||
a. The version number is now 4.0.
|
||||
|
||||
b. There is no longer any #ifdef SHELL code in the source files.
|
||||
|
||||
c. Some changes were made to the key binding code to fix memory leaks and
|
||||
better support Win32 systems.
|
||||
|
||||
d. Fixed a silly typo in the paren matching code -- it's microseconds, not
|
||||
milliseconds.
|
||||
|
||||
e. The readline library should be compilable by C++ compilers.
|
||||
|
||||
f. The readline.h public header file now includes function prototypes for
|
||||
all readline functions, and some changes were made to fix errors in the
|
||||
source files uncovered by the use of prototypes.
|
||||
|
||||
g. The maximum numeric argument is now clamped at 1000000.
|
||||
|
||||
h. Fixes to rl_yank_last_arg to make it behave better.
|
||||
|
||||
i. Fixed a bug in the display code that caused core dumps if the prompt
|
||||
string length exceeded 1024 characters.
|
||||
|
||||
j. The menu completion code was fixed to properly insert a single completion
|
||||
if there is only one match.
|
||||
|
||||
k. A bug was fixed that caused the display code to improperly display tabs
|
||||
after newlines.
|
||||
|
||||
3. New Features in Bash
|
||||
|
||||
a. New `shopt' option, `restricted_shell', indicating whether or not the
|
||||
shell was started in restricted mode, for use in startup files.
|
||||
|
||||
b. Filename generation is now performed on the words between ( and ) in
|
||||
array assignments (which it probably should have done all along).
|
||||
|
||||
c. OLDPWD is now auto-exported, as POSIX.2 seems to require.
|
||||
|
||||
d. ENV and BASH_ENV are read-only variables in a restricted shell.
|
||||
|
||||
4. New Features in Readline
|
||||
|
||||
a. Many changes to the signal handling:
|
||||
o Readline now catches SIGQUIT and cleans up the tty before returning;
|
||||
o A new variable, rl_catch_signals, is available to application writers
|
||||
to indicate to readline whether or not it should install its own
|
||||
signal handlers for SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP,
|
||||
SIGTTIN, and SIGTTOU;
|
||||
o A new variable, rl_catch_sigwinch, is available to application
|
||||
writers to indicate to readline whether or not it should install its
|
||||
own signal handler for SIGWINCH, which will chain to the calling
|
||||
applications's SIGWINCH handler, if one is installed;
|
||||
o There is a new function, rl_free_line_state, for application signal
|
||||
handlers to call to free up the state associated with the current
|
||||
line after receiving a signal;
|
||||
o There is a new function, rl_cleanup_after_signal, to clean up the
|
||||
display and terminal state after receiving a signal;
|
||||
o There is a new function, rl_reset_after_signal, to reinitialize the
|
||||
terminal and display state after an application signal handler
|
||||
returns and readline continues
|
||||
|
||||
b. There is a new function, rl_resize_terminal, to reset readline's idea of
|
||||
the screen size after a SIGWINCH.
|
||||
|
||||
c. New public functions: rl_save_prompt and rl_restore_prompt. These were
|
||||
previously private functions with a `_' prefix.
|
||||
|
||||
d. New function hook: rl_pre_input_hook, called just before readline starts
|
||||
reading input, after initialization.
|
||||
|
||||
e. New function hook: rl_display_matches_hook, called when readline would
|
||||
display the list of completion matches. The new function
|
||||
rl_display_match_list is what readline uses internally, and is available
|
||||
for use by application functions called via this hook.
|
||||
|
||||
f. New bindable function, delete-char-or-list, like tcsh.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
This document details the changes between this version, bash-2.02.1-release,
|
||||
and the previous version, bash-2.02-release.
|
||||
|
||||
|
|
@ -795,7 +1114,7 @@ x. A fix was made to the command timing code so that `time' can be used in
|
|||
a loop.
|
||||
|
||||
y. A fix was made to the parser so that `((cmd); cmd2)' is now parsed as
|
||||
a nested subshell rather than strictly as an (errnoeous) arithmetic
|
||||
a nested subshell rather than strictly as an (erroneous) arithmetic
|
||||
command.
|
||||
|
||||
z. A fix was made to the globbing code so that it correctly matches quoted
|
||||
|
|
|
|||
21
COMPAT
21
COMPAT
|
|
@ -1,7 +1,7 @@
|
|||
This document details the incompatibilites between this version of bash,
|
||||
bash-2.01, and the previous widely-available version, bash-1.14. These
|
||||
were discovered by alpha and beta testers, so they will likely be
|
||||
encountered by a significant number of users.
|
||||
bash-2.03, and the previous widely-available version, bash-1.14 (which
|
||||
is still the `standard' version for many Linux distributions). These
|
||||
were discovered by users of bash-2.x, so this list is not comprehensive.
|
||||
|
||||
1. Bash now uses a new quoting syntax, $"...", to do locale-specific
|
||||
string translation. Users who have relied on the (undocumented)
|
||||
|
|
@ -63,9 +63,11 @@ encountered by a significant number of users.
|
|||
"\C-\\": self-insert
|
||||
|
||||
6. A number of people complained above having to use ESC to terminate an
|
||||
incremental search, and asked for an alternate mechanism. Bash-2.0
|
||||
allows ^J to terminate the search without accepting the line. Use
|
||||
^M to terminate the search and accept the line, as in bash-1.14.
|
||||
incremental search, and asked for an alternate mechanism. Bash-2.03
|
||||
uses the value of the settable readline variable `isearch-terminators'
|
||||
to decide which characters should terminate an incremental search. If
|
||||
that variable has not been set, ESC and Control-J will terminate a
|
||||
search.
|
||||
|
||||
7. Some variables have been removed: MAIL_WARNING, notify, history_control,
|
||||
command_oriented_history, glob_dot_filenames, allow_null_glob_expansion,
|
||||
|
|
@ -115,3 +117,10 @@ encountered by a significant number of users.
|
|||
|
||||
An interactive shell started in posix mode reads and executes commands
|
||||
from the file named by $ENV.
|
||||
|
||||
11. The <> redirection operator was changed to conform to the POSIX.2 spec.
|
||||
In the absence of any file descriptor specification preceding the `<>',
|
||||
file descriptor 0 is used. In bash-1.14, this was the behavior only
|
||||
when in POSIX mode. The bash-1.14 behavior may be obtained with
|
||||
|
||||
<>filename 1>&0
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@ The following list is what's changed when `POSIX mode' is in effect:
|
|||
performed on the values of `PS1' and `PS2' regardless of the
|
||||
setting of the `promptvars' option.
|
||||
|
||||
6. Interactive comments are enabled by default. (Note that Bash has
|
||||
them on by default anyway.)
|
||||
6. Interactive comments are enabled by default. (Bash has them on by
|
||||
default anyway.)
|
||||
|
||||
7. The POSIX.2 startup files are executed (`$ENV') rather than the
|
||||
normal Bash files.
|
||||
|
|
|
|||
|
|
@ -14,4 +14,7 @@ modification.
|
|||
sh-redir-hack - diff to parse.y to get redirections before
|
||||
compound commands
|
||||
|
||||
empty-for-wordlist - diff to parse.y to allow an empty wordlist after
|
||||
the `in' keyword in a `for' statement
|
||||
|
||||
mh-folder-comp - diffs that reportedly add MH folder completion
|
||||
|
|
|
|||
1478
CWRU/changelog
1478
CWRU/changelog
File diff suppressed because it is too large
Load diff
25
CWRU/empty-for-wordlist
Normal file
25
CWRU/empty-for-wordlist
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
This patch is from Brian Fox, in reply to an email message from
|
||||
"Marcin 'Qrczak' Kowalczyk" <qrczak@knm.org.pl>, who wrote:
|
||||
|
||||
I think that bash should accept such a syntax:
|
||||
|
||||
for var in ; do command; done
|
||||
|
||||
Of course it should do nothing. It would simplify some scripts.
|
||||
|
||||
Here is a patch for those who wish it:
|
||||
|
||||
*** parse.y.~1~ Wed Mar 4 09:39:46 1998
|
||||
--- parse.y Mon Jul 13 14:40:23 1998
|
||||
***************
|
||||
*** 495,500 ****
|
||||
--- 495,504 ----
|
||||
{ $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9); }
|
||||
| FOR WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}'
|
||||
{ $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9); }
|
||||
+ | FOR WORD newline_list IN list_terminator newline_list DO compound_list DONE
|
||||
+ { $$ = make_for_command ($2, (WORD_LIST *)NULL, $8); }
|
||||
+ | FOR WORD newline_list IN list_terminator newline_list '{' compound_list '}'
|
||||
+ { $$ = make_for_command ($2, (WORD_LIST *)NULL, $8); }
|
||||
;
|
||||
|
||||
39
CWRU/misc/errlist.c
Normal file
39
CWRU/misc/errlist.c
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* If necessary, link with lib/sh/libsh.a
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
extern char *strerror();
|
||||
|
||||
extern int sys_nerr;
|
||||
|
||||
int
|
||||
main(c, v)
|
||||
int c;
|
||||
char **v;
|
||||
{
|
||||
int i, n;
|
||||
|
||||
if (c == 1) {
|
||||
for (i = 1; i < sys_nerr; i++)
|
||||
printf("%d --> %s\n", i, strerror(i));
|
||||
} else {
|
||||
for (i = 1; i < c; i++) {
|
||||
n = atoi(v[i]);
|
||||
printf("%d --> %s\n", n, strerror(n));
|
||||
}
|
||||
}
|
||||
exit (0);
|
||||
}
|
||||
|
||||
programming_error(a, b)
|
||||
char *a;
|
||||
int b;
|
||||
{
|
||||
}
|
||||
|
||||
fatal_error()
|
||||
{
|
||||
}
|
||||
45
CWRU/misc/hpux10-dlfcn.h
Normal file
45
CWRU/misc/hpux10-dlfcn.h
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* HPUX 10.x stubs to implement dl* in terms of shl*
|
||||
*
|
||||
* Not needed for later versions; HPUX 11.x has dlopen() and friends.
|
||||
*
|
||||
* configure also needs to be faked out. You can create a dummy libdl.a
|
||||
* with stub entries for dlopen, dlclose, dlsym, and dlerror:
|
||||
*
|
||||
* int dlopen() { return(0);}
|
||||
* int dlclose() { return(0);}
|
||||
* int dlsym() { return(0);}
|
||||
* int dlerror() { return(0);}
|
||||
*
|
||||
* This has not been tested; I just read the manual page and coded this up.
|
||||
*
|
||||
* According to the ld manual page, you need to link bash with -dld and add
|
||||
* the -E flag to LOCAL_LDFLAGS.
|
||||
*/
|
||||
|
||||
#if !defined (__HPUX10_DLFCN_H__)
|
||||
|
||||
#define __HPUX10_DLFCN_H__
|
||||
|
||||
#include <dl.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#define RTLD_LAZY BIND_DEFERRED
|
||||
#define RTLD_NOW BIND_IMMEDIATE
|
||||
#define RTLD_GLOBAL DYNAMIC_PATH
|
||||
|
||||
char *bash_global_sym_addr;
|
||||
|
||||
#define dlopen(file,mode) (void *)shl_load((file), (mode), 0L)
|
||||
|
||||
#define dlclose(handle) shl_unload((shl_t)(handle))
|
||||
|
||||
#define dlsym(handle,name) (bash_global_sym_addr=0,shl_findsym((shl_t *)&(handle),name,TYPE_UNDEFINED,&bash_global_sym_addr), (void *)bash_global_sym_addr)
|
||||
|
||||
#define dlerror() strerror(errno)
|
||||
|
||||
#endif /* __HPUX10_DLFCN_H__ */
|
||||
69
INSTALL
69
INSTALL
|
|
@ -16,10 +16,10 @@ compiler output (useful mainly for debugging `configure'). If at some
|
|||
point `config.cache' contains results you don't want to keep, you may
|
||||
remove or edit it.
|
||||
|
||||
If you need to do unusual things to compile the package, please try to
|
||||
figure out how `configure' could check whether or not to do them, and
|
||||
mail diffs or instructions to `bash-maintainers@prep.ai.mit.edu' so
|
||||
they can be considered for the next release.
|
||||
If you need to do unusual things to compile Bash, please try to figure
|
||||
out how `configure' could check whether or not to do them, and mail
|
||||
diffs or instructions to <bash-maintainers@gnu.org> so they can be
|
||||
considered for the next release.
|
||||
|
||||
The file `configure.in' is used to create `configure' by a program
|
||||
called Autoconf. You only need `configure.in' if you want to change it
|
||||
|
|
@ -29,8 +29,8 @@ this, make sure you are using Autoconf version 2.10 or newer.
|
|||
If you need to change `configure.in' or regenerate `configure', you
|
||||
will need to create two files: `_distribution' and `_patchlevel'.
|
||||
`_distribution' should contain the major and minor version numbers of
|
||||
the Bash distribution, for example `2.02'. `_patchlevel' should
|
||||
contain the patch level of the Bash distribution, `1' for example. The
|
||||
the Bash distribution, for example `2.01'. `_patchlevel' should
|
||||
contain the patch level of the Bash distribution, `0' for example. The
|
||||
script `support/mkconffiles' has been provided to automate the creation
|
||||
of these files.
|
||||
|
||||
|
|
@ -115,17 +115,17 @@ than `/usr/local' by giving `configure' the option `--prefix=PATH'.
|
|||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
||||
`PATH' as the prefix for installing programs and libraries.
|
||||
give `configure' the option `--exec-prefix=PATH', `make install' will
|
||||
use `PATH' as the prefix for installing programs and libraries.
|
||||
Documentation and other data files will still use the regular prefix.
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' can not figure out
|
||||
automatically, but needs to determine by the type of host the package
|
||||
will run on. Usually `configure' can figure that out, but if it prints
|
||||
a message saying it can not guess the host type, give it the
|
||||
automatically, but needs to determine by the type of host Bash will run
|
||||
on. Usually `configure' can figure that out, but if it prints a
|
||||
message saying it can not guess the host type, give it the
|
||||
`--host=TYPE' option. `TYPE' can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name with three fields:
|
||||
`CPU-COMPANY-SYSTEM' (e.g., `sparc-sun-sunos4.1.2').
|
||||
|
|
@ -177,12 +177,11 @@ Optional Features
|
|||
=================
|
||||
|
||||
The Bash `configure' has a number of `--enable-FEATURE' options, where
|
||||
FEATURE indicates an optional part of the package. There are also
|
||||
several `--with-PACKAGE' options, where PACKAGE is something like
|
||||
`gnu-malloc' or `purify' (for the Purify memory allocation checker). To
|
||||
turn off the default use of a package, use `--without-PACKAGE'. To
|
||||
configure Bash without a feature that is enabled by default, use
|
||||
`--disable-FEATURE'.
|
||||
FEATURE indicates an optional part of Bash. There are also several
|
||||
`--with-PACKAGE' options, where PACKAGE is something like `gnu-malloc'
|
||||
or `purify'. To turn off the default use of a package, use
|
||||
`--without-PACKAGE'. To configure Bash without a feature that is
|
||||
enabled by default, use `--disable-FEATURE'.
|
||||
|
||||
Here is a complete list of the `--enable-' and `--with-' options that
|
||||
the Bash `configure' recognizes.
|
||||
|
|
@ -212,6 +211,11 @@ the Bash `configure' recognizes.
|
|||
for which this should be turned off, and `configure' disables this
|
||||
option automatically for a number of systems.
|
||||
|
||||
`--with-installed-readline'
|
||||
Define this to make bash link with a locally-installed version of
|
||||
Readline rather than the version in lib/readline. This works only
|
||||
with readline 4.0 and later versions.
|
||||
|
||||
`--with-purify'
|
||||
Define this to use the Purify memory allocation checker from Pure
|
||||
Software.
|
||||
|
|
@ -241,16 +245,19 @@ does not provide the necessary support.
|
|||
|
||||
`--enable-alias'
|
||||
Allow alias expansion and include the `alias' and `unalias'
|
||||
builtins.
|
||||
builtins (*note Aliases::.).
|
||||
|
||||
`--enable-array-variables'
|
||||
Include support for one-dimensional array shell variables.
|
||||
Include support for one-dimensional array shell variables (*note
|
||||
Arrays::.).
|
||||
|
||||
`--enable-bang-history'
|
||||
Include support for `csh'-like history substitution.
|
||||
Include support for `csh'-like history substitution (*note History
|
||||
Interaction::.).
|
||||
|
||||
`--enable-brace-expansion'
|
||||
Include `csh'-like brace expansion ( `b{a,b}c' ==> `bac bbc' ).
|
||||
See *Note Brace Expansion::, for a complete description.
|
||||
|
||||
`--enable-command-timing'
|
||||
Include support for recognizing `time' as a reserved word and for
|
||||
|
|
@ -259,11 +266,12 @@ does not provide the necessary support.
|
|||
be timed.
|
||||
|
||||
`--enable-cond-command'
|
||||
Include support for the `[[' conditional command.
|
||||
Include support for the `[[' conditional command (*note
|
||||
Conditional Constructs::.).
|
||||
|
||||
`--enable-directory-stack'
|
||||
Include support for a `csh'-like directory stack and the `pushd',
|
||||
`popd', and `dirs' builtins.
|
||||
`popd', and `dirs' builtins (*note The Directory Stack::.).
|
||||
|
||||
`--enable-disabled-builtins'
|
||||
Allow builtin commands to be invoked via `builtin xxx' even after
|
||||
|
|
@ -272,7 +280,8 @@ does not provide the necessary support.
|
|||
commands.
|
||||
|
||||
`--enable-dparen-arithmetic'
|
||||
Include support for the `ksh' `((...))' command.
|
||||
Include support for the `((...))' command (*note Conditional
|
||||
Constructs::.).
|
||||
|
||||
`--enable-extended-glob'
|
||||
Include support for the extended pattern matching features
|
||||
|
|
@ -287,20 +296,22 @@ does not provide the necessary support.
|
|||
commands.
|
||||
|
||||
`--enable-job-control'
|
||||
This enables job control features, if the OS supports them.
|
||||
This enables the job control features (*note Job Control::.), if
|
||||
the operating system supports them.
|
||||
|
||||
`--enable-process-substitution'
|
||||
This enables process substitution (*note Process Substitution::.)
|
||||
if the OS provides the necessary support.
|
||||
if the operating system provides the necessary support.
|
||||
|
||||
`--enable-prompt-string-decoding'
|
||||
Turn on the interpretation of a number of backslash-escaped
|
||||
characters in the `$PS1', `$PS2', `$PS3', and `$PS4' prompt
|
||||
strings.
|
||||
strings. See *Note Printing a Prompt::, for a complete list of
|
||||
prompt string escape sequences.
|
||||
|
||||
`--enable-readline'
|
||||
Include support for command-line editing and history with the Bash
|
||||
version of the Readline library.
|
||||
version of the Readline library (*note Command Line Editing::.).
|
||||
|
||||
`--enable-restricted'
|
||||
Include support for a "restricted shell". If this is enabled,
|
||||
|
|
@ -308,8 +319,8 @@ does not provide the necessary support.
|
|||
The Restricted Shell::, for a description of restricted mode.
|
||||
|
||||
`--enable-select'
|
||||
Include the `ksh' `select' builtin, which allows the generation of
|
||||
simple menus.
|
||||
Include the `select' builtin, which allows the generation of simple
|
||||
menus (*note Conditional Constructs::.).
|
||||
|
||||
`--enable-usg-echo-default'
|
||||
Make the `echo' builtin expand backslash-escaped characters by
|
||||
|
|
|
|||
39
MANIFEST
39
MANIFEST
|
|
@ -43,11 +43,12 @@ NEWS f
|
|||
NOTES f
|
||||
README f
|
||||
AUTHORS f
|
||||
Y2K f
|
||||
configure.in f
|
||||
configure f
|
||||
Makefile.in f
|
||||
config.h.top f
|
||||
config.h.bot f
|
||||
config-top.h f
|
||||
config-bot.h f
|
||||
config.h.in f
|
||||
aclocal.m4 f
|
||||
array.c f
|
||||
|
|
@ -195,6 +196,9 @@ builtins/common.h f
|
|||
builtins/bashgetopt.h f
|
||||
cross-build/cygwin32.cache f
|
||||
cross-build/win32sig.h f
|
||||
cross-build/x86-beos.cache f
|
||||
cross-build/beos-sig.h f
|
||||
cross-build/opennt.cache f
|
||||
lib/glob/ChangeLog f
|
||||
lib/glob/Makefile.in f
|
||||
lib/glob/fnmatch.c f
|
||||
|
|
@ -256,6 +260,7 @@ lib/readline/input.c f
|
|||
lib/readline/callback.c f
|
||||
lib/readline/nls.c f
|
||||
lib/readline/shell.c f
|
||||
lib/readline/savestring.c f
|
||||
lib/readline/tilde.c f
|
||||
lib/readline/tilde.h f
|
||||
lib/readline/rldefs.h f
|
||||
|
|
@ -272,7 +277,9 @@ lib/readline/posixdir.h f
|
|||
lib/readline/posixjmp.h f
|
||||
lib/readline/posixstat.h f
|
||||
lib/readline/ansi_stdlib.h f
|
||||
lib/readline/rlstdc.h f
|
||||
lib/readline/doc/Makefile f
|
||||
lib/readline/doc/manvers.texinfo f
|
||||
lib/readline/doc/rlman.texinfo f
|
||||
lib/readline/doc/rltech.texinfo f
|
||||
lib/readline/doc/rluser.texinfo f
|
||||
|
|
@ -292,6 +299,7 @@ lib/sh/getcwd.c f
|
|||
lib/sh/getenv.c f
|
||||
lib/sh/itos.c f
|
||||
lib/sh/oslib.c f
|
||||
lib/sh/rename.c f
|
||||
lib/sh/setlinebuf.c f
|
||||
lib/sh/strcasecmp.c f
|
||||
lib/sh/strerror.c f
|
||||
|
|
@ -319,22 +327,27 @@ lib/termcap/grot/configure f
|
|||
lib/termcap/grot/configure.in f
|
||||
lib/termcap/grot/COPYING f
|
||||
lib/termcap/grot/README f
|
||||
lib/tilde/README f
|
||||
lib/tilde/ChangeLog f
|
||||
lib/tilde/Makefile.in f
|
||||
lib/tilde/doc/tilde.texi f
|
||||
lib/tilde/doc/Makefile f
|
||||
lib/tilde/tilde.c f
|
||||
lib/tilde/tilde.h f
|
||||
lib/tilde/shell.c f
|
||||
CWRU/misc/open-files.c f
|
||||
CWRU/misc/sigs.c f
|
||||
CWRU/misc/pid.c f
|
||||
CWRU/misc/sigstat.c f
|
||||
CWRU/misc/bison f
|
||||
CWRU/misc/errlist.c f
|
||||
CWRU/misc/hpux10-dlfcn.h f
|
||||
CWRU/PLATFORMS f
|
||||
CWRU/README f
|
||||
CWRU/POSIX.NOTES f
|
||||
CWRU/changelog f
|
||||
CWRU/sh-redir-hack f
|
||||
CWRU/empty-for-wordlist f
|
||||
CWRU/mh-folder-comp f
|
||||
doc/FAQ f
|
||||
doc/Makefile.in f
|
||||
|
|
@ -355,6 +368,7 @@ support/config.sub f
|
|||
support/printenv.sh f 755
|
||||
support/printenv.c f
|
||||
support/bash.xbm f
|
||||
support/missing f 755
|
||||
support/mkclone f 755
|
||||
support/mkconffiles f 755
|
||||
support/mkdirs f 755
|
||||
|
|
@ -368,14 +382,17 @@ support/SYMLINKS f
|
|||
support/fixlinks f 755
|
||||
support/install.sh f 755
|
||||
support/texi2dvi f
|
||||
support/texi2html f
|
||||
support/texi2html f 755
|
||||
support/xenix-link.sh f 755
|
||||
support/shobj-conf f 755
|
||||
support/rlvers.sh f 755
|
||||
examples/bashdb/PERMISSION f
|
||||
examples/bashdb/README f
|
||||
examples/bashdb/bashdb f
|
||||
examples/bashdb/bashdb.fns f
|
||||
examples/bashdb/bashdb.pre f
|
||||
examples/loadables/README f
|
||||
examples/loadables/template.c f
|
||||
examples/loadables/Makefile.in f
|
||||
examples/loadables/necho.c f
|
||||
examples/loadables/hello.c f
|
||||
|
|
@ -384,7 +401,6 @@ examples/loadables/sprintf.c f
|
|||
examples/loadables/sleep.c f
|
||||
examples/loadables/truefalse.c f
|
||||
examples/loadables/getconf.c f
|
||||
examples/loadables/pushd.c f
|
||||
examples/loadables/finfo.c f
|
||||
examples/loadables/cat.c f
|
||||
examples/loadables/logname.c f
|
||||
|
|
@ -395,8 +411,17 @@ examples/loadables/pathchk.c f
|
|||
examples/loadables/tee.c f
|
||||
examples/loadables/rmdir.c f
|
||||
examples/loadables/head.c f
|
||||
examples/loadables/printenv.c f
|
||||
examples/loadables/id.c f
|
||||
examples/loadables/whoami.c f
|
||||
examples/loadables/uname.c f
|
||||
examples/loadables/sync.c f
|
||||
examples/loadables/mkdir.c f
|
||||
examples/loadables/ln.c f
|
||||
examples/loadables/unlink.c f
|
||||
examples/functions/autoload f
|
||||
examples/functions/autoload.v2 f
|
||||
examples/functions/autoload.v3 f
|
||||
examples/functions/basename f
|
||||
examples/functions/basename2 f
|
||||
examples/functions/csh-compat f
|
||||
|
|
@ -423,7 +448,9 @@ examples/functions/mhfold f
|
|||
examples/functions/notify.bash f
|
||||
examples/functions/pathfuncs f
|
||||
examples/functions/repeat2 f
|
||||
examples/functions/repeat3 f
|
||||
examples/functions/seq f
|
||||
examples/functions/seq2 f
|
||||
examples/functions/shcat f
|
||||
examples/functions/shcat2 f
|
||||
examples/functions/substr f
|
||||
|
|
@ -431,6 +458,7 @@ examples/functions/substr2 f
|
|||
examples/functions/term f
|
||||
examples/functions/whatis f
|
||||
examples/functions/whence f
|
||||
examples/functions/which f
|
||||
examples/functions/xalias.bash f
|
||||
examples/scripts/adventure.sh f
|
||||
examples/scripts/bcsh.sh f
|
||||
|
|
@ -479,6 +507,8 @@ tests/source4.sub f
|
|||
tests/source5.sub f
|
||||
tests/cond.tests f
|
||||
tests/cond.right f
|
||||
tests/cprint.tests f
|
||||
tests/cprint.right f
|
||||
tests/dollar-at-star f
|
||||
tests/dollar.right f
|
||||
tests/dstack.tests f
|
||||
|
|
@ -573,6 +603,7 @@ tests/run-array2 f
|
|||
tests/run-braces f
|
||||
tests/run-builtins f
|
||||
tests/run-cond f
|
||||
tests/run-cprint f
|
||||
tests/run-dirstack f
|
||||
tests/run-dollars f
|
||||
tests/run-errors f
|
||||
|
|
|
|||
127
Makefile.in
127
Makefile.in
|
|
@ -1,4 +1,4 @@
|
|||
# Makefile for bash-2.02, version 2.84
|
||||
# Makefile for bash-2.03, version 2.103
|
||||
#
|
||||
# Make sure the first target in the makefile is the right one
|
||||
all: .made
|
||||
|
|
@ -29,15 +29,17 @@ VPATH = .:@srcdir@
|
|||
CC = @CC@
|
||||
CC_FOR_BUILD = @CC_FOR_BUILD@
|
||||
YACC = @YACC@
|
||||
SHELL=/bin/sh
|
||||
SHELL = @MAKE_SHELL@
|
||||
CP = cp
|
||||
RM = rm -f
|
||||
AR = @AR@
|
||||
ARFLAGS = @ARFLAGS@
|
||||
RANLIB = @RANLIB@
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALLMODE= -m 0755
|
||||
|
||||
COMPRESS = gzip
|
||||
COMPRESS_EXT = .gz
|
||||
|
|
@ -63,6 +65,7 @@ RELSTATUS = release
|
|||
|
||||
Machine = @host_cpu@
|
||||
OS = @host_os@
|
||||
VENDOR = @host_vendor@
|
||||
MACHTYPE = @host@
|
||||
|
||||
THIS_SH = $(BUILD_DIR)/$(Program)
|
||||
|
|
@ -80,20 +83,21 @@ LOCAL_CFLAGS = @LOCAL_CFLAGS@
|
|||
DEFS = @DEFS@
|
||||
LOCAL_DEFS = @LOCAL_DEFS@
|
||||
LOCAL_LIBS = @LOCAL_LIBS@
|
||||
LIBS = $(BUILTINS_LIB) $(LIBRARIES) $(LOCAL_LIBS) @LIBS@
|
||||
LDFLAGS = @LDFLAGS@ $(LOCAL_LDFLAGS) $(PROFILE_FLAGS) $(CFLAGS)
|
||||
LIBS = $(BUILTINS_LIB) $(LIBRARIES) @LIBS@
|
||||
LDFLAGS = @LDFLAGS@ $(STATIC_LD) $(LOCAL_LDFLAGS) $(PROFILE_FLAGS) $(CFLAGS)
|
||||
STATIC_LD = @STATIC_LD@
|
||||
LOCAL_LDFLAGS = @LOCAL_LDFLAGS@
|
||||
|
||||
SYSTEM_FLAGS = -DPROGRAM='"$(Program)"' -DHOSTTYPE='"$(Machine)"' -DOSTYPE='"$(OS)"' -DMACHTYPE='"$(MACHTYPE)"'
|
||||
SYSTEM_FLAGS = -DPROGRAM='"$(Program)"' -DCONF_HOSTTYPE='"$(Machine)"' -DCONF_OSTYPE='"$(OS)"' -DCONF_MACHTYPE='"$(MACHTYPE)"' -DCONF_VENDOR='"$(VENDOR)"'
|
||||
|
||||
CCFLAGS = $(PROFILE_FLAGS) $(SYSTEM_FLAGS) $(LOCAL_DEFS) \
|
||||
$(DEFS) $(LOCAL_CFLAGS) $(CPPFLAGS) $(INCLUDES) $(CFLAGS)
|
||||
|
||||
INCLUDES = -I. -I$(srcdir) -I$(LIBSRC)
|
||||
INCLUDES = -I. @RL_INCLUDE@ -I$(srcdir) -I$(LIBSRC) -I$(includedir)
|
||||
|
||||
GCC_LINT_FLAGS = -ansi -Wall -Wshadow -Wpointer-arith -Wcast-qual \
|
||||
-Wwrite-strings -Werror -Wstrict-prototypes \
|
||||
-Wmissing-prototypes
|
||||
-Wmissing-prototypes -Wno-implicit
|
||||
GCC_LINT_CFLAGS = $(CCFLAGS) $(GCC_LINT_FLAGS)
|
||||
|
||||
#
|
||||
|
|
@ -105,7 +109,7 @@ dot = .
|
|||
LIBSUBDIR = lib
|
||||
LIBSRC = $(srcdir)/$(LIBSUBDIR)
|
||||
|
||||
SUBDIR_INCLUDES = -I. -I$(topdir) -I$(topdir)/$(LIBSUBDIR) -I$(includedir)
|
||||
SUBDIR_INCLUDES = -I. @RL_INCLUDE@ -I$(topdir) -I$(topdir)/$(LIBSUBDIR) -I$(includedir)
|
||||
|
||||
# the bash library
|
||||
# the library is a mix of functions that the C library does not provide on
|
||||
|
|
@ -120,7 +124,7 @@ SHLIB_SOURCE = ${SH_LIBSRC}/clktck.c ${SH_LIBSRC}/getcwd.c \
|
|||
${SH_LIBSRC}/strcasecmp.c ${SH_LIBSRC}/strerror.c \
|
||||
${SH_LIBSRC}/strtod.c ${SH_LIBSRC}/strtol.c \
|
||||
${SH_LIBSRC}/strtoul.c ${SH_LIBSRC}/vprint.c \
|
||||
${SH_LIBSRC}/itos.c
|
||||
${SH_LIBSRC}/itos.c ${SH_LIBSRC}/rename.c
|
||||
|
||||
SHLIB_LIB = -lsh
|
||||
SHLIB_LIBNAME = libsh.a
|
||||
|
|
@ -131,7 +135,7 @@ SHLIB_DEP = ${SHLIB_LIBRARY}
|
|||
# we assume for now that readline source is being shipped with bash
|
||||
RL_LIBSRC = $(LIBSRC)/readline
|
||||
RL_LIBDOC = $(RL_LIBSRC)/doc
|
||||
RL_LIBDIR = $(dot)/$(LIBSUBDIR)/readline
|
||||
RL_LIBDIR = @RL_LIBDIR@
|
||||
RL_ABSSRC = ${topdir}/$(RL_LIBDIR)
|
||||
|
||||
READLINE_LIB = @READLINE_LIB@
|
||||
|
|
@ -145,6 +149,7 @@ READLINE_SOURCE = $(RL_LIBSRC)/rldefs.h $(RL_LIBSRC)/rlconf.h \
|
|||
$(RL_LIBSRC)/chardefs.h $(RL_LIBSRC)/keymaps.h \
|
||||
$(RL_LIBSRC)/history.h $(RL_LIBSRC)/histlib.h \
|
||||
$(RL_LIBSRC)/posixstat.h $(RL_LIBSRC)/tilde.h \
|
||||
$(RL_LIBSRC)/rlstdc.h \
|
||||
$(RL_LIBSRC)/funmap.c $(RL_LIBSRC)/emacs_keymap.c \
|
||||
$(RL_LIBSRC)/search.c $(RL_LIBSRC)/vi_keymap.c \
|
||||
$(RL_LIBSRC)/keymaps.c $(RL_LIBSRC)/parens.c \
|
||||
|
|
@ -157,7 +162,7 @@ READLINE_SOURCE = $(RL_LIBSRC)/rldefs.h $(RL_LIBSRC)/rlconf.h \
|
|||
$(RL_LIBSRC)/undo.c $(RL_LIBSRC)/macro.c \
|
||||
$(RL_LIBSRC)/terminal.c $(RL_LIBSRC)/nls.c \
|
||||
$(RL_LIBSRC)/input.c $(RL_LIBSRC)/xmalloc.c \
|
||||
$(RL_LIBSRC)/shell.c \
|
||||
$(RL_LIBSRC)/shell.c $(RL_LIBSRC)/savestring.c \
|
||||
$(RL_LIBSRC)/histexpand.c $(RL_LIBSRC)/history.c \
|
||||
$(RL_LIBSRC)/histsearch.c $(RL_LIBSRC)/histfile.c
|
||||
|
||||
|
|
@ -171,12 +176,12 @@ READLINE_OBJ = $(RL_LIBDIR)/readline.o $(RL_LIBDIR)/funmap.o \
|
|||
$(RL_LIBDIR)/kill.o $(RL_LIBDIR)/undo.o $(RL_LIBDIR)/nls.o \
|
||||
$(RL_LIBDIR)/macro.o $(RL_LIBDIR)/input.o \
|
||||
$(RL_LIBDIR)/terminal.o $(RL_LIBDIR)/callback.o \
|
||||
$(RL_LIBDIR)/shell.o \
|
||||
$(RL_LIBDIR)/shell.o $(RL_LIBDIR)/savestring.o \
|
||||
$(RL_LIBDIR)/history.o $(RL_LIBDIR)/histexpand.o \
|
||||
$(RL_LIBDIR)/histsearch.o $(RL_LIBDIR)/histfile.o
|
||||
|
||||
HIST_LIBSRC = $(LIBSRC)/readline
|
||||
HIST_LIBDIR = $(dot)/$(LIBSUBDIR)/readline
|
||||
HIST_LIBDIR = @HIST_LIBDIR@
|
||||
HIST_ABSSRC = ${topdir}/$(HIST_LIBDIR)
|
||||
|
||||
HISTORY_LIB = @HISTORY_LIB@
|
||||
|
|
@ -265,11 +270,11 @@ BASHPOSIX_SUPPORT = $(BASHPOSIX_LIB)/posixstat.h $(BASHPOSIX_LIB)/ansi_stdlib.h
|
|||
LIBRARIES = $(READLINE_LIB) $(HISTORY_LIB) $(TERMCAP_LIB) $(GLOB_LIB) \
|
||||
$(TILDE_LIB) $(MALLOC_LIB) $(SHLIB_LIB) $(LOCAL_LIBS)
|
||||
|
||||
LIBDEP = $(READLINE_DEP) $(TERMCAP_DEP) $(GLOB_DEP) $(HISTORY_DEP) \
|
||||
LIBDEP = $(READLINE_DEP) $(HISTORY_DEP) $(TERMCAP_DEP) $(GLOB_DEP) \
|
||||
$(TILDE_DEP) $(MALLOC_DEP) $(SHLIB_DEP)
|
||||
|
||||
LIBRARY_LDFLAGS = $(READLINE_LDFLAGS) $(HISTORY_LDFLAGS) $(TILDE_LDFLAGS) \
|
||||
$(GLOB_LDFLAGS) $(MALLOC_LDFLAGS) $(SHLIB_LDFLAGS)
|
||||
LIBRARY_LDFLAGS = $(READLINE_LDFLAGS) $(HISTORY_LDFLAGS) $(GLOB_LDFLAGS) \
|
||||
$(TILDE_LDFLAGS) $(MALLOC_LDFLAGS) $(SHLIB_LDFLAGS)
|
||||
|
||||
#
|
||||
# The shell itself
|
||||
|
|
@ -411,8 +416,8 @@ strip: $(Program) .made
|
|||
size $(Program)
|
||||
|
||||
version.h: $(SOURCES) config.h Makefile
|
||||
if $(SHELL) $(SUPPORT_SRC)mkversion.sh -b -s $(RELSTATUS) -d $(Version) -p $(PatchLevel) -o newversion.h; \
|
||||
then mv newversion.h version.h; fi;
|
||||
$(SHELL) $(SUPPORT_SRC)mkversion.sh -b -s $(RELSTATUS) -d $(Version) -p $(PatchLevel) -o newversion.h \
|
||||
&& mv newversion.h version.h
|
||||
|
||||
# old rules
|
||||
GRAM_H = parser-built
|
||||
|
|
@ -435,13 +440,13 @@ y.tab.c y.tab.h: parse.y
|
|||
|
||||
$(READLINE_LIBRARY): config.h $(READLINE_SOURCE)
|
||||
@echo making $@ in ${RL_LIBDIR}
|
||||
@(cd ${RL_LIBDIR} && \
|
||||
$(MAKE) $(MFLAGS) libreadline.a) || exit 1
|
||||
@( { test "${RL_LIBDIR}" = "${libdir}" && exit 0; } || \
|
||||
cd ${RL_LIBDIR} && $(MAKE) $(MFLAGS) libreadline.a) || exit 1
|
||||
|
||||
$(HISTORY_LIBRARY): config.h $(HISTORY_SOURCE)
|
||||
@echo making $@ in ${HIST_LIBDIR}
|
||||
@(cd ${HIST_LIBDIR} && \
|
||||
$(MAKE) $(MFLAGS) libhistory.a) || exit 1
|
||||
@( { test "${HIST_LIBDIR}" = "${libdir}" && exit 0; } || \
|
||||
cd ${HIST_LIBDIR} && $(MAKE) $(MFLAGS) libhistory.a) || exit 1
|
||||
|
||||
$(GLOB_LIBRARY): config.h $(GLOB_SOURCE)
|
||||
@echo making $@ in ${GLOB_LIBDIR}
|
||||
|
|
@ -464,7 +469,7 @@ $(SHLIB_LIBRARY): config.h ${SHLIB_SOURCE}
|
|||
$(MAKE) $(MFLAGS) ${SHLIB_LIBNAME}) || exit 1
|
||||
|
||||
mksignames: $(SUPPORT_SRC)mksignames.c
|
||||
$(CC) $(CCFLAGS) $(CPPFLAGS) -o $@ $(SUPPORT_SRC)mksignames.c
|
||||
$(CC_FOR_BUILD) $(CCFLAGS) $(CPPFLAGS) -o $@ $(SUPPORT_SRC)mksignames.c
|
||||
|
||||
# make a list of signals for the local system -- this is done when we're
|
||||
# *not* cross-compiling
|
||||
|
|
@ -502,15 +507,19 @@ Makefiles makefiles: config.status $(srcdir)/Makefile.in
|
|||
|
||||
config.h: stamp-h
|
||||
|
||||
stamp-h: config.status $(srcdir)/config.h.in $(srcdir)/config.h.top $(srcdir)/config.h.bot
|
||||
stamp-h: config.status $(srcdir)/config.h.in $(srcdir)/config-top.h $(srcdir)/config-bot.h
|
||||
CONFIG_FILES= CONFIG_HEADERS=config.h $(SHELL) ./config.status
|
||||
|
||||
config.status: $(srcdir)/configure
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
# comment out for distribution
|
||||
#$(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4
|
||||
# cd $(srcdir) && autoconf
|
||||
$(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4 $(srcdir)/config.h.in
|
||||
cd $(srcdir) && autoconf
|
||||
|
||||
# for chet
|
||||
reconfig: force
|
||||
sh $(srcdir)/configure
|
||||
|
||||
#newversion: mkversion
|
||||
# $(RM) .build
|
||||
|
|
@ -540,8 +549,8 @@ installdirs:
|
|||
@${SHELL} $(SUPPORT_SRC)mkdirs $(infodir)
|
||||
|
||||
install: .made installdirs
|
||||
$(INSTALL_PROGRAM) $(Program) $(bindir)/$(Program)
|
||||
$(INSTALL_PROGRAM) bashbug $(bindir)/bashbug
|
||||
$(INSTALL_PROGRAM) $(INSTALLMODE) $(Program) $(bindir)/$(Program)
|
||||
$(INSTALL_PROGRAM) $(INSTALLMODE) bashbug $(bindir)/bashbug
|
||||
-( cd $(DOCDIR) ; $(MAKE) $(MFLAGS) \
|
||||
man1dir=$(man1dir) man1ext=$(man1ext) \
|
||||
man3dir=$(man3dir) man3ext=$(man3ext) \
|
||||
|
|
@ -572,6 +581,7 @@ clean: basic-clean
|
|||
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
$(RM) $(CREATED_SUPPORT)
|
||||
|
||||
mostlyclean: basic-clean
|
||||
|
|
@ -583,6 +593,7 @@ mostlyclean: basic-clean
|
|||
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
|
||||
distclean: basic-clean
|
||||
( cd $(DOCDIR) && $(MAKE) $(MFLAGS) $@ )
|
||||
|
|
@ -593,6 +604,7 @@ distclean: basic-clean
|
|||
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
$(RM) $(CREATED_CONFIGURE) tags TAGS
|
||||
$(RM) $(CREATED_SUPPORT) Makefile $(CREATED_MAKEFILES)
|
||||
|
||||
|
|
@ -608,6 +620,7 @@ maintainer-clean: basic-clean
|
|||
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
-(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||
$(RM) $(CREATED_CONFIGURE) $(CREATED_MAKEFILES)
|
||||
$(RM) $(CREATED_SUPPORT) Makefile
|
||||
|
||||
|
|
@ -643,22 +656,22 @@ sdepend: force
|
|||
|
||||
############################ DEPENDENCIES ###############################
|
||||
|
||||
# Files that depend on the definitions in config.h.top, which are not meant
|
||||
# Files that depend on the definitions in config-top.h, which are not meant
|
||||
# to be changed
|
||||
shell.o: config.h.top
|
||||
input.o: config.h.top
|
||||
y.tab.o: config.h.top
|
||||
jobs.o: config.h.top
|
||||
nojobs.o: config.h.top
|
||||
execute_cmd.o: config.h.top
|
||||
variables.o: config.h.top
|
||||
builtins/command.o: config.h.top
|
||||
builtins/common.o: config.h.top
|
||||
builtins/break.o: config.h.top
|
||||
builtins/echo.o: config.h.top
|
||||
builtins/evalstring.o: config.h.top
|
||||
builtins/exit.o: config.h.top
|
||||
builtins/kill.o: config.h.top
|
||||
shell.o: config-top.h
|
||||
input.o: config-top.h
|
||||
y.tab.o: config-top.h
|
||||
jobs.o: config-top.h
|
||||
nojobs.o: config-top.h
|
||||
execute_cmd.o: config-top.h
|
||||
variables.o: config-top.h
|
||||
builtins/command.o: config-top.h
|
||||
builtins/common.o: config-top.h
|
||||
builtins/break.o: config-top.h
|
||||
builtins/echo.o: config-top.h
|
||||
builtins/evalstring.o: config-top.h
|
||||
builtins/exit.o: config-top.h
|
||||
builtins/kill.o: config-top.h
|
||||
|
||||
# shell basics
|
||||
copy_cmd.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
|
||||
|
|
@ -872,18 +885,20 @@ bracecomp.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
|
|||
# library dependencies
|
||||
|
||||
bashline.o: $(RL_LIBSRC)/rlconf.h
|
||||
bashline.o: $(RL_LIBSRC)/keymaps.h
|
||||
bashline.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/rlstdc.h
|
||||
bashline.o: $(RL_LIBSRC)/chardefs.h $(RL_LIBSRC)/readline.h
|
||||
bracecomp.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/chardefs.h
|
||||
bracecomp.o: $(RL_LIBSRC)/readline.h
|
||||
y.tab.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/chardefs.h $(RL_LIBSRC)/readline.h
|
||||
subst.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/chardefs.h $(RL_LIBSRC)/readline.h
|
||||
bracecomp.o: $(RL_LIBSRC)/readline.h $(RL_LIBSRC)/rlstdc.h
|
||||
y.tab.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/chardefs.h
|
||||
y.tab.o: $(RL_LIBSRC)/readline.h $(RL_LIBSRC)/rlstdc.h
|
||||
subst.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/chardefs.h
|
||||
subst.o: $(RL_LIBSRC)/readline.h $(RL_LIBSRC)/rlstdc.h
|
||||
|
||||
shell.o: $(HIST_LIBSRC)/history.h
|
||||
subst.o: $(HIST_LIBSRC)/history.h
|
||||
bashline.o: $(HIST_LIBSRC)/history.h
|
||||
bashhist.o: $(HIST_LIBSRC)/history.h
|
||||
y.tab.o: $(HIST_LIBSRC)/history.h
|
||||
shell.o: $(HIST_LIBSRC)/history.h $(HIST_LIBSRC)/rlstdc.h
|
||||
subst.o: $(HIST_LIBSRC)/history.h $(HIST_LIBSRC)/rlstdc.h
|
||||
bashline.o: $(HIST_LIBSRC)/history.h $(HIST_LIBSRC)/rlstdc.h
|
||||
bashhist.o: $(HIST_LIBSRC)/history.h $(HIST_LIBSRC)/rlstdc.h
|
||||
y.tab.o: $(HIST_LIBSRC)/history.h $(HIST_LIBSRC)/rlstdc.h
|
||||
|
||||
execute_cmd.o: $(TILDE_LIBSRC)/tilde.h
|
||||
general.o: $(TILDE_LIBSRC)/tilde.h
|
||||
|
|
@ -1075,11 +1090,11 @@ builtins/wait.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
|
|||
|
||||
# builtin library dependencies
|
||||
builtins/bind.o: $(RL_LIBSRC)/chardefs.h $(RL_LIBSRC)/readline.h
|
||||
builtins/bind.o: $(RL_LIBSRC)/keymaps.h
|
||||
builtins/bind.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/rlstdc.h
|
||||
|
||||
builtins/bind.o: $(HIST_LIBSRC)/history.h
|
||||
builtins/fc.o: $(HIST_LIBSRC)/history.h
|
||||
builtins/history.o: $(HIST_LIBSRC)/history.h
|
||||
builtins/bind.o: $(HIST_LIBSRC)/history.h $(RL_LIBSRC)/rlstdc.h
|
||||
builtins/fc.o: $(HIST_LIBSRC)/history.h $(RL_LIBSRC)/rlstdc.h
|
||||
builtins/history.o: $(HIST_LIBSRC)/history.h $(RL_LIBSRC)/rlstdc.h
|
||||
|
||||
builtins/common.o: $(TILDE_LIBSRC)/tilde.h
|
||||
builtins/cd.o: $(TILDE_LIBSRC)/tilde.h
|
||||
|
|
|
|||
66
NEWS
66
NEWS
|
|
@ -1,3 +1,69 @@
|
|||
This is a terse description of the new features added to bash-2.03 since
|
||||
the release of bash-2.02. As always, the manual page (doc/bash.1) is
|
||||
the place to look for complete descriptions.
|
||||
|
||||
1. New Features in Bash
|
||||
|
||||
a. New `shopt' option, `restricted_shell', indicating whether or not the
|
||||
shell was started in restricted mode, for use in startup files.
|
||||
|
||||
b. Filename generation is now performed on the words between ( and ) in
|
||||
array assignments (which it probably should have done all along).
|
||||
|
||||
c. OLDPWD is now auto-exported, as POSIX.2 seems to require.
|
||||
|
||||
d. ENV and BASH_ENV are read-only variables in a restricted shell.
|
||||
|
||||
e. A change was made to the startup file code so that any shell begun with
|
||||
the `--login' option, even non-interactive shells, will source the login
|
||||
shell startup files.
|
||||
|
||||
2. New Features in Readline
|
||||
|
||||
a. Many changes to the signal handling:
|
||||
o Readline now catches SIGQUIT and cleans up the tty before returning;
|
||||
o A new variable, rl_catch_signals, is available to application writers
|
||||
to indicate to readline whether or not it should install its own
|
||||
signal handlers for SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP,
|
||||
SIGTTIN, and SIGTTOU;
|
||||
o A new variable, rl_catch_sigwinch, is available to application
|
||||
writers to indicate to readline whether or not it should install its
|
||||
own signal handler for SIGWINCH, which will chain to the calling
|
||||
applications's SIGWINCH handler, if one is installed;
|
||||
o There is a new function, rl_free_line_state, for application signal
|
||||
handlers to call to free up the state associated with the current
|
||||
line after receiving a signal;
|
||||
o There is a new function, rl_cleanup_after_signal, to clean up the
|
||||
display and terminal state after receiving a signal;
|
||||
o There is a new function, rl_reset_after_signal, to reinitialize the
|
||||
terminal and display state after an application signal handler
|
||||
returns and readline continues
|
||||
|
||||
b. There is a new function, rl_resize_terminal, to reset readline's idea of
|
||||
the screen size after a SIGWINCH.
|
||||
|
||||
c. New public functions: rl_save_prompt and rl_restore_prompt. These were
|
||||
previously private functions with a `_' prefix.
|
||||
|
||||
d. New function hook: rl_pre_input_hook, called just before readline starts
|
||||
reading input, after initialization.
|
||||
|
||||
e. New function hook: rl_display_matches_hook, called when readline would
|
||||
display the list of completion matches. The new function
|
||||
rl_display_match_list is what readline uses internally, and is available
|
||||
for use by application functions called via this hook.
|
||||
|
||||
f. New bindable function, delete-char-or-list, like tcsh.
|
||||
|
||||
g. A new variable, rl_erase_empty_line, which, if set by an application using
|
||||
readline, will cause readline to erase, prompt and all, lines on which the
|
||||
only thing typed was a newline.
|
||||
|
||||
h. New bindable variable: `isearch-terminators'.
|
||||
|
||||
i. New bindable function: `forward-backward-delete-char' (unbound by default).
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
This is a terse description of the new features added to bash-2.02 since
|
||||
the release of bash-2.01.1. As always, the manual page (doc/bash.1) is
|
||||
the place to look for complete descriptions.
|
||||
|
|
|
|||
55
NOTES
55
NOTES
|
|
@ -198,3 +198,58 @@ being built and linked against, but there is only a stub file in the archive.)
|
|||
You will see many warnings of the form:
|
||||
warning: unknown s_type: 98
|
||||
I have no idea what this means, but it doesn't seem to matter.
|
||||
|
||||
10. If you do not have /usr/ccs/bin in your PATH when building on SunOS 5.x
|
||||
(Solaris 2), the configure script will be unable to find `ar' and
|
||||
`ranlib' (of course, ranlib is unnecessary). Make sure your $PATH
|
||||
includes /usr/ccs/bin on SunOS 5.x.
|
||||
|
||||
11. Building a statically-linked bash on Solaris 2.5.x or 2.6 is complicated.
|
||||
It's not possible to build a completely statically-linked binary, since
|
||||
part of the C library depends on dynamic linking. The following recipe
|
||||
assumes that you're using gcc and the Solaris ld (/usr/ccs/bin/ld).
|
||||
|
||||
configure --enable-static-link
|
||||
make STATIC_LD= LOCAL_LIBS='-Wl,-B,dynamic -ldl -Wl,-B,static'
|
||||
|
||||
This should result in a bash binary that depends only on libdl.so:
|
||||
|
||||
thor(2)$ ldd bash
|
||||
libdl.so.1 => /usr/lib/libdl.so.1
|
||||
|
||||
If you're using the Sun C Compiler (Sun WorkShop C Compiler version
|
||||
4.2 was what I used), you should be able to get away with using
|
||||
|
||||
configure --enable-static-link
|
||||
make STATIC_LD= LOCAL_LIBS='-B dynamic -ldl -B static'
|
||||
|
||||
If you want to completely remove any dependence on /usr, perhaps
|
||||
to put a copy of bash in /sbin and have it available when /usr is
|
||||
not mounted, force the build process to use the shared ld.so library
|
||||
in /etc/lib.
|
||||
|
||||
For gcc, this would be something like
|
||||
|
||||
configure --enable-static-link
|
||||
make STATIC_LD= LOCAL_LIBS='-Wl,-B,dynamic -Wl,-R/etc/lib -ldl -Wl,-B,static'
|
||||
|
||||
For Sun's WS4.2 cc
|
||||
|
||||
configure --enable-static-link
|
||||
make STATIC_LD= LOCAL_LIBS='-B dynamic -R/etc/lib -ldl -B static'
|
||||
|
||||
seems to work, at least on Solaris 2.5.1:
|
||||
|
||||
thor(2)$ ldd bash
|
||||
libdl.so.1 => /etc/lib/libdl.so.1
|
||||
|
||||
12. Configuring bash to build it in a cross environment. Currently only
|
||||
two native versions can be compiled this way, cygwin32 and x86 BeOS.
|
||||
For BeOS, you would configure it like this:
|
||||
|
||||
export RANLIB=i586-beos-ranlib
|
||||
export AR=i586-beos-ar
|
||||
export CC=i586-beos-gcc
|
||||
configure i586-beos
|
||||
|
||||
Similarly for cygwin32.
|
||||
|
|
|
|||
6
README
6
README
|
|
@ -1,7 +1,7 @@
|
|||
Introduction
|
||||
============
|
||||
|
||||
This is GNU Bash, version 2.02.1. Bash is the GNU Project's Bourne
|
||||
This is GNU Bash, version 2.03. Bash is the GNU Project's Bourne
|
||||
Again SHell, a complete implementation of the POSIX.2 shell spec,
|
||||
but also with interactive command line editing, job control on
|
||||
architectures that support it, csh-like features such as history
|
||||
|
|
@ -49,7 +49,7 @@ more ambitious script that attempts to do a more complete job.
|
|||
Reporting Bugs
|
||||
==============
|
||||
|
||||
Bug reports for bash-2.02.1 should be sent to:
|
||||
Bug reports for bash should be sent to:
|
||||
|
||||
bug-bash@prep.ai.mit.edu
|
||||
|
||||
|
|
@ -67,7 +67,7 @@ bashbug directly with `make bashbug'. If you cannot build `bashbug',
|
|||
please send mail to bug-bash@prep.ai.mit.edu with the following
|
||||
information:
|
||||
|
||||
* the version number and release status of Bash (e.g., 2.02.1-release)
|
||||
* the version number and release status of Bash (e.g., 2.01-release)
|
||||
* the machine and OS that it is running on (look at the file
|
||||
`.made' in the bash build directory)
|
||||
* a list of the compilation flags or the contents of `config.h', if
|
||||
|
|
|
|||
5
Y2K
Normal file
5
Y2K
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
Since Bash does not manipulate date strings, it is Y2K-safe.
|
||||
|
||||
The only thing that Bash does with date strings is manipulate the string
|
||||
returned by ctime(3) in the prompt customization code. In all cases,
|
||||
it discards the year.
|
||||
167
aclocal.m4
vendored
167
aclocal.m4
vendored
|
|
@ -26,7 +26,7 @@ main()
|
|||
exit(fl != 1);
|
||||
}
|
||||
], bash_cv_dup2_broken=yes, bash_cv_dup2_broken=no,
|
||||
[AC_MSG_ERROR(cannot check dup2 if cross compiling -- defaulting to no)
|
||||
[AC_MSG_WARN(cannot check dup2 if cross compiling -- defaulting to no)
|
||||
bash_cv_dup2_broken=no])
|
||||
])
|
||||
AC_MSG_RESULT($bash_cv_dup2_broken)
|
||||
|
|
@ -129,7 +129,7 @@ main()
|
|||
exit(ok ? 0 : 5);
|
||||
}
|
||||
], bash_cv_pgrp_pipe=no,bash_cv_pgrp_pipe=yes,
|
||||
[AC_MSG_ERROR(cannot check pgrp synchronization if cross compiling -- defaulting to no)
|
||||
[AC_MSG_WARN(cannot check pgrp synchronization if cross compiling -- defaulting to no)
|
||||
bash_cv_pgrp_pipe=no])
|
||||
])
|
||||
AC_MSG_RESULT($bash_cv_pgrp_pipe)
|
||||
|
|
@ -187,7 +187,7 @@ main()
|
|||
#endif
|
||||
exit(1);
|
||||
}], bash_cv_type_rlimit=quad_t, bash_cv_type_rlimit=long,
|
||||
[AC_MSG_ERROR(cannot check quad_t if cross compiling -- defaulting to long)
|
||||
[AC_MSG_WARN(cannot check quad_t if cross compiling -- defaulting to long)
|
||||
bash_cv_type_rlimit=long])])
|
||||
])
|
||||
AC_MSG_RESULT($bash_cv_type_rlimit)
|
||||
|
|
@ -211,7 +211,7 @@ AC_CACHE_VAL(bash_cv_decl_under_sys_siglist,
|
|||
#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 -- defaulting to no)])])dnl
|
||||
[AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)])])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)
|
||||
|
|
@ -237,7 +237,7 @@ char *msg = (char *)_sys_siglist[2];
|
|||
exit(msg == 0);
|
||||
}],
|
||||
bash_cv_under_sys_siglist=yes, bash_cv_under_sys_siglist=no,
|
||||
[AC_MSG_ERROR(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)
|
||||
[AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)
|
||||
bash_cv_under_sys_siglist=no])])
|
||||
AC_MSG_RESULT($bash_cv_under_sys_siglist)
|
||||
if test $bash_cv_under_sys_siglist = yes; then
|
||||
|
|
@ -264,7 +264,7 @@ char *msg = sys_siglist[2];
|
|||
exit(msg == 0);
|
||||
}],
|
||||
bash_cv_sys_siglist=yes, bash_cv_sys_siglist=no,
|
||||
[AC_MSG_ERROR(cannot check for sys_siglist if cross compiling -- defaulting to no)
|
||||
[AC_MSG_WARN(cannot check for sys_siglist if cross compiling -- defaulting to no)
|
||||
bash_cv_sys_siglist=no])])
|
||||
AC_MSG_RESULT($bash_cv_sys_siglist)
|
||||
if test $bash_cv_sys_siglist = yes; then
|
||||
|
|
@ -325,7 +325,7 @@ dir = opendir("/tmp/not_a_directory");
|
|||
unlink("/tmp/not_a_directory");
|
||||
exit (dir == 0);
|
||||
}], bash_cv_opendir_not_robust=yes,bash_cv_opendir_not_robust=no,
|
||||
[AC_MSG_ERROR(cannot check opendir if cross compiling -- defaulting to no)
|
||||
[AC_MSG_WARN(cannot check opendir if cross compiling -- defaulting to no)
|
||||
bash_cv_opendir_not_robust=no]
|
||||
)])
|
||||
AC_MSG_RESULT($bash_cv_opendir_not_robust)
|
||||
|
|
@ -356,109 +356,47 @@ fi
|
|||
|
||||
AC_DEFUN(BASH_TYPE_INT32_T,
|
||||
[
|
||||
if test "X$bash_cv_type_int32_t" = "X"; then
|
||||
_bash_needmsg=yes
|
||||
if test "$ac_cv_sizeof_int" = 4; then
|
||||
AC_CHECK_TYPE(int32_t, int)
|
||||
elif test "$ac_cv_sizeof_long" = 4; then
|
||||
AC_CHECK_TYPE(int32_t, long)
|
||||
else
|
||||
AC_MSG_CHECKING(which builtin C type is 32 bits wide)
|
||||
_bash_needmsg=
|
||||
fi
|
||||
AC_CACHE_VAL(bash_cv_type_int32_t,
|
||||
[AC_TRY_RUN([
|
||||
main()
|
||||
{
|
||||
#if SIZEOF_INT == 4
|
||||
exit (0);
|
||||
#else
|
||||
# if SIZEOF_LONG == 4
|
||||
exit (1);
|
||||
# else
|
||||
# error cannot find 32 bit type...
|
||||
# endif
|
||||
#endif
|
||||
}], bash_cv_type_int32_t=int, bash_cv_type_int32_t=long,
|
||||
[AC_MSG_ERROR(cannot check type sizes if cross-compiling -- defaulting to int)
|
||||
bash_cv_type_int32_t=int]
|
||||
)])
|
||||
if test "X$_bash_needmsg" = "Xyes"; then
|
||||
AC_MSG_CHECKING(which builtin C type is 32 bits wide)
|
||||
fi
|
||||
AC_MSG_RESULT($bash_cv_type_int32_t);
|
||||
if test "$bash_cv_type_int32_t" = "int"; then
|
||||
AC_DEFINE(int32_t, int)
|
||||
else
|
||||
AC_DEFINE(int32_t, long)
|
||||
AC_CHECK_TYPE(int32_t, int)
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN(BASH_TYPE_U_INT32_T,
|
||||
[
|
||||
if test "X$bash_cv_type_u_int32_t" = "X"; then
|
||||
_bash_needmsg=yes
|
||||
if test "$ac_cv_sizeof_int" = 4; then
|
||||
AC_CHECK_TYPE(u_int32_t, unsigned int)
|
||||
elif test "$ac_cv_sizeof_long" = 4; then
|
||||
AC_CHECK_TYPE(u_int32_t, unsigned long)
|
||||
else
|
||||
AC_MSG_CHECKING(which unsigned builtin C type is 32 bits wide)
|
||||
_bash_needmsg=
|
||||
fi
|
||||
AC_CACHE_VAL(bash_cv_type_u_int32_t,
|
||||
[AC_TRY_RUN([
|
||||
main()
|
||||
{
|
||||
#if SIZEOF_INT == 4
|
||||
exit (0);
|
||||
#else
|
||||
# if SIZEOF_LONG == 4
|
||||
exit (1);
|
||||
# else
|
||||
# error cannot find 32 bit type...
|
||||
# endif
|
||||
#endif
|
||||
}], bash_cv_type_u_int32_t=int, bash_cv_type_u_int32_t=long,
|
||||
[AC_MSG_ERROR(cannot check type sizes if cross-compiling -- defaulting to int)
|
||||
bash_cv_type_u_int32_t=int]
|
||||
)])
|
||||
if test "X$_bash_needmsg" = "Xyes"; then
|
||||
AC_MSG_CHECKING(which unsigned builtin C type is 32 bits wide)
|
||||
fi
|
||||
AC_MSG_RESULT($bash_cv_type_u_int32_t);
|
||||
if test "$bash_cv_type_u_int32_t" = "int"; then
|
||||
AC_DEFINE(u_int32_t, unsigned int)
|
||||
else
|
||||
AC_DEFINE(u_int32_t, unsigned long)
|
||||
AC_CHECK_TYPE(u_int32_t, unsigned int)
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN(BASH_TYPE_PTRDIFF_T,
|
||||
[
|
||||
if test "X$bash_cv_type_ptrdiff_t" = "X"; then
|
||||
_bash_needmsg=yes
|
||||
if test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_char_p"; then
|
||||
AC_CHECK_TYPE(ptrdiff_t, int)
|
||||
elif test "$ac_cv_sizeof_long" = "$ac_cv_sizeof_char_p"; then
|
||||
AC_CHECK_TYPE(ptrdiff_t, long)
|
||||
else
|
||||
AC_MSG_CHECKING(which builtin C type is correct for ptrdiff_t)
|
||||
_bash_needmsg=
|
||||
AC_CHECK_TYPE(ptrdiff_t, int)
|
||||
fi
|
||||
AC_CACHE_VAL(bash_cv_type_ptrdiff_t,
|
||||
[AC_TRY_RUN([
|
||||
main()
|
||||
{
|
||||
#if SIZEOF_CHAR_P == SIZEOF_INT
|
||||
exit (0);
|
||||
#else
|
||||
# if SIZEOF_CHAR_P == SIZEOF_LONG
|
||||
exit (1);
|
||||
# else
|
||||
# error cannot find type for pointer arithmetic...
|
||||
# endif
|
||||
#endif
|
||||
}], bash_cv_type_ptrdiff_t=int, bash_cv_type_ptrdiff_t=long,
|
||||
[AC_MSG_ERROR(cannot check type sizes if cross-compiling -- defaulting to int)
|
||||
bash_cv_type_ptrdiff_t=int]
|
||||
)])
|
||||
if test "X$_bash_needmsg" = "Xyes"; then
|
||||
AC_MSG_CHECKING(which builtin C type is correct for ptrdiff_t)
|
||||
fi
|
||||
AC_MSG_RESULT($bash_cv_type_ptrdiff_t);
|
||||
if test "$bash_cv_type_ptrdiff_t" = "int"; then
|
||||
AC_DEFINE(ptrdiff_t, int)
|
||||
])
|
||||
|
||||
AC_DEFUN(BASH_TYPE_BITS64_T,
|
||||
[
|
||||
if test "$ac_sv_sizeof_char_p" = 8; then
|
||||
AC_CHECK_TYPE(bits64_t, char *)
|
||||
elif test "$ac_cv_sizeof_double" = 8; then
|
||||
AC_CHECK_TYPE(bits64_t, double)
|
||||
elif test "$ac_cv_sizeof_long" = 8; then
|
||||
AC_CHECK_TYPE(bits64_t, long)
|
||||
else
|
||||
AC_DEFINE(ptrdiff_t, long)
|
||||
AC_CHECK_TYPE(bits64_t, double)
|
||||
fi
|
||||
])
|
||||
|
||||
|
|
@ -548,7 +486,7 @@ s = getenv("ABCDE");
|
|||
exit(s == 0); /* force optimizer to leave getenv in */
|
||||
}
|
||||
], bash_cv_getenv_redef=yes, bash_cv_getenv_redef=no,
|
||||
[AC_MSG_ERROR(cannot check getenv redefinition if cross compiling -- defaulting to yes)
|
||||
[AC_MSG_WARN(cannot check getenv redefinition if cross compiling -- defaulting to yes)
|
||||
bash_cv_getenv_redef=yes]
|
||||
)])
|
||||
AC_MSG_RESULT($bash_cv_getenv_redef)
|
||||
|
|
@ -574,7 +512,7 @@ pf = (_bashfunc) printf;
|
|||
exit(pf == 0);
|
||||
}
|
||||
], bash_cv_printf_declared=yes, bash_cv_printf_declared=no,
|
||||
[AC_MSG_ERROR(cannot check printf declaration if cross compiling -- defaulting to yes)
|
||||
[AC_MSG_WARN(cannot check printf declaration if cross compiling -- defaulting to yes)
|
||||
bash_cv_printf_declared=yes]
|
||||
)])
|
||||
AC_MSG_RESULT($bash_cv_printf_declared)
|
||||
|
|
@ -593,7 +531,7 @@ long maxfds = ulimit(4, 0L);
|
|||
exit (maxfds == -1L);
|
||||
}
|
||||
], bash_cv_ulimit_maxfds=yes, bash_cv_ulimit_maxfds=no,
|
||||
[AC_MSG_ERROR(cannot check ulimit if cross compiling -- defaulting to no)
|
||||
[AC_MSG_WARN(cannot check ulimit if cross compiling -- defaulting to no)
|
||||
bash_cv_ulimit_maxfds=no]
|
||||
)])
|
||||
AC_MSG_RESULT($bash_cv_ulimit_maxfds)
|
||||
|
|
@ -690,7 +628,7 @@ main()
|
|||
exit (popen_called);
|
||||
}
|
||||
], bash_cv_getcwd_calls_popen=no, bash_cv_getcwd_calls_popen=yes,
|
||||
[AC_MSG_ERROR(cannot check whether getcwd calls popen if cross compiling -- defaulting to no)
|
||||
[AC_MSG_WARN(cannot check whether getcwd calls popen if cross compiling -- defaulting to no)
|
||||
bash_cv_getcwd_calls_popen=no]
|
||||
)])
|
||||
AC_MSG_RESULT($bash_cv_getcwd_calls_popen)
|
||||
|
|
@ -814,7 +752,7 @@ main()
|
|||
exit(nsigint != 2);
|
||||
}
|
||||
], bash_cv_must_reinstall_sighandlers=no, bash_cv_must_reinstall_sighandlers=yes,
|
||||
[AC_MSG_ERROR(cannot check signal handling if cross compiling -- defaulting to no)
|
||||
[AC_MSG_WARN(cannot check signal handling if cross compiling -- defaulting to no)
|
||||
bash_cv_must_reinstall_sighandlers=no]
|
||||
)])
|
||||
AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers)
|
||||
|
|
@ -883,7 +821,7 @@ exit(1);
|
|||
|
||||
exit(0);
|
||||
}], bash_cv_job_control_missing=present, bash_cv_job_control_missing=missing,
|
||||
[AC_MSG_ERROR(cannot check job control if cross-compiling -- defaulting to missing)
|
||||
[AC_MSG_WARN(cannot check job control if cross-compiling -- defaulting to missing)
|
||||
bash_cv_job_control_missing=missing]
|
||||
)])
|
||||
AC_MSG_RESULT($bash_cv_job_control_missing)
|
||||
|
|
@ -928,7 +866,7 @@ close(fd);
|
|||
unlink ("/tmp/sh-np-autoconf");
|
||||
exit(0);
|
||||
}], bash_cv_sys_named_pipes=present, bash_cv_sys_named_pipes=missing,
|
||||
[AC_MSG_ERROR(cannot check for named pipes if cross-compiling -- defaulting to missing)
|
||||
[AC_MSG_WARN(cannot check for named pipes if cross-compiling -- defaulting to missing)
|
||||
bash_cv_sys_named_pipes=missing]
|
||||
)])
|
||||
AC_MSG_RESULT($bash_cv_sys_named_pipes)
|
||||
|
|
@ -979,7 +917,7 @@ siglongjmp(xx, 10);
|
|||
exit(1);
|
||||
#endif
|
||||
}], bash_cv_func_sigsetjmp=present, bash_cv_func_sigsetjmp=missing,
|
||||
[AC_MSG_ERROR(cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing)
|
||||
[AC_MSG_WARN(cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing)
|
||||
bash_cv_func_sigsetjmp=missing]
|
||||
)])
|
||||
AC_MSG_RESULT($bash_cv_func_sigsetjmp)
|
||||
|
|
@ -1246,7 +1184,7 @@ char *v[];
|
|||
exit (r1 > 0 && r2 > 0);
|
||||
}
|
||||
], bash_cv_func_strcoll_broken=yes, bash_cv_func_strcoll_broken=no,
|
||||
[AC_MSG_ERROR(cannot check strcoll if cross compiling -- defaulting to no)
|
||||
[AC_MSG_WARN(cannot check strcoll if cross compiling -- defaulting to no)
|
||||
bash_cv_func_strcoll_broken=no]
|
||||
)])
|
||||
AC_MSG_RESULT($bash_cv_func_strcoll_broken)
|
||||
|
|
@ -1336,9 +1274,28 @@ main ()
|
|||
#endif
|
||||
}
|
||||
], bash_cv_sys_restartable_syscalls=yes, bash_cv_sys_restartable_syscalls=no,
|
||||
AC_MSG_ERROR(cannot check restartable syscalls if cross compiling))
|
||||
AC_MSG_WARN(cannot check restartable syscalls if cross compiling))
|
||||
])
|
||||
if test $bash_cv_sys_restartable_syscalls = yes; then
|
||||
AC_DEFINE(HAVE_RESTARTABLE_SYSCALLS)
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl Check for 64-bit off_t -- used for malloc alignment
|
||||
dnl
|
||||
dnl C does not allow duplicate case labels, so the compile will fail if
|
||||
dnl sizeof(off_t) is > 4.
|
||||
dnl
|
||||
AC_DEFUN(BASH_CHECK_OFF_T_64,
|
||||
[AC_CACHE_CHECK(for 64-bit off_t, bash_cv_off_t_64,
|
||||
AC_TRY_COMPILE([
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
],[
|
||||
switch (0) case 0: case (sizeof (off_t) <= 4):;
|
||||
], bash_cv_off_t_64=no, bash_cv_off_t_64=yes))
|
||||
if test $bash_cv_off_t_64 = yes; then
|
||||
AC_DEFINE(HAVE_OFF_T_64)
|
||||
fi])
|
||||
|
|
|
|||
|
|
@ -289,7 +289,7 @@ maybe_append_history (filename)
|
|||
/* If the filename was supplied, then create it if necessary. */
|
||||
if (stat (filename, &buf) == -1 && errno == ENOENT)
|
||||
{
|
||||
fd = open (filename, O_WRONLY|O_CREAT, 0666);
|
||||
fd = open (filename, O_WRONLY|O_CREAT, 0600);
|
||||
if (fd < 0)
|
||||
{
|
||||
builtin_error ("%s: cannot create: %s", filename, strerror (errno));
|
||||
|
|
@ -324,7 +324,7 @@ maybe_save_shell_history ()
|
|||
if (stat (hf, &buf) == -1)
|
||||
{
|
||||
int file;
|
||||
file = open (hf, O_CREAT | O_TRUNC | O_WRONLY, 0666);
|
||||
file = open (hf, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
||||
if (file != -1)
|
||||
close (file);
|
||||
}
|
||||
|
|
|
|||
91
bashline.c
91
bashline.c
|
|
@ -239,50 +239,50 @@ initialize_readline ()
|
|||
#endif
|
||||
|
||||
#if defined (BRACE_COMPLETION)
|
||||
rl_add_defun ("complete-into-braces", bash_brace_completion, -1);
|
||||
rl_bind_key_in_map ('{', bash_brace_completion, emacs_meta_keymap);
|
||||
rl_add_defun ("complete-into-braces", (Function *)bash_brace_completion, -1);
|
||||
rl_bind_key_in_map ('{', (Function *)bash_brace_completion, emacs_meta_keymap);
|
||||
#endif /* BRACE_COMPLETION */
|
||||
|
||||
#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
|
||||
rl_add_defun ("complete-filename", bash_complete_filename, -1);
|
||||
rl_bind_key_in_map ('/', bash_complete_filename, emacs_meta_keymap);
|
||||
rl_add_defun ("complete-filename", (Function *)bash_complete_filename, -1);
|
||||
rl_bind_key_in_map ('/', (Function *)bash_complete_filename, emacs_meta_keymap);
|
||||
rl_add_defun ("possible-filename-completions",
|
||||
bash_possible_filename_completions, -1);
|
||||
rl_bind_key_in_map ('/', bash_possible_filename_completions, emacs_ctlx_keymap);
|
||||
(Function *)bash_possible_filename_completions, -1);
|
||||
rl_bind_key_in_map ('/', (Function *)bash_possible_filename_completions, emacs_ctlx_keymap);
|
||||
|
||||
rl_add_defun ("complete-username", bash_complete_username, -1);
|
||||
rl_bind_key_in_map ('~', bash_complete_username, emacs_meta_keymap);
|
||||
rl_add_defun ("complete-username", (Function *)bash_complete_username, -1);
|
||||
rl_bind_key_in_map ('~', (Function *)bash_complete_username, emacs_meta_keymap);
|
||||
rl_add_defun ("possible-username-completions",
|
||||
bash_possible_username_completions, -1);
|
||||
rl_bind_key_in_map ('~', bash_possible_username_completions, emacs_ctlx_keymap);
|
||||
(Function *)bash_possible_username_completions, -1);
|
||||
rl_bind_key_in_map ('~', (Function *)bash_possible_username_completions, emacs_ctlx_keymap);
|
||||
|
||||
rl_add_defun ("complete-hostname", bash_complete_hostname, -1);
|
||||
rl_bind_key_in_map ('@', bash_complete_hostname, emacs_meta_keymap);
|
||||
rl_add_defun ("complete-hostname", (Function *)bash_complete_hostname, -1);
|
||||
rl_bind_key_in_map ('@', (Function *)bash_complete_hostname, emacs_meta_keymap);
|
||||
rl_add_defun ("possible-hostname-completions",
|
||||
bash_possible_hostname_completions, -1);
|
||||
rl_bind_key_in_map ('@', bash_possible_hostname_completions, emacs_ctlx_keymap);
|
||||
(Function *)bash_possible_hostname_completions, -1);
|
||||
rl_bind_key_in_map ('@', (Function *)bash_possible_hostname_completions, emacs_ctlx_keymap);
|
||||
|
||||
rl_add_defun ("complete-variable", bash_complete_variable, -1);
|
||||
rl_bind_key_in_map ('$', bash_complete_variable, emacs_meta_keymap);
|
||||
rl_add_defun ("complete-variable", (Function *)bash_complete_variable, -1);
|
||||
rl_bind_key_in_map ('$', (Function *)bash_complete_variable, emacs_meta_keymap);
|
||||
rl_add_defun ("possible-variable-completions",
|
||||
bash_possible_variable_completions, -1);
|
||||
rl_bind_key_in_map ('$', bash_possible_variable_completions, emacs_ctlx_keymap);
|
||||
(Function *)bash_possible_variable_completions, -1);
|
||||
rl_bind_key_in_map ('$', (Function *)bash_possible_variable_completions, emacs_ctlx_keymap);
|
||||
|
||||
rl_add_defun ("complete-command", bash_complete_command, -1);
|
||||
rl_bind_key_in_map ('!', bash_complete_command, emacs_meta_keymap);
|
||||
rl_add_defun ("complete-command", (Function *)bash_complete_command, -1);
|
||||
rl_bind_key_in_map ('!', (Function *)bash_complete_command, emacs_meta_keymap);
|
||||
rl_add_defun ("possible-command-completions",
|
||||
bash_possible_command_completions, -1);
|
||||
rl_bind_key_in_map ('!', bash_possible_command_completions, emacs_ctlx_keymap);
|
||||
(Function *)bash_possible_command_completions, -1);
|
||||
rl_bind_key_in_map ('!', (Function *)bash_possible_command_completions, emacs_ctlx_keymap);
|
||||
|
||||
rl_add_defun ("glob-expand-word", bash_glob_expand_word, -1);
|
||||
rl_add_defun ("glob-list-expansions", bash_glob_list_expansions, -1);
|
||||
rl_bind_key_in_map ('*', bash_glob_expand_word, emacs_ctlx_keymap);
|
||||
rl_bind_key_in_map ('g', bash_glob_list_expansions, emacs_ctlx_keymap);
|
||||
rl_add_defun ("glob-expand-word", (Function *)bash_glob_expand_word, -1);
|
||||
rl_add_defun ("glob-list-expansions", (Function *)bash_glob_list_expansions, -1);
|
||||
rl_bind_key_in_map ('*', (Function *)bash_glob_expand_word, emacs_ctlx_keymap);
|
||||
rl_bind_key_in_map ('g', (Function *)bash_glob_list_expansions, emacs_ctlx_keymap);
|
||||
|
||||
#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
|
||||
|
||||
rl_add_defun ("dynamic-complete-history", dynamic_complete_history, -1);
|
||||
rl_bind_key_in_map (TAB, dynamic_complete_history, emacs_meta_keymap);
|
||||
rl_add_defun ("dynamic-complete-history", (Function *)dynamic_complete_history, -1);
|
||||
rl_bind_key_in_map (TAB, (Function *)dynamic_complete_history, emacs_meta_keymap);
|
||||
|
||||
/* Tell the completer that we want a crack first. */
|
||||
rl_attempted_completion_function = (CPPFunction *)attempt_shell_completion;
|
||||
|
|
@ -295,9 +295,9 @@ initialize_readline ()
|
|||
rl_ignore_some_completions_function = (Function *)filename_completion_ignore;
|
||||
|
||||
#if defined (VI_MODE)
|
||||
rl_bind_key_in_map ('v', vi_edit_and_execute_command, vi_movement_keymap);
|
||||
rl_bind_key_in_map ('v', (Function *)vi_edit_and_execute_command, vi_movement_keymap);
|
||||
# if defined (ALIAS)
|
||||
rl_bind_key_in_map ('@', posix_edit_macros, vi_movement_keymap);
|
||||
rl_bind_key_in_map ('@', (Function *)posix_edit_macros, vi_movement_keymap);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
|
@ -561,7 +561,7 @@ static void
|
|||
set_saved_history ()
|
||||
{
|
||||
if (saved_history_line_to_use >= 0)
|
||||
rl_get_previous_history (history_length - saved_history_line_to_use);
|
||||
rl_get_previous_history (history_length - saved_history_line_to_use, 0);
|
||||
saved_history_line_to_use = -1;
|
||||
rl_startup_hook = old_rl_startup_hook;
|
||||
}
|
||||
|
|
@ -573,7 +573,7 @@ operate_and_get_next (count, c)
|
|||
int where;
|
||||
|
||||
/* Accept the current line. */
|
||||
rl_newline ();
|
||||
rl_newline (1, c);
|
||||
|
||||
/* Find the current line, and find the next line to use. */
|
||||
where = where_history ();
|
||||
|
|
@ -602,7 +602,7 @@ vi_edit_and_execute_command (count, c)
|
|||
char *command;
|
||||
|
||||
/* Accept the current line. */
|
||||
rl_newline ();
|
||||
rl_newline (1, c);
|
||||
|
||||
if (rl_explicit_arg)
|
||||
{
|
||||
|
|
@ -1258,7 +1258,7 @@ set_up_new_line (new_line)
|
|||
{
|
||||
rl_point = old_point;
|
||||
if (!whitespace (rl_line_buffer[rl_point]))
|
||||
rl_forward_word (1);
|
||||
rl_forward_word (1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1419,7 +1419,7 @@ shell_expand_line (ignore)
|
|||
{
|
||||
rl_point = old_point;
|
||||
if (!whitespace (rl_line_buffer[rl_point]))
|
||||
rl_forward_word (1);
|
||||
rl_forward_word (1, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -1553,10 +1553,24 @@ name_is_acceptable (name)
|
|||
return (1);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int
|
||||
ignore_dot_names (name)
|
||||
char *name;
|
||||
{
|
||||
return (name[0] != '.');
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
filename_completion_ignore (names)
|
||||
char **names;
|
||||
{
|
||||
#if 0
|
||||
if (glob_dot_filenames == 0)
|
||||
_ignore_completion_names (names, ignore_dot_names);
|
||||
#endif
|
||||
|
||||
setup_ignore_patterns (&fignore);
|
||||
|
||||
if (fignore.num_ignores == 0)
|
||||
|
|
@ -1597,14 +1611,15 @@ static int
|
|||
bash_directory_completion_hook (dirname)
|
||||
char **dirname;
|
||||
{
|
||||
char *local_dirname, *t;
|
||||
char *local_dirname, *new_dirname, *t;
|
||||
int return_value = 0;
|
||||
WORD_LIST *wl;
|
||||
|
||||
local_dirname = *dirname;
|
||||
new_dirname = savestring (local_dirname);
|
||||
if (strchr (local_dirname, '$') || strchr (local_dirname, '`'))
|
||||
{
|
||||
wl = expand_string (local_dirname, 0);
|
||||
wl = expand_string (new_dirname, 0);
|
||||
if (wl)
|
||||
{
|
||||
*dirname = string_list (wl);
|
||||
|
|
@ -1612,11 +1627,13 @@ bash_directory_completion_hook (dirname)
|
|||
actually expanded something. */
|
||||
return_value = STREQ (local_dirname, *dirname) == 0;
|
||||
free (local_dirname);
|
||||
free (new_dirname);
|
||||
dispose_words (wl);
|
||||
local_dirname = *dirname;
|
||||
}
|
||||
else
|
||||
{
|
||||
free (new_dirname);
|
||||
free (local_dirname);
|
||||
*dirname = xmalloc (1);
|
||||
**dirname = '\0';
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
# This Makefile for building libbuiltins.a is in -*- text -*- for Emacs.
|
||||
#
|
||||
SHELL = /bin/sh
|
||||
SHELL = @MAKE_SHELL@
|
||||
RANLIB = @RANLIB@
|
||||
CC = @CC@
|
||||
CC_FOR_BUILD = @CC_FOR_BUILD@
|
||||
AR = @AR@
|
||||
ARFLAGS = @ARFLAGS@
|
||||
RM = rm -f
|
||||
CP = cp
|
||||
|
||||
|
|
@ -24,7 +25,7 @@ LDFLAGS = @LDFLAGS@ $(LOCAL_LDFLAGS) $(CFLAGS)
|
|||
LOCAL_LDFLAGS = @LOCAL_LDFLAGS@
|
||||
LIBS = @LIBS@
|
||||
|
||||
INCLUDES = -I. -I.. -I$(topdir) -I$(topdir)/lib -I$(srcdir)
|
||||
INCLUDES = -I. -I.. @RL_INCLUDE@ -I$(topdir) -I$(topdir)/lib -I$(srcdir)
|
||||
|
||||
CCFLAGS = ${PROFILE_FLAGS} $(DEFS) $(LOCAL_DEFS) $(SYSTEM_FLAGS) $(CPPFLAGS) \
|
||||
${INCLUDES} $(LOCAL_CFLAGS) $(CFLAGS)
|
||||
|
|
@ -87,7 +88,7 @@ all: $(MKBUILTINS) libbuiltins.a
|
|||
|
||||
libbuiltins.a: $(MKBUILTINS) $(OFILES) builtins.o
|
||||
$(RM) $@
|
||||
$(AR) cr $@ $(OFILES)
|
||||
$(AR) $(ARFLAGS) $@ $(OFILES)
|
||||
-$(RANLIB) $@
|
||||
|
||||
builtext.h builtins.c: $(MKBUILTINS) $(DEFSRC)
|
||||
|
|
@ -95,12 +96,12 @@ builtext.h builtins.c: $(MKBUILTINS) $(DEFSRC)
|
|||
@-if test -f builtext.h; then mv -f builtext.h old-builtext.h; fi
|
||||
./$(MKBUILTINS) -externfile builtext.h -structfile builtins.c \
|
||||
-noproduction $(DIRECTDEFINE) $(DEFSRC)
|
||||
@-if cmp -s old-builtext.h builtext.h; then \
|
||||
@-if cmp -s old-builtext.h builtext.h 2>/dev/null; then \
|
||||
mv old-builtext.h builtext.h; \
|
||||
else \
|
||||
$(RM) old-builtext.h; \
|
||||
fi
|
||||
@-if cmp -s old-builtins.c builtins.c; then \
|
||||
@-if cmp -s old-builtins.c builtins.c 2>/dev/null; then \
|
||||
mv old-builtins.c builtins.c; \
|
||||
else \
|
||||
$(RM) old-builtins.c; \
|
||||
|
|
@ -112,7 +113,7 @@ mkbuiltins.o: mkbuiltins.c
|
|||
$(CC_FOR_BUILD) -c $(CCFLAGS) $<
|
||||
|
||||
mkbuiltins: mkbuiltins.o
|
||||
$(CC_FOR_BUILD) $(LDFLAGS) -o $(MKBUILTINS) mkbuiltins.o $(LIBS)
|
||||
$(CC_FOR_BUILD) $(PROFILE_FLAGS) $(LDFLAGS) -o $(MKBUILTINS) mkbuiltins.o $(LIBS)
|
||||
|
||||
# rules for deficient makes, like SunOS
|
||||
mkbuiltins.o: mkbuiltins.c
|
||||
|
|
@ -126,7 +127,7 @@ evalfile.o: evalfile.c
|
|||
ulimit.o: pipesize.h
|
||||
|
||||
pipesize.h: psize.aux
|
||||
$(SHELL) $(srcdir)/psize.sh > pipesize.h
|
||||
$(SHELL) $(srcdir)/psize.sh > $@
|
||||
|
||||
psize.aux: psize.c
|
||||
$(CC_FOR_BUILD) $(CCFLAGS) -o $@ $(srcdir)/psize.c
|
||||
|
|
@ -139,7 +140,7 @@ builtins.texi: $(MKBUILTINS)
|
|||
./$(MKBUILTINS) -documentonly $(DEFSRC)
|
||||
|
||||
clean:
|
||||
$(RM) $(OFILES) $(CREATED_FILES) $(MKBUILTINS) libbuiltins.a
|
||||
$(RM) $(OFILES) $(CREATED_FILES) $(MKBUILTINS) mkbuiltins.o libbuiltins.a
|
||||
|
||||
mostlyclean:
|
||||
$(RM) $(OFILES) libbuiltins.a
|
||||
|
|
|
|||
|
|
@ -140,22 +140,20 @@ bindpwd (no_symlinks)
|
|||
else
|
||||
dirname = get_working_directory ("cd");
|
||||
|
||||
bind_variable ("OLDPWD", get_string_value ("PWD"));
|
||||
|
||||
old_anm = array_needs_making;
|
||||
tvar = bind_variable ("PWD", dirname);
|
||||
/* This is an efficiency hack. If PWD is exported, we will need to
|
||||
remake the exported environment every time we change directories.
|
||||
If there is no other reason to make the exported environment, just
|
||||
update PWD in place and mark the exported environment as no longer
|
||||
needing a remake. */
|
||||
pwdvar = get_string_value ("PWD");
|
||||
|
||||
tvar = bind_variable ("OLDPWD", pwdvar);
|
||||
if (old_anm == 0 && array_needs_making && exported_p (tvar))
|
||||
{
|
||||
pwdvar = xmalloc (STRLEN (dirname) + 5); /* 5 = "PWD" + '=' + '\0' */
|
||||
strcpy (pwdvar, "PWD=");
|
||||
if (dirname)
|
||||
strcpy (pwdvar + 4, dirname);
|
||||
add_or_supercede_exported_var (pwdvar, 0);
|
||||
update_export_env_inplace ("OLDPWD=", 7, pwdvar);
|
||||
array_needs_making = 0;
|
||||
}
|
||||
|
||||
tvar = bind_variable ("PWD", dirname);
|
||||
if (old_anm == 0 && array_needs_making && exported_p (tvar))
|
||||
{
|
||||
update_export_env_inplace ("PWD=", 4, dirname);
|
||||
array_needs_making = 0;
|
||||
}
|
||||
|
||||
|
|
@ -243,7 +241,7 @@ cd_builtin (list)
|
|||
{
|
||||
/* Find directory in $CDPATH. */
|
||||
path_index = 0;
|
||||
while ((path = extract_colon_unit (cdpath, &path_index)))
|
||||
while (path = extract_colon_unit (cdpath, &path_index))
|
||||
{
|
||||
/* OPT is 1 if the path element is non-empty */
|
||||
opt = path[0] != '\0';
|
||||
|
|
|
|||
|
|
@ -26,17 +26,17 @@ $FUNCTION enable_builtin
|
|||
$SHORT_DOC enable [-pnds] [-a] [-f filename] [name ...]
|
||||
Enable and disable builtin shell commands. This allows
|
||||
you to use a disk command which has the same name as a shell
|
||||
builtin. If -n is used, the NAMEs become disabled; otherwise
|
||||
NAMEs are enabled. For example, to use the `test' found on your
|
||||
path instead of the shell builtin version, type `enable -n test'.
|
||||
On systems supporting dynamic loading, the -f option may be used
|
||||
to load new builtins from the shared object FILENAME. The -d
|
||||
option will delete a builtin previously loaded with -f. If no
|
||||
non-option names are given, or the -p option is supplied, a list
|
||||
of builtins is printed. The -a option means to print every builtin
|
||||
with an indication of whether or not it is enabled. The -s option
|
||||
restricts the output to the Posix.2 `special' builtins. The -n
|
||||
option displays a list of all disabled builtins.
|
||||
builtin without specifying a full pathname. If -n is used, the
|
||||
NAMEs become disabled; otherwise NAMEs are enabled. For example,
|
||||
to use the `test' found in $PATH instead of the shell builtin
|
||||
version, type `enable -n test'. On systems supporting dynamic
|
||||
loading, the -f option may be used to load new builtins from the
|
||||
shared object FILENAME. The -d option will delete a builtin
|
||||
previously loaded with -f. If no non-option names are given, or
|
||||
the -p option is supplied, a list of builtins is printed. The
|
||||
-a option means to print every builtin with an indication of whether
|
||||
or not it is enabled. The -s option restricts the output to the POSIX.2
|
||||
`special' builtins. The -n option displays a list of all disabled builtins.
|
||||
$END
|
||||
|
||||
#include <config.h>
|
||||
|
|
@ -391,6 +391,20 @@ delete_builtin (b)
|
|||
shell_builtins = new_shell_builtins;
|
||||
}
|
||||
|
||||
/* Tenon's MachTen has a dlclose that doesn't return a value, so we
|
||||
finesse it with a local wrapper. */
|
||||
static int
|
||||
local_dlclose (handle)
|
||||
void *handle;
|
||||
{
|
||||
#if !defined (__MACHTEN__)
|
||||
return (dlclose (handle));
|
||||
#else /* __MACHTEN__ */
|
||||
dlclose (handle);
|
||||
return ((dlerror () != NULL) ? -1 : 0);
|
||||
#endif /* __MACHTEN__ */
|
||||
}
|
||||
|
||||
static int
|
||||
dyn_unload_builtin (name)
|
||||
char *name;
|
||||
|
|
@ -398,6 +412,7 @@ dyn_unload_builtin (name)
|
|||
struct builtin *b;
|
||||
void *handle;
|
||||
int ref, i;
|
||||
char *uerror;
|
||||
|
||||
b = builtin_address_internal (name, 1);
|
||||
if (b == 0)
|
||||
|
|
@ -420,7 +435,7 @@ dyn_unload_builtin (name)
|
|||
|
||||
/* Don't remove the shared object unless the reference count of builtins
|
||||
using it drops to zero. */
|
||||
if (ref == 1 && dlclose (handle) != 0)
|
||||
if (ref == 1 && local_dlclose (handle) != 0)
|
||||
{
|
||||
builtin_error ("cannot delete %s: %s", name, dlerror ());
|
||||
return (EXECUTION_FAILURE);
|
||||
|
|
|
|||
|
|
@ -51,6 +51,8 @@
|
|||
extern int errno;
|
||||
#endif
|
||||
|
||||
#define IS_BUILTIN(s) (builtin_address_internal(s, 0) != (struct builtin *)NULL)
|
||||
|
||||
extern void run_trap_cleanup ();
|
||||
|
||||
extern int interactive, interactive_shell;
|
||||
|
|
@ -181,7 +183,7 @@ parse_and_execute (string, from_file, flags)
|
|||
}
|
||||
|
||||
default:
|
||||
programming_error ("parse_and_execute: bad jump: code %d", code);
|
||||
command_error ("parse_and_execute", CMDERR_BADJUMP, code, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -206,9 +208,20 @@ parse_and_execute (string, from_file, flags)
|
|||
global_command = (COMMAND *)NULL;
|
||||
|
||||
#if defined (ONESHOT)
|
||||
if (startup_state == 2 && *bash_input.location.string == '\0' &&
|
||||
command->type == cm_simple && !command->redirects &&
|
||||
!command->value.Simple->redirects &&
|
||||
/*
|
||||
* IF
|
||||
* we were invoked as `bash -c' (startup_state == 2) AND
|
||||
* parse_and_execute has not been called recursively AND
|
||||
* we have parsed the full command (string == '\0') AND
|
||||
* we have a simple command without redirections AND
|
||||
* the command is not being timed
|
||||
* THEN
|
||||
* tell the execution code that we don't need to fork
|
||||
*/
|
||||
if (startup_state == 2 && parse_and_execute_level == 1 &&
|
||||
*bash_input.location.string == '\0' &&
|
||||
command->type == cm_simple &&
|
||||
!command->redirects && !command->value.Simple->redirects &&
|
||||
((command->flags & CMD_TIME_PIPELINE) == 0))
|
||||
{
|
||||
command->flags |= CMD_NO_FORK;
|
||||
|
|
|
|||
|
|
@ -26,13 +26,13 @@ $FUNCTION fc_builtin
|
|||
$DEPENDS_ON HISTORY
|
||||
$SHORT_DOC fc [-e ename] [-nlr] [first] [last] or fc -s [pat=rep] [cmd]
|
||||
|
||||
fc is used to list or edit and re-execute commands from the history list.
|
||||
FIRST and LAST can be numbers specifying the range, or FIRST can be a
|
||||
string, which means the most recent command beginning with that
|
||||
string.
|
||||
|
||||
-e ENAME selects which editor to use. Default is FCEDIT, then EDITOR,
|
||||
then the editor which corresponds to the current readline editing
|
||||
mode, then vi.
|
||||
then vi.
|
||||
|
||||
-l means list lines instead of editing.
|
||||
-n means no line numbers listed.
|
||||
|
|
@ -156,7 +156,7 @@ fc_builtin (list)
|
|||
register int i;
|
||||
register char *sep;
|
||||
int numbering, reverse, listing, execute;
|
||||
int histbeg, histend, last_hist, retval, first, opt;
|
||||
int histbeg, histend, last_hist, retval, opt;
|
||||
FILE *stream;
|
||||
REPL *rlist, *rl;
|
||||
char *ename, *command, *newcom, *line;
|
||||
|
|
@ -372,64 +372,11 @@ fc_builtin (list)
|
|||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
/* Now reopen the file and execute the edited commands. */
|
||||
|
||||
stream = fopen (fn, "r");
|
||||
|
||||
if (stream == NULL)
|
||||
{
|
||||
builtin_error ("cannot reopen temp file %s", fn);
|
||||
unlink (fn);
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
retval = EXECUTION_SUCCESS;
|
||||
first = 1;
|
||||
|
||||
#if 1
|
||||
/* Make sure parse_and_execute doesn't turn this off, even though a
|
||||
call to parse_and_execute farther up the function call stack (e.g.,
|
||||
if this is called by vi_edit_and_execute_command) may have already
|
||||
called bash_history_disable. */
|
||||
remember_on_history = 1;
|
||||
#else
|
||||
/* First, write the commands to the history file. This will not happen
|
||||
when we call parse_and_execute, since parse_and_execute disables
|
||||
the command line history while it executes. */
|
||||
|
||||
opt = current_command_line_count;
|
||||
while ((line = fc_readline (stream)) != NULL)
|
||||
{
|
||||
if (line[0] == '\n')
|
||||
{
|
||||
free (line);
|
||||
continue; /* Skip blank lines. */
|
||||
}
|
||||
|
||||
if (first)
|
||||
{
|
||||
first = 0;
|
||||
/* If we retrieved only one command from the history file, but we
|
||||
read multiple lines from the edited file, and literal_history
|
||||
has been set by `shopt', we assume that it was a compound
|
||||
command stored with embedded newlines. In this case, we want
|
||||
the history code to store it as one command again. */
|
||||
if (literal_history && histbeg == histend)
|
||||
current_command_line_count = 1;
|
||||
fc_replhist (line);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (literal_history && histbeg == histend)
|
||||
current_command_line_count++;
|
||||
fc_addhist (line);
|
||||
}
|
||||
|
||||
free (line);
|
||||
}
|
||||
fclose (stream);
|
||||
current_command_line_count = opt;
|
||||
#endif
|
||||
|
||||
/* Turn on the `v' flag while fc_execute_file runs so the commands
|
||||
will be echoed as they are read by the parser. */
|
||||
|
|
|
|||
|
|
@ -232,6 +232,19 @@ sh_getopt_restore_state (argv)
|
|||
nextchar = argv[sh_curopt] + sh_charindex;
|
||||
}
|
||||
|
||||
#if 0
|
||||
void
|
||||
sh_getopt_debug_restore_state (argv)
|
||||
char **argv;
|
||||
{
|
||||
if (nextchar && nextchar != argv[sh_curopt] + sh_charindex)
|
||||
{
|
||||
itrace("sh_getopt_debug_restore_state: resetting nextchar");
|
||||
nextchar = argv[sh_curopt] + sh_charindex;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
/* Compile with -DTEST to make an executable for use in testing
|
||||
|
|
|
|||
|
|
@ -181,6 +181,8 @@ dogetopts (argc, argv)
|
|||
{
|
||||
for (i = 0; i < 10 && dollar_vars[i]; i++)
|
||||
;
|
||||
|
||||
sh_getopt_restore_state (dollar_vars);
|
||||
ret = sh_getopt (i, dollar_vars, optstr);
|
||||
}
|
||||
else
|
||||
|
|
@ -198,6 +200,7 @@ dogetopts (argc, argv)
|
|||
for (words = rest_of_args; words; words = words->next, i++)
|
||||
v[i] = words->word->word;
|
||||
v[i] = (char *)NULL;
|
||||
sh_getopt_restore_state (v);
|
||||
ret = sh_getopt (i, v, optstr);
|
||||
free (v);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -130,6 +130,10 @@ char *assignment_builtins[] =
|
|||
static int is_special_builtin ();
|
||||
static int is_assignment_builtin ();
|
||||
|
||||
#if !defined (HAVE_RENAME)
|
||||
static int rename ();
|
||||
#endif
|
||||
|
||||
void extract_info ();
|
||||
|
||||
void file_error ();
|
||||
|
|
@ -265,8 +269,7 @@ main (argc, argv)
|
|||
{
|
||||
write_longdocs (structfile, saved_builtins);
|
||||
fclose (structfile);
|
||||
link (temp_struct_filename, struct_filename);
|
||||
unlink (temp_struct_filename);
|
||||
rename (temp_struct_filename, struct_filename);
|
||||
}
|
||||
|
||||
if (externfile)
|
||||
|
|
@ -457,6 +460,10 @@ extract_info (filename, structfile, externfile)
|
|||
if ((nr = read (fd, buffer, file_size)) < 0)
|
||||
file_error (filename);
|
||||
|
||||
/* This is needed on WIN32, and does not hurt on Unix. */
|
||||
if (nr < file_size)
|
||||
file_size = nr;
|
||||
|
||||
close (fd);
|
||||
|
||||
if (nr == 0)
|
||||
|
|
@ -1395,3 +1402,16 @@ is_assignment_builtin (name)
|
|||
{
|
||||
return (_find_in_table (name, assignment_builtins));
|
||||
}
|
||||
|
||||
#if !defined (HAVE_RENAME)
|
||||
static int
|
||||
rename (from, to)
|
||||
char *from, *to;
|
||||
{
|
||||
unlink (to);
|
||||
if (link (from, to) < 0)
|
||||
return (-1);
|
||||
unlink (from);
|
||||
return (0);
|
||||
}
|
||||
#endif /* !HAVE_RENAME */
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ int
|
|||
printf_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int ch, end, fieldwidth, precision, foundmod;
|
||||
int ch, end, fieldwidth, precision, foundmod, fmtlen;
|
||||
char convch, nextch, *format, *fmt, *start;
|
||||
|
||||
retval = EXECUTION_SUCCESS;
|
||||
|
|
@ -125,12 +125,12 @@ printf_builtin (list)
|
|||
if (list->word->word == 0 || list->word->word[0] == '\0')
|
||||
return (EXECUTION_SUCCESS);
|
||||
|
||||
format = ansicstr (list->word->word, strlen (list->word->word), (int *)NULL, (int *)NULL);
|
||||
format = ansicstr (list->word->word, strlen (list->word->word), (int *)NULL, &fmtlen);
|
||||
|
||||
garglist = list->next;
|
||||
|
||||
/* If the format string is empty after preprocessing, return immediately. */
|
||||
if (format == 0 || *format == 0)
|
||||
if ((format == 0 || *format == 0) && fmtlen == 0)
|
||||
return (EXECUTION_SUCCESS);
|
||||
|
||||
/* Basic algorithm is to scan the format string for conversion
|
||||
|
|
@ -139,11 +139,12 @@ printf_builtin (list)
|
|||
format strings are reused as necessary to use up the provided
|
||||
arguments, arguments of zero/null string are provided to use
|
||||
up the format string. */
|
||||
#define FMTIND (fmt - format)
|
||||
|
||||
do
|
||||
{
|
||||
/* find next format specification */
|
||||
for (fmt = format; *fmt; fmt++)
|
||||
for (fmt = format; FMTIND < fmtlen; fmt++)
|
||||
{
|
||||
precision = fieldwidth = foundmod = 0;
|
||||
|
||||
|
|
@ -179,11 +180,6 @@ printf_builtin (list)
|
|||
/* skip to conversion char */
|
||||
for (; *fmt && strchr(SKIP2, *fmt); ++fmt)
|
||||
;
|
||||
if (*fmt == 0)
|
||||
{
|
||||
builtin_error ("`%s': missing format character", start);
|
||||
PRETURN (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
/* skip possible format modifiers */
|
||||
if (*fmt == 'l' || *fmt == 'L' || *fmt == 'h')
|
||||
|
|
@ -192,6 +188,12 @@ printf_builtin (list)
|
|||
foundmod = 1;
|
||||
}
|
||||
|
||||
if (*fmt == 0)
|
||||
{
|
||||
builtin_error ("`%s': missing format character", start);
|
||||
PRETURN (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
convch = *fmt;
|
||||
nextch = fmt[1];
|
||||
fmt[1] = '\0';
|
||||
|
|
|
|||
|
|
@ -117,6 +117,10 @@ $END
|
|||
#include "common.h"
|
||||
#include "builtext.h"
|
||||
|
||||
#ifdef LOADABLE_BUILTIN
|
||||
# include "builtins.h"
|
||||
#endif
|
||||
|
||||
#if !defined (errno)
|
||||
extern int errno;
|
||||
#endif /* !errno */
|
||||
|
|
@ -642,4 +646,98 @@ get_directory_stack ()
|
|||
free (d);
|
||||
return ret; /* was (REVERSE_LIST (ret, (WORD_LIST *)); */
|
||||
}
|
||||
|
||||
#ifdef LOADABLE_BUILTIN
|
||||
static char *dirs_doc[] = {
|
||||
"Display the list of currently remembered directories. Directories",
|
||||
"find their way onto the list with the `pushd' command; you can get",
|
||||
"back up through the list with the `popd' command.",
|
||||
"",
|
||||
"The -l flag specifies that `dirs' should not print shorthand versions",
|
||||
"of directories which are relative to your home directory. This means",
|
||||
"that `~/bin' might be displayed as `/homes/bfox/bin'. The -v flag",
|
||||
"causes `dirs' to print the directory stack with one entry per line,",
|
||||
"prepending the directory name with its position in the stack. The -p",
|
||||
"flag does the same thing, but the stack position is not prepended.",
|
||||
"The -c flag clears the directory stack by deleting all of the elements.",
|
||||
"",
|
||||
"+N displays the Nth entry counting from the left of the list shown by",
|
||||
" dirs when invoked without options, starting with zero.",
|
||||
"",
|
||||
"-N displays the Nth entry counting from the right of the list shown by",
|
||||
" dirs when invoked without options, starting with zero.",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
static char *pushd_doc[] = {
|
||||
"Adds a directory to the top of the directory stack, or rotates",
|
||||
"the stack, making the new top of the stack the current working",
|
||||
"directory. With no arguments, exchanges the top two directories.",
|
||||
"",
|
||||
"+N Rotates the stack so that the Nth directory (counting",
|
||||
" from the left of the list shown by `dirs', starting with",
|
||||
" zero) is at the top.",
|
||||
"",
|
||||
"-N Rotates the stack so that the Nth directory (counting",
|
||||
" from the right of the list shown by `dirs', starting with",
|
||||
" zero) is at the top.",
|
||||
"",
|
||||
"-n suppress the normal change of directory when adding directories",
|
||||
" to the stack, so only the stack is manipulated.",
|
||||
"",
|
||||
"dir adds DIR to the directory stack at the top, making it the",
|
||||
" new current working directory.",
|
||||
"",
|
||||
"You can see the directory stack with the `dirs' command.",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
static char *popd_doc[] = {
|
||||
"Removes entries from the directory stack. With no arguments,",
|
||||
"removes the top directory from the stack, and cd's to the new",
|
||||
"top directory.",
|
||||
"",
|
||||
"+N removes the Nth entry counting from the left of the list",
|
||||
" shown by `dirs', starting with zero. For example: `popd +0'",
|
||||
" removes the first directory, `popd +1' the second.",
|
||||
"",
|
||||
"-N removes the Nth entry counting from the right of the list",
|
||||
" shown by `dirs', starting with zero. For example: `popd -0'",
|
||||
" removes the last directory, `popd -1' the next to last.",
|
||||
"",
|
||||
"-n suppress the normal change of directory when removing directories",
|
||||
" from the stack, so only the stack is manipulated.",
|
||||
"",
|
||||
"You can see the directory stack with the `dirs' command.",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin pushd_struct = {
|
||||
"pushd",
|
||||
pushd_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
pushd_doc,
|
||||
"pushd [+N | -N] [-n] [dir]",
|
||||
0
|
||||
};
|
||||
|
||||
struct builtin popd_struct = {
|
||||
"popd",
|
||||
popd_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
popd_doc,
|
||||
"popd [+N | -N] [-n]",
|
||||
0
|
||||
};
|
||||
|
||||
struct builtin dirs_struct = {
|
||||
"dirs",
|
||||
dirs_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
dirs_doc,
|
||||
"dirs [-clpv] [+N] [-N]",
|
||||
0
|
||||
};
|
||||
#endif /* LOADABLE_BUILTIN */
|
||||
|
||||
#endif /* PUSHD_AND_POPD */
|
||||
|
|
|
|||
|
|
@ -189,6 +189,7 @@ read_builtin (list)
|
|||
c = rlbuf[rlind++];
|
||||
}
|
||||
else
|
||||
{
|
||||
#endif
|
||||
|
||||
while (((retval = read (0, &c, 1)) < 0) && errno == EINTR)
|
||||
|
|
@ -199,6 +200,10 @@ read_builtin (list)
|
|||
break;
|
||||
}
|
||||
|
||||
#if defined (READLINE)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (i + 2 >= size)
|
||||
input_string = xrealloc (input_string, size += 128);
|
||||
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ $END
|
|||
|
||||
$BUILTIN { ... }
|
||||
$DOCNAME grouping_braces
|
||||
$SHORT_DOC { COMMANDS }
|
||||
$SHORT_DOC { COMMANDS ; }
|
||||
Run a set of commands in a group. This is one way to redirect an
|
||||
entire set of commands.
|
||||
$END
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ $SHORT_DOC set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
|
|||
noclobber same as -C
|
||||
noexec same as -n
|
||||
noglob same as -f
|
||||
notify save as -b
|
||||
notify same as -b
|
||||
nounset same as -u
|
||||
onecmd same as -t
|
||||
physical same as -P
|
||||
|
|
|
|||
|
|
@ -79,10 +79,19 @@ extern int hist_verify, history_reediting, perform_hostname_completion;
|
|||
extern void enable_hostname_completion ();
|
||||
#endif
|
||||
|
||||
#if defined (RESTRICTED_SHELL)
|
||||
extern int restricted_shell;
|
||||
extern char *shell_name;
|
||||
#endif
|
||||
|
||||
extern void set_shellopts ();
|
||||
|
||||
static int set_interactive_comments ();
|
||||
|
||||
#if defined (RESTRICTED_SHELL)
|
||||
static int set_restricted_shell ();
|
||||
#endif
|
||||
|
||||
static struct {
|
||||
char *name;
|
||||
int *value;
|
||||
|
|
@ -120,6 +129,9 @@ static struct {
|
|||
{ "nocaseglob", &glob_ignore_case, (Function *)NULL },
|
||||
{ "nullglob", &allow_null_glob_expansion, (Function *)NULL },
|
||||
{ "promptvars", &promptvars, (Function *)NULL },
|
||||
#if defined (RESTRICTED_SHELL)
|
||||
{ "restricted_shell", &restricted_shell, set_restricted_shell },
|
||||
#endif
|
||||
{ "shift_verbose", &print_shift_error, (Function *)NULL },
|
||||
{ "sourcepath", &source_uses_path, (Function *)NULL },
|
||||
{ (char *)0, (int *)0, (Function *)NULL }
|
||||
|
|
@ -262,7 +274,7 @@ toggle_shopts (mode, list, quiet)
|
|||
return (rval);
|
||||
}
|
||||
|
||||
static int
|
||||
static void
|
||||
print_shopt (name, val, flags)
|
||||
char *name;
|
||||
int val, flags;
|
||||
|
|
@ -400,3 +412,20 @@ set_interactive_comments (mode)
|
|||
set_shellopts ();
|
||||
return (0);
|
||||
}
|
||||
|
||||
#if defined (RESTRICTED_SHELL)
|
||||
/* Don't allow the value of restricted_shell to be modified. */
|
||||
|
||||
static int
|
||||
set_restricted_shell (mode)
|
||||
int mode;
|
||||
{
|
||||
static int save_restricted = -1;
|
||||
|
||||
if (save_restricted == -1)
|
||||
save_restricted = shell_is_restricted (shell_name);
|
||||
|
||||
restricted_shell = save_restricted;
|
||||
return (0);
|
||||
}
|
||||
#endif /* RESTRICTED_SHELL */
|
||||
|
|
|
|||
|
|
@ -129,7 +129,10 @@ test_builtin (list)
|
|||
if (list == 0)
|
||||
{
|
||||
if (this_command_name[0] == '[' && !this_command_name[1])
|
||||
builtin_error ("missing `]'");
|
||||
{
|
||||
builtin_error ("missing `]'");
|
||||
return (EX_BADUSAGE);
|
||||
}
|
||||
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ $END
|
|||
#endif /* ALIAS */
|
||||
|
||||
#include "common.h"
|
||||
#include "bashgetopt.h"
|
||||
|
||||
extern int find_reserved_word ();
|
||||
|
||||
|
|
@ -69,14 +70,14 @@ extern int find_reserved_word ();
|
|||
it as a simple command. i.e., which file would this shell use to
|
||||
execve, or if it is a builtin command, or an alias. Possible flag
|
||||
arguments:
|
||||
-type Returns the "type" of the object, one of
|
||||
-t Returns the "type" of the object, one of
|
||||
`alias', `keyword', `function', `builtin',
|
||||
or `file'.
|
||||
|
||||
-path Returns the pathname of the file if -type is
|
||||
-p Returns the pathname of the file if -type is
|
||||
a file.
|
||||
|
||||
-all Returns all occurrences of words, whether they
|
||||
-a Returns all occurrences of words, whether they
|
||||
be a filename in the path, alias, function,
|
||||
or builtin.
|
||||
Order of evaluation:
|
||||
|
|
@ -86,12 +87,14 @@ extern int find_reserved_word ();
|
|||
builtin
|
||||
file
|
||||
*/
|
||||
|
||||
int
|
||||
type_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int path_only, type_only, all, verbose;
|
||||
int successful_finds;
|
||||
int successful_finds, opt;
|
||||
WORD_LIST *prev, *this;
|
||||
|
||||
if (list == 0)
|
||||
return (EXECUTION_SUCCESS);
|
||||
|
|
@ -99,32 +102,69 @@ type_builtin (list)
|
|||
path_only = type_only = all = 0;
|
||||
successful_finds = 0;
|
||||
|
||||
while (list && *(list->word->word) == '-')
|
||||
/* Handle the obsolescent `-type', `-path', and `-all' by prescanning
|
||||
the arguments and removing those options from the list before calling
|
||||
internal_getopt. Recognize `--type', `--path', and `--all' also.
|
||||
THIS SHOULD REALLY GO AWAY. */
|
||||
for (this = list; this && this->word->word[0] == '-'; )
|
||||
{
|
||||
char *flag = &(list->word->word[1]);
|
||||
char *flag = &(this->word->word[1]);
|
||||
|
||||
if (flag[0] == 't' && (!flag[1] || strcmp (flag + 1, "ype") == 0))
|
||||
if (STREQ (flag, "type") || STREQ (flag, "-type"))
|
||||
{
|
||||
type_only = 1;
|
||||
path_only = 0;
|
||||
}
|
||||
else if (flag[0] == 'p' && (!flag[1] || strcmp (flag + 1, "ath") == 0))
|
||||
else if (STREQ (flag, "path") || STREQ (flag, "-path"))
|
||||
{
|
||||
path_only = 1;
|
||||
type_only = 0;
|
||||
}
|
||||
else if (flag[0] == 'a' && (!flag[1] || strcmp (flag + 1, "ll") == 0))
|
||||
{
|
||||
all = 1;
|
||||
}
|
||||
else if (STREQ (flag, "all") || STREQ (flag, "-all"))
|
||||
all = 1;
|
||||
else
|
||||
{
|
||||
bad_option (flag);
|
||||
prev = this;
|
||||
this = this->next;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* We found a long option; remove it from the argument list. Don't
|
||||
free it if it's the head of the argument list, though -- the
|
||||
argument list will be freed by the caller. */
|
||||
if (this == list)
|
||||
this = list = list->next;
|
||||
else
|
||||
{
|
||||
prev->next = this->next;
|
||||
this->next = (WORD_LIST *)NULL;
|
||||
dispose_words (this);
|
||||
this = prev->next;
|
||||
}
|
||||
}
|
||||
|
||||
reset_internal_getopt ();
|
||||
while ((opt = internal_getopt (list, "apt")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
case 't':
|
||||
type_only = 1;
|
||||
path_only = 0;
|
||||
break;
|
||||
case 'p':
|
||||
path_only = 1;
|
||||
type_only = 0;
|
||||
break;
|
||||
case 'a':
|
||||
all = 1;
|
||||
break;
|
||||
default:
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
list = list->next;
|
||||
}
|
||||
list = loptend;
|
||||
|
||||
if (type_only)
|
||||
verbose = 1;
|
||||
|
|
@ -150,10 +190,7 @@ type_builtin (list)
|
|||
|
||||
fflush (stdout);
|
||||
|
||||
if (successful_finds != 0)
|
||||
return (EXECUTION_SUCCESS);
|
||||
else
|
||||
return (EXECUTION_FAILURE);
|
||||
return ((successful_finds != 0) ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -202,7 +239,7 @@ describe_command (command, verbose, all)
|
|||
|
||||
found = 1;
|
||||
|
||||
if (!all)
|
||||
if (all == 0)
|
||||
return (1);
|
||||
}
|
||||
#endif /* ALIAS */
|
||||
|
|
@ -220,7 +257,7 @@ describe_command (command, verbose, all)
|
|||
|
||||
found = 1;
|
||||
|
||||
if (!all)
|
||||
if (all == 0)
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
|
@ -251,7 +288,7 @@ describe_command (command, verbose, all)
|
|||
|
||||
found = 1;
|
||||
|
||||
if (!all)
|
||||
if (all == 0)
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
|
@ -267,7 +304,7 @@ describe_command (command, verbose, all)
|
|||
|
||||
found = 1;
|
||||
|
||||
if (!all)
|
||||
if (all == 0)
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
|
@ -293,9 +330,9 @@ describe_command (command, verbose, all)
|
|||
}
|
||||
}
|
||||
|
||||
/* If the user isn't doing "-all", then we might care about
|
||||
/* If the user isn't doing "-a", then we might care about
|
||||
whether the file is present in our hash table. */
|
||||
if (!all)
|
||||
if (all == 0)
|
||||
{
|
||||
if ((full_path = find_hashed_filename (command)) != (char *)NULL)
|
||||
{
|
||||
|
|
@ -314,7 +351,7 @@ describe_command (command, verbose, all)
|
|||
/* Now search through $PATH. */
|
||||
while (1)
|
||||
{
|
||||
if (!all)
|
||||
if (all == 0)
|
||||
full_path = find_user_command (command);
|
||||
else
|
||||
full_path =
|
||||
|
|
@ -337,7 +374,7 @@ describe_command (command, verbose, all)
|
|||
free (full_path);
|
||||
full_path = (char *)NULL;
|
||||
|
||||
if (!all)
|
||||
if (all == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -154,24 +154,20 @@ extern int errno;
|
|||
# define RLIM_INFINITY 0x7fffffff
|
||||
#endif
|
||||
|
||||
#if !defined (RLIM_INVALID)
|
||||
# define RLIM_INVALID (RLIMTYPE)-1
|
||||
#endif
|
||||
|
||||
#define LIMIT_HARD 0x01
|
||||
#define LIMIT_SOFT 0x02
|
||||
|
||||
static int ulimit_internal ();
|
||||
static void printone ();
|
||||
static void print_all_limits ();
|
||||
static int ulimit_internal __P((int, char *, int, int));
|
||||
static void printone __P((int, RLIMTYPE, int));
|
||||
static void print_all_limits __P((int));
|
||||
|
||||
static int get_limit ();
|
||||
static int set_limit ();
|
||||
static int get_limit __P((int, int, RLIMTYPE *));
|
||||
static int set_limit __P((int, RLIMTYPE, int));
|
||||
|
||||
static RLIMTYPE filesize ();
|
||||
static RLIMTYPE pipesize ();
|
||||
static RLIMTYPE getmaxuprc ();
|
||||
static RLIMTYPE getmaxvm ();
|
||||
static int filesize __P((RLIMTYPE *));
|
||||
static int pipesize __P((RLIMTYPE *));
|
||||
static int getmaxuprc __P((int, RLIMTYPE *));
|
||||
static int getmaxvm __P((int, RLIMTYPE *));
|
||||
|
||||
typedef struct {
|
||||
int option; /* The ulimit option for this limit. */
|
||||
|
|
@ -351,7 +347,6 @@ ulimit_internal (cmd, cmdarg, mode, multiple)
|
|||
long block_factor;
|
||||
RLIMTYPE current_limit, real_limit, limit;
|
||||
|
||||
limit = RLIM_INVALID;
|
||||
setting = cmdarg != 0;
|
||||
limind = _findlim (cmd);
|
||||
if (mode == 0)
|
||||
|
|
@ -412,26 +407,30 @@ get_limit (ind, mode, limptr)
|
|||
switch (limits[ind].parameter)
|
||||
{
|
||||
case RLIMIT_FILESIZE:
|
||||
value = filesize ();
|
||||
if (filesize (&value) < 0)
|
||||
return -1;
|
||||
break;
|
||||
case RLIMIT_PIPESIZE:
|
||||
value = pipesize ();
|
||||
if (pipesize (&value) < 0)
|
||||
return -1;
|
||||
break;
|
||||
case RLIMIT_OPENFILES:
|
||||
value = (RLIMTYPE)getdtablesize ();
|
||||
break;
|
||||
case RLIMIT_VIRTMEM:
|
||||
value = getmaxvm (mode);
|
||||
if (getmaxvm (mode, &value) < 0)
|
||||
return -1;
|
||||
break;
|
||||
case RLIMIT_MAXUPROC:
|
||||
value = getmaxuprc (mode);
|
||||
if (getmaxuprc (mode, &value) < 0)
|
||||
return -1;
|
||||
break;
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
*limptr = value;
|
||||
return ((value == RLIM_INVALID) ? -1 : 0);
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -439,6 +438,11 @@ get_limit (ind, mode, limptr)
|
|||
if (getrlimit (limits[ind].parameter, &limit) < 0)
|
||||
return -1;
|
||||
value = (mode & LIMIT_SOFT) ? limit.rlim_cur : limit.rlim_max;
|
||||
# if defined (HPUX9)
|
||||
if (limits[ind].parameter == RLIMIT_FILESIZE)
|
||||
*limptr = value * 512; /* Ugh. */
|
||||
else
|
||||
# endif /* HPUX9 */
|
||||
*limptr = value;
|
||||
return 0;
|
||||
#else
|
||||
|
|
@ -486,6 +490,10 @@ set_limit (ind, newlim, mode)
|
|||
#if defined (HAVE_RESOURCE)
|
||||
if (getrlimit (limits[ind].parameter, &limit) < 0)
|
||||
return -1;
|
||||
# if defined (HPUX9)
|
||||
if (limits[ind].parameter == RLIMIT_FILESIZE)
|
||||
newlim /= 512; /* Ugh. */
|
||||
# endif /* HPUX9 */
|
||||
val = (current_user.euid != 0 && newlim == RLIM_INFINITY &&
|
||||
(limit.rlim_cur <= limit.rlim_max))
|
||||
? limit.rlim_max : newlim;
|
||||
|
|
@ -502,72 +510,91 @@ set_limit (ind, newlim, mode)
|
|||
}
|
||||
}
|
||||
|
||||
static RLIMTYPE
|
||||
getmaxvm (mode)
|
||||
static int
|
||||
getmaxvm (mode, valuep)
|
||||
int mode;
|
||||
RLIMTYPE *valuep;
|
||||
{
|
||||
#if defined (HAVE_RESOURCE)
|
||||
struct rlimit rl;
|
||||
RLIMTYPE maxdata, maxstack;
|
||||
|
||||
if (getrlimit (RLIMIT_DATA, &rl) < 0)
|
||||
return (RLIM_INVALID);
|
||||
return -1;
|
||||
else
|
||||
maxdata = (mode & LIMIT_SOFT) ? rl.rlim_cur : rl.rlim_max;
|
||||
|
||||
if (getrlimit (RLIMIT_STACK, &rl) < 0)
|
||||
return (RLIM_INVALID);
|
||||
return -1;
|
||||
else
|
||||
maxstack = (mode & LIMIT_SOFT) ? rl.rlim_cur : rl.rlim_max;
|
||||
|
||||
/* Protect against overflow. */
|
||||
return ((maxdata / 1024L) + (maxstack / 1024L));
|
||||
*valuep = (maxdata / 1024L) + (maxstack / 1024L);
|
||||
return 0;
|
||||
#else
|
||||
errno = EINVAL;
|
||||
return RLIM_INVALID;
|
||||
return -1;
|
||||
#endif /* HAVE_RESOURCE */
|
||||
}
|
||||
|
||||
static RLIMTYPE
|
||||
filesize()
|
||||
static int
|
||||
filesize(valuep)
|
||||
RLIMTYPE *valuep;
|
||||
{
|
||||
#if !defined (HAVE_RESOURCE)
|
||||
return ((RLIMTYPE)ulimit (1, 0L));
|
||||
long result;
|
||||
if ((result = ulimit (1, 0L)) < 0)
|
||||
return -1;
|
||||
else
|
||||
*valuep = (RLIMTYPE) result;
|
||||
return 0;
|
||||
#else
|
||||
errno = EINVAL;
|
||||
return RLIM_INVALID;
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
static RLIMTYPE
|
||||
pipesize ()
|
||||
static int
|
||||
pipesize (valuep)
|
||||
RLIMTYPE *valuep;
|
||||
{
|
||||
#if defined (PIPE_BUF)
|
||||
/* This is defined on Posix systems. */
|
||||
return ((RLIMTYPE) PIPE_BUF);
|
||||
*valuep = (RLIMTYPE) PIPE_BUF;
|
||||
return 0;
|
||||
#else
|
||||
# if defined (PIPESIZE)
|
||||
/* This is defined by running a program from the Makefile. */
|
||||
return ((RLIMTYPE) PIPESIZE);
|
||||
*valuep = (RLIMTYPE) PIPESIZE;
|
||||
return 0;
|
||||
# else
|
||||
errno = EINVAL;
|
||||
return RLIM_INVALID;
|
||||
return -1;
|
||||
# endif /* PIPESIZE */
|
||||
#endif /* PIPE_BUF */
|
||||
}
|
||||
|
||||
static RLIMTYPE
|
||||
getmaxuprc (mode)
|
||||
static int
|
||||
getmaxuprc (mode, valuep)
|
||||
int mode;
|
||||
RLIMTYPE *valuep;
|
||||
{
|
||||
# if defined (HAVE_SYSCONF) && defined (_SC_CHILD_MAX)
|
||||
return ((RLIMTYPE)sysconf (_SC_CHILD_MAX));
|
||||
long maxchild;
|
||||
maxchild = sysconf (_SC_CHILD_MAX);
|
||||
if (maxchild < 0)
|
||||
return -1;
|
||||
else
|
||||
*valuep = (RLIMTYPE) maxchild;
|
||||
return 0;
|
||||
# else /* !HAVE_SYSCONF || !_SC_CHILD_MAX */
|
||||
# if defined (MAXUPRC)
|
||||
return ((RLIMTYPE)MAXUPRC);
|
||||
*valuep = (RLIMTYPE) MAXUPRC;
|
||||
return 0;
|
||||
# else /* MAXUPRC */
|
||||
errno = EINVAL;
|
||||
return RLIM_INVALID;
|
||||
return -1;
|
||||
# endif /* !MAXUPRC */
|
||||
# endif /* !HAVE_SYSCONF || !_SC_CHILD_MAX */
|
||||
}
|
||||
|
|
@ -585,8 +612,12 @@ print_all_limits (mode)
|
|||
for (i = 0; limits[i].option > 0; i++)
|
||||
{
|
||||
if (get_limit (i, mode, &value) < 0)
|
||||
value = RLIM_INVALID;
|
||||
printone (i, value, 1);
|
||||
{
|
||||
fprintf (stderr, DESCFMT, limits[i].description);
|
||||
builtin_error ("cannot get limit: %s", strerror (errno));
|
||||
}
|
||||
else
|
||||
printone (i, value, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -600,8 +631,6 @@ printone (limind, curlim, pdesc)
|
|||
printf (DESCFMT, limits[limind].description);
|
||||
if (curlim == RLIM_INFINITY)
|
||||
puts ("unlimited");
|
||||
else if (curlim == RLIM_INVALID)
|
||||
builtin_error ("cannot get limit: %s\n", strerror (errno));
|
||||
else
|
||||
print_rlimtype ((curlim / limits[limind].block_factor), 1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -174,29 +174,15 @@ print_symbolic_umask (um)
|
|||
printf ("u=%s,g=%s,o=%s\n", ubits, gbits, obits);
|
||||
}
|
||||
|
||||
/* Set the umask from a symbolic mode string similar to that accepted
|
||||
by chmod. If the -S argument is given, then print the umask in a
|
||||
symbolic form. */
|
||||
static int
|
||||
symbolic_umask (list)
|
||||
WORD_LIST *list;
|
||||
int
|
||||
parse_symbolic_mode (mode, initial_bits)
|
||||
char *mode;
|
||||
int initial_bits;
|
||||
{
|
||||
int um, umc, c;
|
||||
int who, op, perm, mask;
|
||||
int who, op, perm, mask, bits, c;
|
||||
char *s;
|
||||
|
||||
/* Get the initial umask. Don't change it yet. */
|
||||
um = umask (022);
|
||||
umask (um);
|
||||
|
||||
/* All work below is done with the complement of the umask -- it's
|
||||
more intuitive and easier to deal with. It is complemented
|
||||
again before being returned. */
|
||||
umc = ~um;
|
||||
|
||||
s = list->word->word;
|
||||
|
||||
for (;;)
|
||||
for (s = mode, bits = initial_bits;;)
|
||||
{
|
||||
who = op = perm = mask = 0;
|
||||
|
||||
|
|
@ -205,20 +191,20 @@ symbolic_umask (list)
|
|||
{
|
||||
switch (c = *s++)
|
||||
{
|
||||
case 'u':
|
||||
who |= S_IRWXU;
|
||||
continue;
|
||||
case 'g':
|
||||
who |= S_IRWXG;
|
||||
continue;
|
||||
case 'o':
|
||||
who |= S_IRWXO;
|
||||
continue;
|
||||
case 'a':
|
||||
who |= S_IRWXU | S_IRWXG | S_IRWXO;
|
||||
continue;
|
||||
default:
|
||||
break;
|
||||
case 'u':
|
||||
who |= S_IRWXU;
|
||||
continue;
|
||||
case 'g':
|
||||
who |= S_IRWXG;
|
||||
continue;
|
||||
case 'o':
|
||||
who |= S_IRWXO;
|
||||
continue;
|
||||
case 'a':
|
||||
who |= S_IRWXU | S_IRWXG | S_IRWXO;
|
||||
continue;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -226,13 +212,13 @@ symbolic_umask (list)
|
|||
op = *s++;
|
||||
switch (op)
|
||||
{
|
||||
case '+':
|
||||
case '-':
|
||||
case '=':
|
||||
break;
|
||||
default:
|
||||
builtin_error ("bad symbolic mode operator: %c", op);
|
||||
return (-1);
|
||||
case '+':
|
||||
case '-':
|
||||
case '=':
|
||||
break;
|
||||
default:
|
||||
builtin_error ("bad symbolic mode operator: %c", op);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* Parse out the `perm' section of the symbolic mode clause. */
|
||||
|
|
@ -242,17 +228,15 @@ symbolic_umask (list)
|
|||
|
||||
switch (c)
|
||||
{
|
||||
case 'r':
|
||||
perm |= S_IRUGO;
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
perm |= S_IWUGO;
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
perm |= S_IXUGO;
|
||||
break;
|
||||
case 'r':
|
||||
perm |= S_IRUGO;
|
||||
break;
|
||||
case 'w':
|
||||
perm |= S_IWUGO;
|
||||
break;
|
||||
case 'x':
|
||||
perm |= S_IXUGO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -265,32 +249,22 @@ symbolic_umask (list)
|
|||
|
||||
switch (op)
|
||||
{
|
||||
case '+':
|
||||
umc |= perm;
|
||||
break;
|
||||
|
||||
case '-':
|
||||
umc &= ~perm;
|
||||
break;
|
||||
|
||||
case '=':
|
||||
umc &= ~who;
|
||||
umc |= perm;
|
||||
break;
|
||||
|
||||
#if 0
|
||||
/* No other values are possible. */
|
||||
default:
|
||||
builtin_error ("bad symbolic mode operator: %c", op);
|
||||
return (-1);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (!*s)
|
||||
{
|
||||
um = ~umc & 0777;
|
||||
case '+':
|
||||
bits |= perm;
|
||||
break;
|
||||
case '-':
|
||||
bits &= ~perm;
|
||||
break;
|
||||
case '=':
|
||||
bits &= ~who;
|
||||
bits |= perm;
|
||||
break;
|
||||
|
||||
/* No other values are possible. */
|
||||
}
|
||||
|
||||
if (*s == '\0')
|
||||
break;
|
||||
else
|
||||
s++; /* skip past ',' */
|
||||
}
|
||||
|
|
@ -300,5 +274,28 @@ symbolic_umask (list)
|
|||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
return (bits);
|
||||
}
|
||||
|
||||
/* Set the umask from a symbolic mode string similar to that accepted
|
||||
by chmod. If the -S argument is given, then print the umask in a
|
||||
symbolic form. */
|
||||
static int
|
||||
symbolic_umask (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int um, bits;
|
||||
|
||||
/* Get the initial umask. Don't change it yet. */
|
||||
um = umask (022);
|
||||
umask (um);
|
||||
|
||||
/* All work is done with the complement of the umask -- it's
|
||||
more intuitive and easier to deal with. It is complemented
|
||||
again before being returned. */
|
||||
bits = parse_symbolic_mode (list->word->word, ~um);
|
||||
|
||||
um = ~bits & 0777;
|
||||
return (um);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
|
|||
#define W_ASSIGNMENT 0x04 /* This word is a variable assignment. */
|
||||
#define W_GLOBEXP 0x08 /* This word is the result of a glob expansion. */
|
||||
#define W_NOSPLIT 0x10 /* Do not perform word splitting on this word. */
|
||||
#define W_NOGLOB 0x20 /* Do not perform globbing on this word. */
|
||||
|
||||
/* Possible values for subshell_environment */
|
||||
#define SUBSHELL_ASYNC 0x01 /* subshell caused by `command &' */
|
||||
|
|
@ -268,6 +269,14 @@ typedef struct group_com {
|
|||
|
||||
extern COMMAND *global_command;
|
||||
|
||||
/* Possible command errors */
|
||||
#define CMDERR_DEFAULT 0
|
||||
#define CMDERR_BADTYPE 1
|
||||
#define CMDERR_BADCONN 2
|
||||
#define CMDERR_BADJUMP 3
|
||||
|
||||
#define CMDERR_LAST 3
|
||||
|
||||
/* Forward declarations of functions declared in copy_cmd.c. */
|
||||
|
||||
extern WORD_DESC *copy_word __P((WORD_DESC *));
|
||||
|
|
|
|||
|
|
@ -65,3 +65,7 @@
|
|||
#if defined (STRCOLL_BROKEN)
|
||||
# undef HAVE_STRCOLL
|
||||
#endif
|
||||
|
||||
#if !defined (PROMPT_STRING_DECODE)
|
||||
# define PPROMPT "$ "
|
||||
#endif
|
||||
22
config.h.in
22
config.h.in
|
|
@ -122,9 +122,9 @@
|
|||
#undef AFS
|
||||
|
||||
/* End of configuration settings controllable by autoconf. */
|
||||
/* Other settable options appear in config.h.top. */
|
||||
/* Other settable options appear in config-top.h. */
|
||||
|
||||
#include "config.h.top"
|
||||
#include "config-top.h"
|
||||
|
||||
/* Beginning of autoconf additions. */
|
||||
|
||||
|
|
@ -187,6 +187,9 @@
|
|||
/* The number of bytes in a pointer to char. */
|
||||
#undef SIZEOF_CHAR_P
|
||||
|
||||
/* The number of bytes in a double (hopefully 8). */
|
||||
#undef SIZEOF_DOUBLE
|
||||
|
||||
/* Define to `long' if <sys/types.h> doesn't define. */
|
||||
#undef off_t
|
||||
|
||||
|
|
@ -208,6 +211,9 @@
|
|||
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||
#undef ptrdiff_t
|
||||
|
||||
/* Define to `double' if <sys/types.h> doesn't define. */
|
||||
#undef bits64_t
|
||||
|
||||
/* Define to `unsigned' if <sys/types.h> doesn't define. */
|
||||
#undef size_t
|
||||
|
||||
|
|
@ -392,11 +398,18 @@
|
|||
/* Define if you have the killpg function. */
|
||||
#undef HAVE_KILLPG
|
||||
|
||||
/* Define if you have the lstat function. */
|
||||
#undef HAVE_LSTAT
|
||||
|
||||
/* Define if you have the putenv function. */
|
||||
#undef HAVE_PUTENV
|
||||
|
||||
/* Define if you have the rename function. */
|
||||
#undef HAVE_RENAME
|
||||
|
||||
/* Define if you have the sbrk function. */
|
||||
#undef HAVE_SBRK
|
||||
|
||||
/* Define if you have the select function. */
|
||||
#undef HAVE_SELECT
|
||||
|
||||
|
|
@ -542,6 +555,9 @@
|
|||
|
||||
#undef HAVE_LIBSOCKET
|
||||
|
||||
/* Are we running SVR5 (UnixWare 7)? */
|
||||
#undef SVR5
|
||||
|
||||
/* Are we running SVR4.2? */
|
||||
#undef SVR4_2
|
||||
|
||||
|
|
@ -555,6 +571,6 @@
|
|||
/* Do strcoll(3) and strcmp(3) give different results in the default locale? */
|
||||
#undef STRCOLL_BROKEN
|
||||
|
||||
#include "config.h.bot"
|
||||
#include "config-bot.h"
|
||||
|
||||
#endif /* _CONFIG_H_ */
|
||||
|
|
|
|||
233
configure.in
233
configure.in
|
|
@ -1,12 +1,12 @@
|
|||
dnl
|
||||
dnl Configure script for bash-2.02
|
||||
dnl Configure script for bash-2.03
|
||||
dnl
|
||||
dnl report bugs to chet@po.cwru.edu
|
||||
dnl
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
dnl checks for version info
|
||||
|
||||
AC_REVISION([for Bash 2.02, version 2.19, from autoconf version] AC_ACVERSION)dnl
|
||||
AC_REVISION([for Bash 2.03, version 2.49, from autoconf version] AC_ACVERSION)dnl
|
||||
|
||||
AC_INIT(shell.h)
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
|
@ -28,25 +28,28 @@ opt_purify=no
|
|||
opt_purecov=no
|
||||
opt_afs=no
|
||||
opt_curses=no
|
||||
opt_with_installed_readline=no
|
||||
|
||||
dnl some systems should be configured without gnu malloc by default
|
||||
dnl and some need a special compiler or loader
|
||||
dnl look in the NOTES file for more
|
||||
case "${host_cpu}-${host_os}" in
|
||||
alpha-*) opt_gnu_malloc=no ;; # alpha running osf/1 or linux
|
||||
alpha*-*) opt_gnu_malloc=no ;; # alpha running osf/1 or linux
|
||||
*[Cc]ray*-*) opt_gnu_malloc=no ;; # Crays
|
||||
*-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
|
||||
#mips-irix6*) opt_gnu_malloc=no ;; # needs 8-byte alignment
|
||||
mips-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
|
||||
*-nextstep*) opt_gnu_malloc=no ;; # NeXT machines running NeXTstep
|
||||
*-rhapsody*) opt_gnu_malloc=no ;; # Apple Rhapsody
|
||||
*-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|*-bsdi3.?) opt_gnu_malloc=no ; : ${CC:=shlicc2} ;; # for loadable builtins
|
||||
*-beos*) opt_gnu_malloc=no ;; # they say it's suitable
|
||||
*-cygwin32*) opt_gnu_malloc=no ;; # Cygnus's CYGWIN32 environment
|
||||
esac
|
||||
|
||||
|
|
@ -56,6 +59,7 @@ AC_ARG_WITH(afs, --with-afs if you are running AFS, opt_afs=$withval)
|
|||
AC_ARG_WITH(curses, --with-curses use the curses library instead of the termcap library,opt_curses=$withval)
|
||||
AC_ARG_WITH(glibc-malloc, --with-glibc-malloc use the GNU C library version of malloc,opt_glibc_malloc=$withval)
|
||||
AC_ARG_WITH(gnu-malloc, --with-gnu-malloc use the GNU version of malloc,opt_gnu_malloc=$withval)
|
||||
AC_ARG_WITH(installed-readline, --with-installed-readline use a version of the readline library that is already installed, opt_with_installed_readline=$withval)
|
||||
AC_ARG_WITH(purecov, --with-purecov configure to postprocess with pure coverage, opt_purecov=$withval)
|
||||
AC_ARG_WITH(purify, --with-purify configure to postprocess with purify, opt_purify=$withval)
|
||||
|
||||
|
|
@ -156,30 +160,13 @@ AC_ARG_ENABLE(static-link, --enable-static-link [link bash statically, for use
|
|||
|
||||
dnl opt_job_control is handled later, after BASH_JOB_CONTROL_MISSING runs
|
||||
|
||||
dnl opt_readline and opt_history are handled later, because AC_PROG_CC needs
|
||||
dnl to be run before we can check the version of an already-installed readline
|
||||
dnl library
|
||||
|
||||
if test $opt_alias = yes; then
|
||||
AC_DEFINE(ALIAS)
|
||||
fi
|
||||
if test $opt_readline = yes; then
|
||||
AC_DEFINE(READLINE)
|
||||
READLINE_LIB=-lreadline
|
||||
READLINE_DEP='$(READLINE_LIBRARY)'
|
||||
else
|
||||
READLINE_LIB= READLINE_DEP=
|
||||
fi
|
||||
if test $opt_history = yes; then
|
||||
AC_DEFINE(HISTORY)
|
||||
HISTORY_LIB=-lhistory
|
||||
HISTORY_DEP='$(HISTORY_LIBRARY)'
|
||||
else
|
||||
HISTORY_LIB= HISTORY_DEP=
|
||||
fi
|
||||
if test $opt_bang_history = yes; then
|
||||
AC_DEFINE(BANG_HISTORY)
|
||||
HISTORY_LIB=-lhistory
|
||||
HISTORY_DEP='$(HISTORY_LIBRARY)'
|
||||
else
|
||||
HISTORY_LIB= HISTORY_DEP=
|
||||
fi
|
||||
if test $opt_dirstack = yes; then
|
||||
AC_DEFINE(PUSHD_AND_POPD)
|
||||
fi
|
||||
|
|
@ -234,10 +221,6 @@ AC_SUBST(TESTSCRIPT)
|
|||
AC_SUBST(PURIFY)
|
||||
AC_SUBST(MALLOC_TARGET)
|
||||
AC_SUBST(MALLOC_SRC)
|
||||
AC_SUBST(READLINE_LIB)
|
||||
AC_SUBST(READLINE_DEP)
|
||||
AC_SUBST(HISTORY_LIB)
|
||||
AC_SUBST(HISTORY_DEP)
|
||||
|
||||
dnl Use GNU m4 macros to get the distribution and patchlevel information
|
||||
dnl into configure without requiring the files to be distributed
|
||||
|
|
@ -256,24 +239,37 @@ BASH_LARGE_FILE_SUPPORT
|
|||
AC_ISC_POSIX
|
||||
AC_MINIX
|
||||
|
||||
dnl BEGIN changes for CYGNUS cross-building for cygwin32
|
||||
dnl BEGIN changes for cross-building for cygwin32 and BeOS
|
||||
|
||||
SIGNAMES_H=lsignames.h
|
||||
|
||||
dnl load up the cross-building cache file -- add more cases and cache
|
||||
dnl files as necessary
|
||||
|
||||
dnl Note that host and target machine are the same, and different than the
|
||||
dnl build machine.
|
||||
dnl Set SIGNAMES_H based on whether or not we're cross-compiling.
|
||||
|
||||
if test "x$cross_compiling" = "xyes"; then
|
||||
case "${host}" in
|
||||
*-cygwin32*)
|
||||
cross_cache=${srcdir}/cross-build/cygwin32.cache
|
||||
if test -r "${cross_cache}"; then
|
||||
echo "loading cross-build cache file ${cross_cache}"
|
||||
. ${cross_cache}
|
||||
fi
|
||||
unset cross_cache
|
||||
SIGNAMES_H='$(srcdir)/cross-build/win32sig.h'
|
||||
;;
|
||||
*) echo "configure: cross-compiling for a non-cygwin32 target is not supported" >&2
|
||||
i[[3456]]86-*-beos*)
|
||||
cross_cache=${srcdir}/cross-build/x86-beos.cache
|
||||
SIGNAMES_H='${srcdir}/cross-build/beos-sig.h'
|
||||
;;
|
||||
*) echo "configure: cross-compiling for $host is not supported" >&2
|
||||
;;
|
||||
esac
|
||||
if test -n "${cross_cache}" && test -r "${cross_cache}"; then
|
||||
echo "loading cross-build cache file ${cross_cache}"
|
||||
. ${cross_cache}
|
||||
fi
|
||||
unset cross_cache
|
||||
fi
|
||||
AC_SUBST(SIGNAMES_H)
|
||||
|
||||
if test -z "$CC_FOR_BUILD"; then
|
||||
if test "x$cross_compiling" = "xno"; then
|
||||
|
|
@ -284,15 +280,7 @@ if test -z "$CC_FOR_BUILD"; then
|
|||
fi
|
||||
AC_SUBST(CC_FOR_BUILD)
|
||||
|
||||
dnl Set SIGNAMES_H based on whether or not we're cross-compiling
|
||||
if test "x$cross_compiling" = "xno"; then
|
||||
SIGNAMES_H=lsignames.h
|
||||
else
|
||||
SIGNAMES_H='$(srcdir)/cross-build/win32sig.h'
|
||||
fi
|
||||
AC_SUBST(SIGNAMES_H)
|
||||
|
||||
dnl END changes for CYGNUS cross-building for cygwin32
|
||||
dnl END changes for cross-building
|
||||
|
||||
dnl We want these before the checks, so the checks can modify their values.
|
||||
test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1
|
||||
|
|
@ -304,29 +292,114 @@ dnl handle options that alter how bash is compiled and linked
|
|||
dnl these must come after the test for cc/gcc
|
||||
if test "$opt_profiling" = "yes"; then
|
||||
PROFILE_FLAGS=-pg
|
||||
opt_static_link=yes
|
||||
case "$host_os" in
|
||||
solaris2*) ;;
|
||||
*) opt_static_link=yes ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if test "$opt_static_link" = yes; then
|
||||
# if we're using gcc, add `-static' to LDFLAGS
|
||||
if test -n "$GCC" || test "$ac_cv_prog_gcc" = "yes"; then
|
||||
LDFLAGS="$LDFLAGS -static"
|
||||
STATIC_LD="-static"
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_SUBST(CFLAGS)
|
||||
AC_SUBST(CPPFLAGS)
|
||||
AC_SUBST(LDFLAGS)
|
||||
AC_SUBST(STATIC_LD)
|
||||
|
||||
AC_PROG_GCC_TRADITIONAL
|
||||
|
||||
dnl BEGIN READLINE and HISTORY LIBRARY SECTION
|
||||
dnl prepare to allow bash to be linked against an already-installed readline
|
||||
|
||||
dnl first test that the readline version is new enough to link bash against
|
||||
if test "$opt_readline" = yes && test "$opt_with_installed_readline" = "yes"
|
||||
then
|
||||
|
||||
dnl we duplicate some work that's done later here so we can look in
|
||||
dnl the correct directory for the readline library
|
||||
|
||||
test "x$prefix" = xNONE && _rl_prefix=$ac_default_prefix || _rl_prefix=${prefix}
|
||||
test "x$exec_prefix" = xNONE && _rl_exec_prefix=${_rl_prefix} || _rl_exec_prefix=${exec_prefix}
|
||||
|
||||
AC_MSG_CHECKING(version of installed readline library)
|
||||
_rl_version=`exec_prefix=${_rl_exec_prefix} ${CONFIG_SHELL-/bin/sh} ${srcdir}/support/rlvers.sh -C "${CC}" -L ${libdir}`
|
||||
AC_MSG_RESULT($_rl_version)
|
||||
|
||||
case "$_rl_version" in
|
||||
3*|4*|5*|6*|7*|8*|9*) ;;
|
||||
*) opt_with_installed_readline=no
|
||||
AC_MSG_WARN(installed readline library is too old to be linked with bash)
|
||||
AC_MSG_WARN(using private bash version)
|
||||
;;
|
||||
esac
|
||||
unset _rl_version _rl_prefix _rl_exec_prefix
|
||||
fi
|
||||
|
||||
if test $opt_readline = yes; then
|
||||
AC_DEFINE(READLINE)
|
||||
READLINE_LIB=-lreadline
|
||||
if test "$opt_with_installed_readline" = "yes" ; then
|
||||
RL_LIBDIR='$(libdir)'
|
||||
READLINE_DEP=
|
||||
RL_INCLUDE='-I$(includedir)'
|
||||
else
|
||||
RL_LIBDIR='$(dot)/$(LIBSUBDIR)/readline'
|
||||
READLINE_DEP='$(READLINE_LIBRARY)'
|
||||
fi
|
||||
else
|
||||
RL_LIBDIR='$(dot)/$(LIBSUBDIR)/readline'
|
||||
READLINE_LIB= READLINE_DEP=
|
||||
fi
|
||||
if test $opt_history = yes || test $opt_bang_history = yes; then
|
||||
if test $opt_history = yes; then
|
||||
AC_DEFINE(HISTORY)
|
||||
fi
|
||||
if test $opt_bang_history = yes; then
|
||||
AC_DEFINE(BANG_HISTORY)
|
||||
fi
|
||||
HISTORY_LIB=-lhistory
|
||||
if test "$opt_with_installed_readline" = "yes"; then
|
||||
HIST_LIBDIR='$(libdir)'
|
||||
HISTORY_DEP=
|
||||
RL_INCLUDE='-I$(includedir)'
|
||||
else
|
||||
HIST_LIBDIR='$(dot)/$(LIBSUBDIR)/readline'
|
||||
HISTORY_DEP='$(HISTORY_LIBRARY)'
|
||||
fi
|
||||
else
|
||||
HIST_LIBDIR='$(dot)/$(LIBSUBDIR)/readline'
|
||||
HISTORY_LIB= HISTORY_DEP=
|
||||
fi
|
||||
AC_SUBST(READLINE_LIB)
|
||||
AC_SUBST(READLINE_DEP)
|
||||
AC_SUBST(RL_LIBDIR)
|
||||
AC_SUBST(RL_INCLUDE)
|
||||
AC_SUBST(HISTORY_LIB)
|
||||
AC_SUBST(HISTORY_DEP)
|
||||
AC_SUBST(HIST_LIBDIR)
|
||||
|
||||
dnl END READLINE and HISTORY LIBRARY SECTION
|
||||
|
||||
dnl programs needed by the build and install process
|
||||
AC_PROG_INSTALL
|
||||
AC_CHECK_PROG(AR, ar, ar)
|
||||
dnl Set default for ARFLAGS, since autoconf does not have a macro for it.
|
||||
dnl This allows people to set it when running configure or make
|
||||
test -n "$ARFLAGS" || ARFLAGS="cr"
|
||||
AC_PROG_RANLIB
|
||||
AC_PROG_YACC
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
case "$host_os" in
|
||||
opennt*|interix*) MAKE_SHELL="$OPENNT_ROOT/bin/sh" ;;
|
||||
*) MAKE_SHELL=/bin/sh ;;
|
||||
esac
|
||||
AC_SUBST(MAKE_SHELL)
|
||||
|
||||
dnl special checks for libc functions
|
||||
AC_FUNC_ALLOCA
|
||||
AC_FUNC_GETPGRP
|
||||
|
|
@ -357,8 +430,8 @@ AC_CHECK_FUNC(mkfifo,AC_DEFINE(HAVE_MKFIFO),AC_DEFINE(MKFIFO_MISSING))
|
|||
|
||||
dnl checks for system calls
|
||||
AC_CHECK_FUNCS(dup2 select getdtablesize getgroups gethostname \
|
||||
setdtablesize getpagesize killpg lstat getpeername \
|
||||
getrlimit getrusage gettimeofday waitpid tcgetpgrp)
|
||||
setdtablesize getpagesize killpg lstat getpeername sbrk \
|
||||
getrlimit getrusage gettimeofday waitpid tcgetpgrp rename)
|
||||
|
||||
dnl checks for c library functions
|
||||
AC_CHECK_FUNCS(bcopy bzero confstr getcwd strcasecmp setenv putenv \
|
||||
|
|
@ -418,23 +491,15 @@ AC_CHECK_TYPE(time_t, long)
|
|||
|
||||
AC_TYPE_SIGNAL
|
||||
|
||||
AC_CHECK_SIZEOF(int)
|
||||
AC_CHECK_SIZEOF(long)
|
||||
AC_CHECK_SIZEOF(char *)
|
||||
AC_CHECK_SIZEOF(int, 4)
|
||||
AC_CHECK_SIZEOF(long, 4)
|
||||
AC_CHECK_SIZEOF(char *, 4)
|
||||
AC_CHECK_SIZEOF(double, 8)
|
||||
|
||||
AC_CHECK_TYPE(int32_t)
|
||||
if test "$ac_cv_type_int32_t" = "no"; then
|
||||
BASH_TYPE_INT32_T
|
||||
fi
|
||||
AC_CHECK_TYPE(u_int32_t)
|
||||
if test "$ac_cv_type_u_int32_t" = "no"; then
|
||||
BASH_TYPE_U_INT32_T
|
||||
fi
|
||||
|
||||
AC_CHECK_TYPE(ptrdiff_t)
|
||||
if test "$ac_cv_type_ptrdiff_t" = "no"; then
|
||||
BASH_TYPE_PTRDIFF_T
|
||||
fi
|
||||
BASH_TYPE_INT32_T
|
||||
BASH_TYPE_U_INT32_T
|
||||
BASH_TYPE_PTRDIFF_T
|
||||
BASH_TYPE_BITS64_T
|
||||
|
||||
dnl structures
|
||||
AC_HEADER_STAT
|
||||
|
|
@ -556,23 +621,33 @@ dnl libraries, and specify any additional local cc flags
|
|||
dnl
|
||||
dnl this should really go away someday
|
||||
|
||||
case "$host_os" in
|
||||
case "${host_os}" in
|
||||
sysv4.2*) AC_DEFINE(SVR4_2)
|
||||
AC_DEFINE(SVR4) ;;
|
||||
sysv4*) AC_DEFINE(SVR4) ;;
|
||||
sysv5*) AC_DEFINE(SVR5) ;;
|
||||
hpux9*) LOCAL_CFLAGS="-DHPUX9 -DHPUX" ;;
|
||||
hpux*) LOCAL_CFLAGS=-DHPUX ;;
|
||||
dgux*) LOCAL_CFLAGS=-D_DGUX_SOURCE; LOCAL_LIBS=-ldgc ;;
|
||||
isc*) LOCAL_CFLAGS=-Disc386;;
|
||||
sco3.2v5*) LOCAL_CFLAGS="-DWAITPID_BROKEN -DNO_MEMSCRAMBLE -DPATH_MAX=1024" ;;
|
||||
sco3.2v5*) LOCAL_CFLAGS="-b elf -DWAITPID_BROKEN -DNO_MEMSCRAMBLE -DPATH_MAX=1024" ;;
|
||||
sco3.2v4*) LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DNO_MEMSCRAMBLE -DPATH_MAX=1024" ;;
|
||||
sco3.2*) LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
|
||||
sunos4*) LOCAL_CFLAGS=-DSunOS4 ;;
|
||||
solaris2.5*) LOCAL_CFLAGS=-DSunOS5 ;;
|
||||
lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
|
||||
linux*) LOCAL_LDFLAGS=-rdynamic ;; # allow dynamic loading
|
||||
aix4.2*) LOCAL_LDFLAGS="-bexpall -brtl" ;;# allow dynamic loading
|
||||
*qnx*) LOCAL_CFLAGS="-Dqnx -F -3s" LOCAL_LDFLAGS="-3s -lunix -lncurses" ;;
|
||||
powerux) LOCAL_LIBS="-lgen" ;;
|
||||
powerux*) LOCAL_LIBS="-lgen" ;;
|
||||
cygwin32*) LOCAL_LIBS="-luser32" ;;
|
||||
opennt*|interix*) LOCAL_CFLAGS="-DNO_MAIN_ENV_ARG" ;;
|
||||
esac
|
||||
|
||||
dnl Stanza for OS/compiler pair-specific flags
|
||||
case "${host_os}-${CC}" in
|
||||
aix4.2*-*gcc*) LOCAL_LDFLAGS="-Xlinker -bexpall -Xlinker -brtl" ;;
|
||||
aix4.2*) LOCAL_LDFLAGS="-bexpall -brtl" ;;
|
||||
bsdi4*-*gcc*) LOCAL_LDFLAGS="-rdynamic" ;; # allow dynamic loading, like Linux
|
||||
esac
|
||||
|
||||
case "$host_cpu" in
|
||||
|
|
@ -588,6 +663,24 @@ m88k-motorola-sysv3) LOCAL_CFLAGS=-DWAITPID_BROKEN ;;
|
|||
mips-pyramid-sysv4) LOCAL_CFLAGS=-Xa ;;
|
||||
esac
|
||||
|
||||
#
|
||||
# Shared object configuration section. These values are generated by
|
||||
# ${srcdir}/support/shobj-conf
|
||||
#
|
||||
if test "$ac_cv_func_dlopen" = "yes" && test -f ${srcdir}/support/shobj-conf
|
||||
then
|
||||
AC_MSG_CHECKING(shared object configuration for loadable builtins)
|
||||
eval `${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C ${CC} -c ${host_cpu} -o ${host_os} -v ${host_vendor}`
|
||||
AC_SUBST(SHOBJ_CC)
|
||||
AC_SUBST(SHOBJ_CFLAGS)
|
||||
AC_SUBST(SHOBJ_LD)
|
||||
AC_SUBST(SHOBJ_LDFLAGS)
|
||||
AC_SUBST(SHOBJ_XLDFLAGS)
|
||||
AC_SUBST(SHOBJ_LIBS)
|
||||
AC_SUBST(SHOBJ_STATUS)
|
||||
AC_MSG_RESULT($SHOBJ_STATUS)
|
||||
fi
|
||||
|
||||
# try to create a directory tree if the source is elsewhere
|
||||
# this should be packaged into a script accessible via ${srcdir}/support
|
||||
case "$srcdir" in
|
||||
|
|
@ -611,11 +704,13 @@ AC_SUBST(BUILD_DIR)
|
|||
|
||||
AC_SUBST(YACC)
|
||||
AC_SUBST(AR)
|
||||
AC_SUBST(ARFLAGS)
|
||||
|
||||
AC_SUBST(BASHVERS)
|
||||
AC_SUBST(BASHPATCH)
|
||||
|
||||
AC_SUBST(host_cpu)
|
||||
AC_SUBST(host_vendor)
|
||||
AC_SUBST(host_os)
|
||||
|
||||
AC_SUBST(LOCAL_LIBS)
|
||||
|
|
|
|||
36
cross-build/beos-sig.h
Normal file
36
cross-build/beos-sig.h
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/* This file is used when cross compiling bash to run native on BeOS. */
|
||||
|
||||
#ifndef __GNUC__
|
||||
# error cross compiling requires gcc
|
||||
#endif
|
||||
|
||||
/* A translation list so we can be polite to our users.
|
||||
Use gcc labelled initializers to set up the array. Note that
|
||||
some entries might wind up being NULL. */
|
||||
|
||||
char *signal_names[NSIG + 2] = {
|
||||
[0] "EXIT",
|
||||
[SIGHUP] "SIGHUP",
|
||||
[SIGINT] "SIGINT",
|
||||
[SIGQUIT] "SIGQUIT",
|
||||
[SIGILL] "SIGILL",
|
||||
[SIGCHLD] "SIGCHLD",
|
||||
[SIGABRT] "SIGABRT",
|
||||
[SIGPIPE] "SIGPIPE",
|
||||
[SIGFPE] "SIGFPE",
|
||||
[SIGKILL] "SIGKILL",
|
||||
[SIGSTOP] "SIGSTOP",
|
||||
[SIGSEGV] "SIGSEGV",
|
||||
[SIGCONT] "SIGCONT",
|
||||
[SIGTSTP] "SIGTSTP",
|
||||
[SIGALRM] "SIGALRM",
|
||||
[SIGTERM] "SIGTERM",
|
||||
[SIGTTIN] "SIGTTIN",
|
||||
[SIGTTOU] "SIGTTOU",
|
||||
[SIGUSR1] "SIGUSR1",
|
||||
[SIGUSR2] "SIGUSR2",
|
||||
[SIGWINCH] "SIGWINCH",
|
||||
[SIGKILLTHR] "SIGKILLTHR",
|
||||
[NSIG] "DEBUG",
|
||||
[NSIG + 1] (char *)0x0,
|
||||
};
|
||||
|
|
@ -14,6 +14,7 @@ bash_cv_sys_restartable_syscalls=${bash_cv_sys_restartable_syscalls='no'}
|
|||
ac_cv_sizeof_char_p=${ac_cv_sizeof_char_p='4'}
|
||||
ac_cv_sizeof_int=${ac_cv_sizeof_int='4'}
|
||||
ac_cv_sizeof_long=${ac_cv_sizeof_long='4'}
|
||||
ac_cv_sizeof_double=${ac_cv_sizeof_double='8'}
|
||||
|
||||
bash_cv_dup2_broken=${bash_cv_dup2_broken='no'}
|
||||
bash_cv_pgrp_pipe=${bash_cv_pgrp_pipe='no'}
|
||||
|
|
@ -36,4 +37,6 @@ bash_cv_func_strcoll_broken=${bash_cv_func_strcoll_broken='no'}
|
|||
bash_cv_type_int32_t=${bash_cv_type_int32_t='int'}
|
||||
bash_cv_type_u_int32_t=${bash_cv_type_u_int32_t='int'}
|
||||
|
||||
ac_cv_type_bits64_t=${ac_cv_type_bits64_t='no'}
|
||||
|
||||
# end of cross-build/cygwin32.cache
|
||||
|
|
|
|||
169
cross-build/opennt.cache
Normal file
169
cross-build/opennt.cache
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
# This file is a shell script that caches the results of configure
|
||||
# tests run on this system so they can be shared between configure
|
||||
# scripts and configure runs. It is not useful on other systems.
|
||||
# If it contains results you don't want to keep, you may remove or edit it.
|
||||
#
|
||||
# By default, configure uses ./config.cache as the cache file,
|
||||
# creating it if it does not exist already. You can give configure
|
||||
# the --cache-file=FILE option to use a different cache file; that is
|
||||
# what configure does when it calls configure scripts in
|
||||
# subdirectories, so they share the cache.
|
||||
# Giving --cache-file=/dev/null disables caching, for debugging configure.
|
||||
# config.status only pays attention to the cache file if you give it the
|
||||
# --recheck option to rerun configure.
|
||||
#
|
||||
ac_cv_c_bigendian=${ac_cv_c_bigendian=no}
|
||||
ac_cv_decl_sys_siglist=${ac_cv_decl_sys_siglist=no}
|
||||
ac_cv_func___setostype=${ac_cv_func___setostype=no}
|
||||
ac_cv_func_alloca_works=${ac_cv_func_alloca_works=yes}
|
||||
ac_cv_func_bcopy=${ac_cv_func_bcopy=yes}
|
||||
ac_cv_func_bindtextdomain=${ac_cv_func_bindtextdomain=no}
|
||||
ac_cv_func_bzero=${ac_cv_func_bzero=yes}
|
||||
ac_cv_func_confstr=${ac_cv_func_confstr=yes}
|
||||
ac_cv_func_dlclose=${ac_cv_func_dlclose=no}
|
||||
ac_cv_func_dlopen=${ac_cv_func_dlopen=no}
|
||||
ac_cv_func_dlsym=${ac_cv_func_dlsym=no}
|
||||
ac_cv_func_dup2=${ac_cv_func_dup2=yes}
|
||||
ac_cv_func_getcwd=${ac_cv_func_getcwd=yes}
|
||||
ac_cv_func_getdtablesize=${ac_cv_func_getdtablesize=no}
|
||||
ac_cv_func_getgroups=${ac_cv_func_getgroups=yes}
|
||||
ac_cv_func_gethostname=${ac_cv_func_gethostname=yes}
|
||||
ac_cv_func_getpagesize=${ac_cv_func_getpagesize=yes}
|
||||
ac_cv_func_getpeername=${ac_cv_func_getpeername=yes}
|
||||
ac_cv_func_getpgrp_void=${ac_cv_func_getpgrp_void=yes}
|
||||
ac_cv_func_getrlimit=${ac_cv_func_getrlimit=no}
|
||||
ac_cv_func_getrusage=${ac_cv_func_getrusage=no}
|
||||
ac_cv_func_gettext=${ac_cv_func_gettext=no}
|
||||
ac_cv_func_gettimeofday=${ac_cv_func_gettimeofday=yes}
|
||||
ac_cv_func_killpg=${ac_cv_func_killpg=yes}
|
||||
ac_cv_func_lstat=${ac_cv_func_lstat=no}
|
||||
ac_cv_func_memmove=${ac_cv_func_memmove=yes}
|
||||
ac_cv_func_mkfifo=${ac_cv_func_mkfifo=yes}
|
||||
ac_cv_func_putenv=${ac_cv_func_putenv=yes}
|
||||
ac_cv_func_rename=${ac_cv_func_rename=yes}
|
||||
ac_cv_func_sbrk=${ac_cv_func_sbrk=no}
|
||||
ac_cv_func_select=${ac_cv_func_select=yes}
|
||||
ac_cv_func_setdtablesize=${ac_cv_func_setdtablesize=no}
|
||||
ac_cv_func_setenv=${ac_cv_func_setenv=yes}
|
||||
ac_cv_func_setlinebuf=${ac_cv_func_setlinebuf=yes}
|
||||
ac_cv_func_setlocale=${ac_cv_func_setlocale=yes}
|
||||
ac_cv_func_setvbuf_reversed=${ac_cv_func_setvbuf_reversed=no}
|
||||
ac_cv_func_siginterrupt=${ac_cv_func_siginterrupt=no}
|
||||
ac_cv_func_strcasecmp=${ac_cv_func_strcasecmp=yes}
|
||||
ac_cv_func_strchr=${ac_cv_func_strchr=yes}
|
||||
ac_cv_func_strcoll_works=${ac_cv_func_strcoll_works=yes}
|
||||
ac_cv_func_strerror=${ac_cv_func_strerror=yes}
|
||||
ac_cv_func_strtod=${ac_cv_func_strtod=yes}
|
||||
ac_cv_func_strtol=${ac_cv_func_strtol=yes}
|
||||
ac_cv_func_strtoul=${ac_cv_func_strtoul=yes}
|
||||
ac_cv_func_sysconf=${ac_cv_func_sysconf=yes}
|
||||
ac_cv_func_tcgetattr=${ac_cv_func_tcgetattr=yes}
|
||||
ac_cv_func_tcgetpgrp=${ac_cv_func_tcgetpgrp=yes}
|
||||
ac_cv_func_textdomain=${ac_cv_func_textdomain=no}
|
||||
ac_cv_func_times=${ac_cv_func_times=yes}
|
||||
ac_cv_func_tzset=${ac_cv_func_tzset=yes}
|
||||
ac_cv_func_ulimit=${ac_cv_func_ulimit=no}
|
||||
ac_cv_func_uname=${ac_cv_func_uname=yes}
|
||||
ac_cv_func_vprintf=${ac_cv_func_vprintf=yes}
|
||||
ac_cv_func_wait3=${ac_cv_func_wait3=no}
|
||||
ac_cv_func_wait3_rusage=${ac_cv_func_wait3_rusage=no}
|
||||
ac_cv_func_waitpid=${ac_cv_func_waitpid=yes}
|
||||
ac_cv_header_alloca_h=${ac_cv_header_alloca_h=no}
|
||||
ac_cv_header_dirent_dirent_h=${ac_cv_header_dirent_dirent_h=yes}
|
||||
ac_cv_header_dlfcn_h=${ac_cv_header_dlfcn_h=no}
|
||||
ac_cv_header_libintl_h=${ac_cv_header_libintl_h=no}
|
||||
ac_cv_header_limits_h=${ac_cv_header_limits_h=yes}
|
||||
ac_cv_header_locale_h=${ac_cv_header_locale_h=yes}
|
||||
ac_cv_header_memory_h=${ac_cv_header_memory_h=yes}
|
||||
ac_cv_header_minix_config_h=${ac_cv_header_minix_config_h=no}
|
||||
ac_cv_header_stat_broken=${ac_cv_header_stat_broken=no}
|
||||
ac_cv_header_stdarg_h=${ac_cv_header_stdarg_h=yes}
|
||||
ac_cv_header_stdc=${ac_cv_header_stdc=yes}
|
||||
ac_cv_header_stdlib_h=${ac_cv_header_stdlib_h=yes}
|
||||
ac_cv_header_string_h=${ac_cv_header_string_h=yes}
|
||||
ac_cv_header_sys_file_h=${ac_cv_header_sys_file_h=yes}
|
||||
ac_cv_header_sys_param_h=${ac_cv_header_sys_param_h=yes}
|
||||
ac_cv_header_sys_pte_h=${ac_cv_header_sys_pte_h=no}
|
||||
ac_cv_header_sys_ptem_h=${ac_cv_header_sys_ptem_h=no}
|
||||
ac_cv_header_sys_resource_h=${ac_cv_header_sys_resource_h=no}
|
||||
ac_cv_header_sys_select_h=${ac_cv_header_sys_select_h=no}
|
||||
ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=yes}
|
||||
ac_cv_header_sys_stream_h=${ac_cv_header_sys_stream_h=no}
|
||||
ac_cv_header_sys_time_h=${ac_cv_header_sys_time_h=yes}
|
||||
ac_cv_header_sys_times_h=${ac_cv_header_sys_times_h=yes}
|
||||
ac_cv_header_sys_wait_h=${ac_cv_header_sys_wait_h=yes}
|
||||
ac_cv_header_termcap_h=${ac_cv_header_termcap_h=no}
|
||||
ac_cv_header_termio_h=${ac_cv_header_termio_h=no}
|
||||
ac_cv_header_termios_h=${ac_cv_header_termios_h=yes}
|
||||
ac_cv_header_time=${ac_cv_header_time=yes}
|
||||
ac_cv_header_unistd_h=${ac_cv_header_unistd_h=yes}
|
||||
ac_cv_header_varargs_h=${ac_cv_header_varargs_h=no}
|
||||
ac_cv_lib_dir_opendir=${ac_cv_lib_dir_opendir=no}
|
||||
ac_cv_lib_dl_dlopen=${ac_cv_lib_dl_dlopen=no}
|
||||
ac_cv_lib_intl_bindtextdomain=${ac_cv_lib_intl_bindtextdomain=no}
|
||||
ac_cv_lib_termcap_tgetent=${ac_cv_lib_termcap_tgetent=yes}
|
||||
ac_cv_path_install=${ac_cv_path_install='//C/OpenNT21b3/bin/install -c'}
|
||||
ac_cv_prog_AR=${ac_cv_prog_AR=ar}
|
||||
ac_cv_prog_CC=${ac_cv_prog_CC=gcc}
|
||||
ac_cv_prog_CPP=${ac_cv_prog_CPP='cc -E'}
|
||||
ac_cv_prog_RANLIB=${ac_cv_prog_RANLIB=:}
|
||||
ac_cv_prog_cc_cross=${ac_cv_prog_cc_cross=no}
|
||||
ac_cv_prog_cc_g=${ac_cv_prog_cc_g=yes}
|
||||
ac_cv_prog_cc_works=${ac_cv_prog_cc_works=yes}
|
||||
ac_cv_prog_gcc=${ac_cv_prog_gcc=yes}
|
||||
ac_cv_prog_gcc_traditional=${ac_cv_prog_gcc_traditional=no}
|
||||
ac_cv_prog_make_make_set=${ac_cv_prog_make_make_set=yes}
|
||||
ac_cv_sizeof_char_p=${ac_cv_sizeof_char_p=4}
|
||||
ac_cv_sizeof_double=${ac_cv_sizeof_double=8}
|
||||
ac_cv_sizeof_int=${ac_cv_sizeof_int=4}
|
||||
ac_cv_sizeof_long=${ac_cv_sizeof_long=4}
|
||||
ac_cv_sys_interpreter=${ac_cv_sys_interpreter=yes}
|
||||
ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls=no}
|
||||
ac_cv_type_getgroups=${ac_cv_type_getgroups=gid_t}
|
||||
ac_cv_type_mode_t=${ac_cv_type_mode_t=yes}
|
||||
ac_cv_type_off_t=${ac_cv_type_off_t=yes}
|
||||
ac_cv_type_pid_t=${ac_cv_type_pid_t=yes}
|
||||
ac_cv_type_signal=${ac_cv_type_signal=void}
|
||||
ac_cv_type_size_t=${ac_cv_type_size_t=yes}
|
||||
ac_cv_type_time_t=${ac_cv_type_time_t=yes}
|
||||
ac_cv_type_uid_t=${ac_cv_type_uid_t=yes}
|
||||
bash_cv_can_redecl_getpw=${bash_cv_can_redecl_getpw=yes}
|
||||
bash_cv_decl_under_sys_siglist=${bash_cv_decl_under_sys_siglist=no}
|
||||
bash_cv_dev_fd=${bash_cv_dev_fd=absent}
|
||||
bash_cv_dirent_has_d_fileno=${bash_cv_dirent_has_d_fileno=no}
|
||||
bash_cv_dirent_has_dino=${bash_cv_dirent_has_dino=yes}
|
||||
bash_cv_dup2_broken=${bash_cv_dup2_broken=no}
|
||||
bash_cv_fionread_in_ioctl=${bash_cv_fionread_in_ioctl=yes}
|
||||
bash_cv_func_lstat=${bash_cv_func_lstat=no}
|
||||
bash_cv_func_sigsetjmp=${bash_cv_func_sigsetjmp=present}
|
||||
bash_cv_func_strcoll_broken=${bash_cv_func_strcoll_broken=no}
|
||||
bash_cv_getcwd_calls_popen=${bash_cv_getcwd_calls_popen=no}
|
||||
bash_cv_getenv_redef=${bash_cv_getenv_redef=yes}
|
||||
bash_cv_have_strsignal=${bash_cv_have_strsignal=yes}
|
||||
bash_cv_job_control_missing=${bash_cv_job_control_missing=present}
|
||||
bash_cv_mail_dir=${bash_cv_mail_dir=/usr/spool/mail}
|
||||
bash_cv_must_reinstall_sighandlers=${bash_cv_must_reinstall_sighandlers=no}
|
||||
bash_cv_opendir_not_robust=${bash_cv_opendir_not_robust=no}
|
||||
bash_cv_pgrp_pipe=${bash_cv_pgrp_pipe=no}
|
||||
bash_cv_printf_declared=${bash_cv_printf_declared=yes}
|
||||
bash_cv_sbrk_declared=${bash_cv_sbrk_declared=no}
|
||||
bash_cv_signal_vintage=${bash_cv_signal_vintage=posix}
|
||||
bash_cv_speed_t_in_sys_types=${bash_cv_speed_t_in_sys_types=no}
|
||||
bash_cv_struct_timeval=${bash_cv_struct_timeval=yes}
|
||||
bash_cv_struct_winsize_header=${bash_cv_struct_winsize_header=ioctl_h}
|
||||
bash_cv_struct_winsize_in_ioctl=${bash_cv_struct_winsize_in_ioctl=yes}
|
||||
bash_cv_sys_errlist=${bash_cv_sys_errlist=yes}
|
||||
bash_cv_sys_named_pipes=${bash_cv_sys_named_pipes=present}
|
||||
bash_cv_sys_siglist=${bash_cv_sys_siglist=yes}
|
||||
bash_cv_termcap_lib=${bash_cv_termcap_lib=libtermcap}
|
||||
bash_cv_termio_ldisc=${bash_cv_termio_ldisc=no}
|
||||
bash_cv_termios_ldisc=${bash_cv_termios_ldisc=no}
|
||||
bash_cv_tiocgwinsz_in_ioctl=${bash_cv_tiocgwinsz_in_ioctl=yes}
|
||||
bash_cv_tiocstat_in_ioctl=${bash_cv_tiocstat_in_ioctl=no}
|
||||
bash_cv_type_clock_t=${bash_cv_type_clock_t=yes}
|
||||
bash_cv_type_quad_t=${bash_cv_type_quad_t=yes}
|
||||
bash_cv_type_rlimit=${bash_cv_type_rlimit=long}
|
||||
bash_cv_type_sigset_t=${bash_cv_type_sigset_t=yes}
|
||||
bash_cv_ulimit_maxfds=${bash_cv_ulimit_maxfds=no}
|
||||
bash_cv_under_sys_siglist=${bash_cv_under_sys_siglist=no}
|
||||
bash_cv_void_sighandler=${bash_cv_void_sighandler=yes}
|
||||
45
cross-build/x86-beos.cache
Normal file
45
cross-build/x86-beos.cache
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
# This file is a shell script that caches the results of configure
|
||||
# tests for x86 BeOS so they don't need to be done when cross-compiling.
|
||||
|
||||
# AC_FUNC_GETPGRP should also define GETPGRP_VOID
|
||||
ac_cv_func_getpgrp_void=${ac_cv_func_getpgrp_void='yes'}
|
||||
# AC_FUNC_SETVBUF_REVERSED should not define anything else
|
||||
ac_cv_func_setvbuf_reversed=${ac_cv_func_setvbuf_reversed='no'}
|
||||
# on BeOS, system calls do not restart
|
||||
ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}
|
||||
bash_cv_sys_restartable_syscalls=${bash_cv_sys_restartable_syscalls='no'}
|
||||
|
||||
ac_cv_func_tcgetattr=${ac_cv_func_tcgetattr='yes'}
|
||||
|
||||
# x86 BeOS is little endian
|
||||
ac_cv_c_bigendian=${ac_cv_c_bigendian='no'}
|
||||
ac_cv_sizeof_char_p=${ac_cv_sizeof_char_p='4'}
|
||||
ac_cv_sizeof_int=${ac_cv_sizeof_int='4'}
|
||||
ac_cv_sizeof_long=${ac_cv_sizeof_long='4'}
|
||||
ac_cv_sizeof_double=${ac_cv_sizeof_double='8'}
|
||||
|
||||
bash_cv_dev_fd=${bash_cv_dev_fd='absent'}
|
||||
bash_cv_dup2_broken=${bash_cv_dup2_broken='no'}
|
||||
bash_cv_pgrp_pipe=${bash_cv_pgrp_pipe='no'}
|
||||
bash_cv_type_rlimit=${bash_cv_type_rlimit='long'}
|
||||
bash_cv_decl_under_sys_siglist=${bash_cv_decl_under_sys_siglist='no'}
|
||||
bash_cv_under_sys_siglist=${bash_cv_under_sys_siglist='no'}
|
||||
bash_cv_sys_siglist=${bash_cv_sys_siglist='yes'}
|
||||
bash_cv_opendir_not_robust=${bash_cv_opendir_not_robust='no'}
|
||||
bash_cv_getenv_redef=${bash_cv_getenv_redef='yes'}
|
||||
bash_cv_printf_declared=${bash_cv_printf_declared='yes'}
|
||||
bash_cv_ulimit_maxfds=${bash_cv_ulimit_maxfds='no'}
|
||||
bash_cv_getcwd_calls_popen=${bash_cv_getcwd_calls_popen='no'}
|
||||
bash_cv_must_reinstall_sighandlers=${bash_cv_must_reinstall_sighandlers='no'}
|
||||
bash_cv_job_control_missing=${bash_cv_job_control_missing='present'}
|
||||
bash_cv_sys_named_pipes=${bash_cv_sys_named_pipes='present'}
|
||||
bash_cv_func_sigsetjmp=${bash_cv_func_sigsetjmp='missing'}
|
||||
bash_cv_mail_dir=${bash_cv_mail_dir='unknown'}
|
||||
bash_cv_func_strcoll_broken=${bash_cv_func_strcoll_broken='no'}
|
||||
|
||||
bash_cv_type_int32_t=${bash_cv_type_int32_t='int'}
|
||||
bash_cv_type_u_int32_t=${bash_cv_type_u_int32_t='int'}
|
||||
|
||||
ac_cv_type_bits64_t=${ac_cv_type_bits64_t='no'}
|
||||
|
||||
# end of cross-build/x86-beos.cache
|
||||
|
|
@ -169,7 +169,7 @@ dispose_command (command)
|
|||
}
|
||||
|
||||
default:
|
||||
programming_error ("dispose_command: bad command type `%d'", command->type);
|
||||
command_error ("dispose_command", CMDERR_BADTYPE, command->type, 0);
|
||||
break;
|
||||
}
|
||||
free (command);
|
||||
|
|
|
|||
306
doc/FAQ
306
doc/FAQ
|
|
@ -1,4 +1,4 @@
|
|||
This is the Bash FAQ, version 2.13, for Bash version 2.02.
|
||||
This is the Bash FAQ, version 3.0, for Bash version 2.03.
|
||||
|
||||
This document contains a set of frequently-asked questions concerning
|
||||
Bash, the GNU Bourne-Again Shell. Bash is a freely-available command
|
||||
|
|
@ -20,87 +20,87 @@ Contents:
|
|||
|
||||
Section A: The Basics
|
||||
|
||||
1) What is it?
|
||||
2) What's the latest version?
|
||||
3) Where can I get it?
|
||||
4) On what machines will bash run?
|
||||
5) Will bash run on operating systems other than Unix?
|
||||
6) How can I build bash with gcc?
|
||||
7) How can I make bash my login shell?
|
||||
8) I just changed my login shell to bash, and now I can't FTP into my
|
||||
machine. Why not?
|
||||
9) What's the `POSIX 1003.2 standard'?
|
||||
10) What is the bash `posix mode'?
|
||||
A1) What is it?
|
||||
A2) What's the latest version?
|
||||
A3) Where can I get it?
|
||||
A4) On what machines will bash run?
|
||||
A5) Will bash run on operating systems other than Unix?
|
||||
A6) How can I build bash with gcc?
|
||||
A7) How can I make bash my login shell?
|
||||
A8) I just changed my login shell to bash, and now I can't FTP into my
|
||||
machine. Why not?
|
||||
A9) What's the `POSIX 1003.2 standard'?
|
||||
A10) What is the bash `posix mode'?
|
||||
|
||||
Section B: The latest version
|
||||
|
||||
11) What's new in version 2.02?
|
||||
12) Are there any user-visible incompatibilities between bash-2.02 and
|
||||
B1) What's new in version 2.03?
|
||||
B2) Are there any user-visible incompatibilities between bash-2.03 and
|
||||
bash-1.14.7?
|
||||
|
||||
Section C: Differences from other Unix shells
|
||||
|
||||
13) How does bash differ from sh, the Bourne shell?
|
||||
14) How does bash differ from the Korn shell, version ksh88?
|
||||
15) Which new features in ksh-93 are not in bash, and which are?
|
||||
C1) How does bash differ from sh, the Bourne shell?
|
||||
C2) How does bash differ from the Korn shell, version ksh88?
|
||||
C3) Which new features in ksh-93 are not in bash, and which are?
|
||||
|
||||
Section D: Why does bash do some things differently than other Unix shells?
|
||||
|
||||
16) Why does bash run a different version of `command' than
|
||||
D1) Why does bash run a different version of `command' than
|
||||
`which command' says it will?
|
||||
17) Why doesn't bash treat brace expansions exactly like csh?
|
||||
18) Why doesn't bash have csh variable modifiers?
|
||||
19) How can I make my csh aliases work when I convert to bash?
|
||||
20) How can I pipe standard output and standard error from one command to
|
||||
D2) Why doesn't bash treat brace expansions exactly like csh?
|
||||
D3) Why doesn't bash have csh variable modifiers?
|
||||
D4) How can I make my csh aliases work when I convert to bash?
|
||||
D5) How can I pipe standard output and standard error from one command to
|
||||
another, like csh does with `|&'?
|
||||
21) Now that I've converted from ksh to bash, are there equivalents to
|
||||
D6) Now that I've converted from ksh to bash, are there equivalents to
|
||||
ksh features like autoloaded functions and the `whence' command?
|
||||
|
||||
Section E: How can I get bash to do certain things, and why does bash do
|
||||
things the way it does?
|
||||
|
||||
22) Why is the bash builtin `test' slightly different from /bin/test?
|
||||
23) Why does bash sometimes say `Broken pipe'?
|
||||
24) How can I get bash to read and display eight-bit characters?
|
||||
25) How do I write a function `x' to replace builtin command `x', but
|
||||
E1) Why is the bash builtin `test' slightly different from /bin/test?
|
||||
E2) Why does bash sometimes say `Broken pipe'?
|
||||
E3) How can I get bash to read and display eight-bit characters?
|
||||
E4) How do I write a function `x' to replace builtin command `x', but
|
||||
still invoke the command from within the function?
|
||||
26) When I have terminal escape sequences in my prompt, why does bash
|
||||
E5) When I have terminal escape sequences in my prompt, why does bash
|
||||
wrap lines at the wrong column?
|
||||
27) How can I find the value of a shell variable whose name is the value
|
||||
E6) How can I find the value of a shell variable whose name is the value
|
||||
of another shell variable?
|
||||
28) If I pipe the output of a command into `read variable', why doesn't
|
||||
E7) If I pipe the output of a command into `read variable', why doesn't
|
||||
the output show up in $variable when the read command finishes?
|
||||
29) I have a bunch of shell scripts that use backslash-escaped characters
|
||||
E8) I have a bunch of shell scripts that use backslash-escaped characters
|
||||
in arguments to `echo'. Bash doesn't interpret these characters. Why
|
||||
not, and how can I make it understand them?
|
||||
30) Why doesn't a while or for loop get suspended when I type ^Z?
|
||||
31) How can I make the bash `time' reserved word print timing output that
|
||||
looks like the output from my system's /usr/bin/time?
|
||||
E9) Why doesn't a while or for loop get suspended when I type ^Z?
|
||||
E10) How can I make the bash `time' reserved word print timing output that
|
||||
looks like the output from my system's /usr/bin/time?
|
||||
|
||||
Section F: Things to watch out for on certain Unix versions
|
||||
|
||||
32) Why can't I use command line editing in my `cmdtool'?
|
||||
33) I built bash on Solaris 2. Why do globbing expansions and filename
|
||||
F1) Why can't I use command line editing in my `cmdtool'?
|
||||
F2) I built bash on Solaris 2. Why do globbing expansions and filename
|
||||
completion chop off the first few characters of each filename?
|
||||
34) Why does bash dump core after I interrupt username completion or
|
||||
F3) Why does bash dump core after I interrupt username completion or
|
||||
`~user' tilde expansion on a machine running NIS?
|
||||
35) I'm running SVR4.2. Why is the line erased every time I type `@'?
|
||||
36) Why does bash report syntax errors when my C News scripts use a
|
||||
F4) I'm running SVR4.2. Why is the line erased every time I type `@'?
|
||||
F5) Why does bash report syntax errors when my C News scripts use a
|
||||
redirection before a subshell command?
|
||||
|
||||
Section G: Where do I go from here?
|
||||
|
||||
37) How do I report bugs in bash, and where should I look for fixes and
|
||||
G1) How do I report bugs in bash, and where should I look for fixes and
|
||||
advice?
|
||||
38) What kind of bash documentation is there?
|
||||
39) What's coming in future versions?
|
||||
40) What's on the bash `wish list'?
|
||||
41) When will the next release appear?
|
||||
G2) What kind of bash documentation is there?
|
||||
G3) What's coming in future versions?
|
||||
G4) What's on the bash `wish list'?
|
||||
G5) When will the next release appear?
|
||||
|
||||
----------
|
||||
Section A: The Basics
|
||||
|
||||
1) What is it?
|
||||
A1) What is it?
|
||||
|
||||
Bash is a Unix command interpreter (shell). It is an implementation of
|
||||
the Posix 1003.2 shell standard, and resembles the Korn and System V
|
||||
|
|
@ -118,26 +118,26 @@ Bash was originally written by Brian Fox of the Free Software
|
|||
Foundation. The current developer and maintainer is Chet Ramey
|
||||
of Case Western Reserve University.
|
||||
|
||||
2) What's the latest version?
|
||||
A2) What's the latest version?
|
||||
|
||||
The latest version is 2.02, first made available on Monday, 20 April, 1998.
|
||||
The latest version is 2.03, first made available on Friday, 19 Feburary 1999.
|
||||
|
||||
3) Where can I get it?
|
||||
A3) Where can I get it?
|
||||
|
||||
Bash is the GNU project's shell, and so is available from the
|
||||
master GNU archive site, prep.ai.mit.edu, and its mirrors. The
|
||||
master GNU archive site, ftp.gnu.org, and its mirrors. The
|
||||
latest version is also available for FTP from ftp.cwru.edu.
|
||||
The following URLs tell how to get version 2.02:
|
||||
The following URLs tell how to get version 2.03:
|
||||
|
||||
ftp://prep.ai.mit.edu/pub/gnu/bash-2.02.tar.gz
|
||||
ftp://ftp.cwru.edu/pub/bash/bash-2.02.tar.gz
|
||||
ftp://ftp.gnu.org/pub/gnu/bash-2.03.tar.gz
|
||||
ftp://ftp.cwru.edu/pub/bash/bash-2.03.tar.gz
|
||||
|
||||
Formatted versions of the documentation are available with the URLs:
|
||||
|
||||
ftp://prep.ai.mit.edu/pub/gnu/bash-doc-2.02.tar.gz
|
||||
ftp://ftp.cwru.edu/pub/bash/bash-doc-2.02.tar.gz
|
||||
ftp://ftp.gnu.org/pub/gnu/bash-doc-2.03.tar.gz
|
||||
ftp://ftp.cwru.edu/pub/bash/bash-doc-2.03.tar.gz
|
||||
|
||||
4) On what machines will bash run?
|
||||
A4) On what machines will bash run?
|
||||
|
||||
Bash has been ported to nearly every version of UNIX. All you
|
||||
should have to do to build it on a machine for which a port
|
||||
|
|
@ -147,10 +147,10 @@ itself accordingly, using a script created by GNU autoconf.
|
|||
|
||||
More information appears in the file `INSTALL' in the distribution.
|
||||
|
||||
5) Will bash run on operating systems other than Unix?
|
||||
A5) Will bash run on operating systems other than Unix?
|
||||
|
||||
Configuration specifics for Unix-like systems such as QNX and
|
||||
LynxOS are included in the distribution. Bash-2.02 should
|
||||
LynxOS are included in the distribution. Bash-2.03 should
|
||||
compile and run on Minix 2.0 (patches were contributed), but I
|
||||
don't believe anyone has built bash-2.x on earlier Minix versions
|
||||
yet.
|
||||
|
|
@ -162,12 +162,12 @@ project. For more information about the project, look at the URL
|
|||
|
||||
http://www.cygnus.com/misc/gnu-win32
|
||||
|
||||
Cygnus has ported bash-1.14.7, and their port is part of the current
|
||||
gnu-win32 release. Cygnus has also done a port of bash-2.01 to the
|
||||
GNU-Win32 environment, and it should be available as part of their next
|
||||
release.
|
||||
Cygnus originally ported bash-1.14.7, and that port was part of their
|
||||
early GNU-Win32 releases. Cygnus has also done a port of bash-2.01 to the
|
||||
GNU-Win32 environment, and it is available as part of their current
|
||||
release. (They may have upgraded by now.)
|
||||
|
||||
Bash-2.02 should require no local Cygnus changes to build and run under
|
||||
Bash-2.03 should require no local Cygnus changes to build and run under
|
||||
GNU-WIN32.
|
||||
|
||||
The Cygnus port works only on Intel machines. There is a port of bash
|
||||
|
|
@ -175,9 +175,19 @@ The Cygnus port works only on Intel machines. There is a port of bash
|
|||
|
||||
ftp://ftp.gnustep.org//pub/win32/bash-alpha-nt-1.01.tar.gz
|
||||
|
||||
Softway Systems has ported bash-2.01.1 to their Interix (nee OpenNT)
|
||||
Softway Systems has ported bash-2.01 to their Interix (nee OpenNT)
|
||||
system, a Unix subsystem for NT that replaces the Microsoft POSIX
|
||||
subsystem. Check out http://www.interix.com for more information.
|
||||
Some support for Interix has been incorporated into bash, beginning
|
||||
with Bash-2.03. It should be easier to build bash on Interix now,
|
||||
but Interix users should fetch
|
||||
|
||||
ftp://ftp.interix.com/pub/tw/unsup/bash.diffs.tar.gz
|
||||
|
||||
and read the README.OpenNT file in that archive. It will detail the
|
||||
arguments configure needs to build on Interix. A configure cache
|
||||
file for Interix is in the bash distribution in cross-build/opennt.cache;
|
||||
copy that to `config.cache' before starting configure.
|
||||
|
||||
D. J. Delorie has ported bash-1.14.7 to run under MS-DOS, as part of
|
||||
the DJGPP project. For more information on the project, see
|
||||
|
|
@ -201,12 +211,12 @@ ftp://hobbes.nmsu.edu/pub/os2/util/shell/bash-2.0(253).zip
|
|||
I haven't looked at either, but the second appears to be a binary-only
|
||||
distribution. Beware.
|
||||
|
||||
6) How can I build bash with gcc?
|
||||
A6) How can I build bash with gcc?
|
||||
|
||||
Bash configures to use gcc by default if it is available. Read the
|
||||
file INSTALL in the distribution for more information.
|
||||
|
||||
7) How can I make bash my login shell?
|
||||
A7) How can I make bash my login shell?
|
||||
|
||||
Some machines let you use `chsh' to change your login shell. Other
|
||||
systems use `passwd -s' or `passwd -e'. If one of these works for
|
||||
|
|
@ -252,7 +262,7 @@ This will cause login shells to replace themselves with bash running as
|
|||
a login shell. Once you have this working, you can copy your initialization
|
||||
code from ~/.profile to ~/.bash_profile.
|
||||
|
||||
8) I just changed my login shell to bash, and now I can't FTP into my
|
||||
A8) I just changed my login shell to bash, and now I can't FTP into my
|
||||
machine. Why not?
|
||||
|
||||
You must add the full pathname to bash to the file /etc/shells. As
|
||||
|
|
@ -262,7 +272,7 @@ this before you can make bash your login shell.
|
|||
Most versions of ftpd use this file to prohibit `special' users
|
||||
such as `uucp' and `news' from using FTP.
|
||||
|
||||
9) What's the `POSIX 1003.2 standard'?
|
||||
A9) What's the `POSIX 1003.2 standard'?
|
||||
|
||||
POSIX is a name originally coined by Richard Stallman for a
|
||||
family of open system standards based on UNIX. There are a
|
||||
|
|
@ -297,7 +307,7 @@ line editing. Only vi-style line editing commands have been
|
|||
standardized; emacs editing commands were left out due to
|
||||
objections.
|
||||
|
||||
10) What is the bash `posix mode'?
|
||||
A10) What is the bash `posix mode'?
|
||||
|
||||
Although bash is an implementation of the POSIX.2 shell
|
||||
specification, there are areas where the bash default behavior
|
||||
|
|
@ -314,9 +324,29 @@ Reference Manual.
|
|||
|
||||
Section B: The latest version
|
||||
|
||||
11) What's new in version 2.02?
|
||||
B1) What's new in version 2.03?
|
||||
|
||||
Bash-2.02 has a number of new features. Here's a short list:
|
||||
Bash-2.03 has a very few new features, in keeping with the convention
|
||||
that odd-numbered releases provide mainly bug fixes. A number of new
|
||||
features were added to Readline, mostly at the request of the Cygnus
|
||||
folks.
|
||||
|
||||
a new shopt option, `restricted_shell', so that startup files can test
|
||||
whether or not the shell was started in restricted mode
|
||||
filename generation is now performed on the words between ( and ) in
|
||||
compound array assignments (this is really a bug fix)
|
||||
OLDPWD is now auto-exported, as POSIX.2 requires
|
||||
ENV and BASH_ENV are read-only variables in a restricted shell
|
||||
Bash may now be linked against an already-installed Readline library,
|
||||
as long as the Readline library is version 4 or newer
|
||||
All shells begun with the `--login' option will source the login shell
|
||||
startup files, even if the shell is not interactive
|
||||
|
||||
There are lots of changes to the version of the Readline library released
|
||||
along with Bash-2.03. For a complete list of the changes, read the file
|
||||
CHANGES in the Bash-2.03 distribution.
|
||||
|
||||
Bash-2.02 contained the following new features:
|
||||
|
||||
a new version of malloc (based on the old GNU malloc code in previous
|
||||
bash versions) that is more page-oriented, more conservative
|
||||
|
|
@ -382,15 +412,15 @@ grammar tighter and smaller (66 reduce-reduce conflicts gone)
|
|||
lots of code now smaller and faster
|
||||
test suite greatly expanded
|
||||
|
||||
12) Are there any user-visible incompatibilities between bash-2.02 and
|
||||
B2) Are there any user-visible incompatibilities between bash-2.03 and
|
||||
bash-1.14.7?
|
||||
|
||||
There are a few incompatibilities between version 1.14.7 and version 2.02.
|
||||
They are detailed in the file COMPAT in the bash-2.02 distribution.
|
||||
There are a few incompatibilities between version 1.14.7 and version 2.03.
|
||||
They are detailed in the file COMPAT in the bash-2.03 distribution.
|
||||
|
||||
Section C: Differences from other Unix shells
|
||||
|
||||
13) How does bash differ from sh, the Bourne shell?
|
||||
C1) How does bash differ from sh, the Bourne shell?
|
||||
|
||||
This is a non-comprehensive list of features that differentiate bash
|
||||
from the SVR4.2 shell. The bash manual page explains these more
|
||||
|
|
@ -481,11 +511,12 @@ Implementation differences:
|
|||
bash allows multiple option arguments when invoked (e.g. -x -v);
|
||||
sh allows only a single option argument (`sh -x -v' attempts
|
||||
to open a file named `-v', and, on SunOS 4.1.4, dumps core.
|
||||
On Solaris 2, sh goes into an infinite loop.)
|
||||
On Solaris 2.4 and earlier versions, sh goes into an infinite
|
||||
loop.)
|
||||
sh exits a script if any builtin fails; bash exits only if one of
|
||||
the POSIX.2 `special' builtins fails
|
||||
|
||||
14) How does bash differ from the Korn shell, version ksh88?
|
||||
C2) How does bash differ from the Korn shell, version ksh88?
|
||||
|
||||
Things bash has or uses that ksh88 does not:
|
||||
long invocation options
|
||||
|
|
@ -541,9 +572,9 @@ Implementation differences:
|
|||
bash has exported functions
|
||||
bash command search finds functions before builtins
|
||||
|
||||
15) Which new features in ksh-93 are not in bash, and which are?
|
||||
C3) Which new features in ksh-93 are not in bash, and which are?
|
||||
|
||||
New things in ksh-93 not in bash-2.02:
|
||||
New things in ksh-93 not in bash-2.03:
|
||||
associative arrays
|
||||
floating point arithmetic
|
||||
++, --, comma arithmetic operators
|
||||
|
|
@ -564,7 +595,7 @@ New things in ksh-93 not in bash-2.02:
|
|||
read -t/-d
|
||||
`.' can execute shell functions
|
||||
|
||||
New things in ksh-93 present in bash-2.02:
|
||||
New things in ksh-93 present in bash-2.03:
|
||||
?: arithmetic operator
|
||||
expansions: ${!param}, ${param:offset[:len]}, ${param/pat[/str]}
|
||||
compound array assignment
|
||||
|
|
@ -588,16 +619,37 @@ New things in ksh-93 present in bash-2.02:
|
|||
|
||||
Section D: Why does bash do some things differently than other Unix shells?
|
||||
|
||||
16) Why does bash run a different version of `command' than
|
||||
D1) Why does bash run a different version of `command' than
|
||||
`which command' says it will?
|
||||
|
||||
`which' is actually a csh script that assumes you're running csh.
|
||||
It reads the csh startup files from your home directory and uses
|
||||
those to determine which `command' will be invoked. Since bash
|
||||
doesn't use any of those startup files, there's a good chance
|
||||
that your bash environment differs from your csh environment.
|
||||
On many systems, `which' is actually a csh script that assumes
|
||||
you're running csh. In tcsh, `which' and its cousin `where'
|
||||
are builtins. On other Unix systems, `which' is a perl script
|
||||
that uses the PATH environment variable.
|
||||
|
||||
17) Why doesn't bash treat brace expansions exactly like csh?
|
||||
The csh script version reads the csh startup files from your
|
||||
home directory and uses those to determine which `command' will
|
||||
be invoked. Since bash doesn't use any of those startup files,
|
||||
there's a good chance that your bash environment differs from
|
||||
your csh environment. The bash `type' builtin does everything
|
||||
`which' does, and will report correct results for the running
|
||||
shell. If you're really wedded to the name `which', try adding
|
||||
the following function definition to your .bashrc:
|
||||
|
||||
which()
|
||||
{
|
||||
builtin type -p "$@"
|
||||
}
|
||||
|
||||
If you're moving from tcsh and would like to bring `where' along
|
||||
as well, use this function:
|
||||
|
||||
where()
|
||||
{
|
||||
builtin type -a "$@"
|
||||
}
|
||||
|
||||
D2) Why doesn't bash treat brace expansions exactly like csh?
|
||||
|
||||
The only difference between bash and csh brace expansion is that
|
||||
bash requires a brace expression to contain at least one unquoted
|
||||
|
|
@ -608,7 +660,7 @@ compatibility.
|
|||
|
||||
Bash, ksh, zsh, and pd-ksh all implement brace expansion this way.
|
||||
|
||||
18) Why doesn't bash have csh variable modifiers?
|
||||
D3) Why doesn't bash have csh variable modifiers?
|
||||
|
||||
Posix has specified a more powerful, albeit somewhat more cryptic,
|
||||
mechanism cribbed from ksh, and bash implements it.
|
||||
|
|
@ -663,7 +715,7 @@ Given
|
|||
$b:e ${b##*.} xxx
|
||||
|
||||
|
||||
19) How can I make my csh aliases work when I convert to bash?
|
||||
D4) How can I make my csh aliases work when I convert to bash?
|
||||
|
||||
Bash uses a different syntax to support aliases than csh does.
|
||||
The details can be found in the documentation. We have provided
|
||||
|
|
@ -706,7 +758,7 @@ simply `cshtobash' to convert your normal interactive
|
|||
environment, or as `cshtobash ~/.login' to convert your login
|
||||
environment.
|
||||
|
||||
20) How can I pipe standard output and standard error from one command to
|
||||
D5) How can I pipe standard output and standard error from one command to
|
||||
another, like csh does with `|&'?
|
||||
|
||||
Use
|
||||
|
|
@ -716,7 +768,7 @@ The key is to remember that piping is performed before redirection, so
|
|||
file descriptor 1 points to the pipe when it is duplicated onto file
|
||||
descriptor 2.
|
||||
|
||||
21) Now that I've converted from ksh to bash, are there equivalents to
|
||||
D6) Now that I've converted from ksh to bash, are there equivalents to
|
||||
ksh features like autoloaded functions and the `whence' command?
|
||||
|
||||
There are features in ksh-88 that do not have direct bash equivalents.
|
||||
|
|
@ -735,7 +787,7 @@ read var?prompt read -p prompt var
|
|||
Section E: How can I get bash to do certain things, and why does bash do
|
||||
things the way it does?
|
||||
|
||||
22) Why is the bash builtin `test' slightly different from /bin/test?
|
||||
E1) Why is the bash builtin `test' slightly different from /bin/test?
|
||||
|
||||
The specific example used here is [ ! x -o x ], which is false.
|
||||
|
||||
|
|
@ -764,7 +816,7 @@ of the 3 Arg case.
|
|||
|
||||
As you can see, the test becomes (not (x or x)), which is false.
|
||||
|
||||
23) Why does bash sometimes say `Broken pipe'?
|
||||
E2) Why does bash sometimes say `Broken pipe'?
|
||||
|
||||
If a sequence of commands appears in a pipeline, and one of the
|
||||
reading commands finishes before the writer has finished, the
|
||||
|
|
@ -779,7 +831,11 @@ will try to write on a pipe without a reader. In that case, bash
|
|||
will print `Broken pipe' to stderr when ps is killed by a
|
||||
SIGPIPE.
|
||||
|
||||
24) How can I get bash to read and display eight-bit characters?
|
||||
You can build a version of bash that will not report SIGPIPE errors
|
||||
by uncommenting the definition of DONT_REPORT_SIGPIPE in the file
|
||||
config-top.h.
|
||||
|
||||
E3) How can I get bash to read and display eight-bit characters?
|
||||
|
||||
This is a process requiring several steps.
|
||||
|
||||
|
|
@ -813,7 +869,7 @@ this. These variables can be set in your .inputrc or using the bash
|
|||
The `set' commands between the single quotes may also be placed
|
||||
in ~/.inputrc.
|
||||
|
||||
25) How do I write a function `x' to replace builtin command `x', but
|
||||
E4) How do I write a function `x' to replace builtin command `x', but
|
||||
still invoke the command from within the function?
|
||||
|
||||
This is why the `command' and `builtin' builtins exist. The
|
||||
|
|
@ -834,7 +890,7 @@ something like the following:
|
|||
This could also be written using `command' instead of `builtin';
|
||||
the version above is marginally more efficient.
|
||||
|
||||
26) When I have terminal escape sequences in my prompt, why does bash
|
||||
E5) When I have terminal escape sequences in my prompt, why does bash
|
||||
wrap lines at the wrong column?
|
||||
|
||||
Readline, the line editing library that bash uses, does not know
|
||||
|
|
@ -850,10 +906,10 @@ characters in the prompt strings take up no screen space.
|
|||
Use the \[ escape to begin a sequence of non-printing characters,
|
||||
and the \] escape to signal the end of such a sequence.
|
||||
|
||||
27) How can I find the value of a shell variable whose name is the value
|
||||
E6) How can I find the value of a shell variable whose name is the value
|
||||
of another shell variable?
|
||||
|
||||
Bash-2.02 supports this directly. You can use
|
||||
Versions of Bash newer than Bash-2.0 support this directly. You can use
|
||||
|
||||
${!var}
|
||||
|
||||
|
|
@ -875,13 +931,13 @@ parameter:
|
|||
|
||||
The expansion of the quoted portions of this expression will be
|
||||
deferred until `eval' runs, while the `$#' will be expanded
|
||||
before `eval' is executed. In bash-2.02,
|
||||
before `eval' is executed. In versions of bash later than bash-2.0,
|
||||
|
||||
echo ${!#}
|
||||
|
||||
does the same thing.
|
||||
|
||||
28) If I pipe the output of a command into `read variable', why doesn't
|
||||
E7) If I pipe the output of a command into `read variable', why doesn't
|
||||
the output show up in $variable when the read command finishes?
|
||||
|
||||
This has to do with the parent-child relationship between Unix
|
||||
|
|
@ -937,7 +993,7 @@ this.
|
|||
This is the general approach -- in most cases you will not need to
|
||||
set $IFS to a different value.
|
||||
|
||||
29) I have a bunch of shell scripts that use backslash-escaped characters
|
||||
E8) I have a bunch of shell scripts that use backslash-escaped characters
|
||||
in arguments to `echo'. Bash doesn't interpret these characters. Why
|
||||
not, and how can I make it understand them?
|
||||
|
||||
|
|
@ -957,7 +1013,7 @@ configure with the --enable-usg-echo-default option to turn this
|
|||
on. Be aware that this will cause some of the tests run when you
|
||||
type `make tests' to fail.
|
||||
|
||||
30) Why doesn't a while or for loop get suspended when I type ^Z?
|
||||
E9) Why doesn't a while or for loop get suspended when I type ^Z?
|
||||
|
||||
This is a consequence of how job control works on Unix. The only
|
||||
thing that can be suspended is the process group. This is a single
|
||||
|
|
@ -972,8 +1028,8 @@ If you want to be able to stop the entire loop, you need to put it
|
|||
within parentheses, which will force the loop into a subshell that
|
||||
may be stopped (and subsequently restarted) as a single unit.
|
||||
|
||||
31) How can I make the bash `time' reserved word print timing output that
|
||||
looks like the output from my system's /usr/bin/time?
|
||||
E10) How can I make the bash `time' reserved word print timing output that
|
||||
looks like the output from my system's /usr/bin/time?
|
||||
|
||||
The bash command timing code looks for a variable `TIMEFORMAT' and
|
||||
uses its value as a format string to decide how to display the
|
||||
|
|
@ -1006,7 +1062,7 @@ The ksh format can be emulated with:
|
|||
|
||||
Section F: Things to watch out for on certain Unix versions
|
||||
|
||||
32) Why can't I use command line editing in my `cmdtool'?
|
||||
F1) Why can't I use command line editing in my `cmdtool'?
|
||||
|
||||
The problem is `cmdtool' and bash fighting over the input. When
|
||||
scrolling is enabled in a cmdtool window, cmdtool puts the tty in
|
||||
|
|
@ -1034,7 +1090,7 @@ The bash command-line editing should behave better in the new
|
|||
cmdtool. If this works, you can put the assignment to TERMCAP
|
||||
in your bashrc file.
|
||||
|
||||
33) I built bash on Solaris 2. Why do globbing expansions and filename
|
||||
F2) I built bash on Solaris 2. Why do globbing expansions and filename
|
||||
completion chop off the first few characters of each filename?
|
||||
|
||||
This is the consequence of building bash on SunOS 5 and linking
|
||||
|
|
@ -1054,7 +1110,7 @@ If you have installed the Sun C compiler, you may also need to
|
|||
put /usr/ccs/bin and /opt/SUNWspro/bin into your $PATH before
|
||||
/usr/ucb.
|
||||
|
||||
34) Why does bash dump core after I interrupt username completion or
|
||||
F3) Why does bash dump core after I interrupt username completion or
|
||||
`~user' tilde expansion on a machine running NIS?
|
||||
|
||||
This is a famous and long-standing bug in the SunOS YP (sorry, NIS)
|
||||
|
|
@ -1077,7 +1133,7 @@ times; that's probably why this has never been fixed. You can
|
|||
run configure with the `--without-gnu-malloc' option to use
|
||||
the C library malloc and avoid the problem.
|
||||
|
||||
35) I'm running SVR4.2. Why is the line erased every time I type `@'?
|
||||
F4) I'm running SVR4.2. Why is the line erased every time I type `@'?
|
||||
|
||||
The `@' character is the default `line kill' character in most
|
||||
versions of System V, including SVR4.2. You can change this
|
||||
|
|
@ -1088,7 +1144,7 @@ change the line kill character to control-u, type
|
|||
|
||||
where the `^' and `U' can be two separate characters.
|
||||
|
||||
36) Why does bash report syntax errors when my C News scripts use a
|
||||
F5) Why does bash report syntax errors when my C News scripts use a
|
||||
redirection before a subshell command?
|
||||
|
||||
The actual command in question is something like
|
||||
|
|
@ -1100,7 +1156,7 @@ is, in fact, a syntax error. Redirections may only precede `simple
|
|||
commands'. A subshell construct such as the above is one of the shell's
|
||||
`compound commands'. A redirection may only follow a compound command.
|
||||
|
||||
The file CWRU/sh-redir-hack in the bash-2.02 distribution is an
|
||||
The file CWRU/sh-redir-hack in the bash-2.03 distribution is an
|
||||
(unofficial) patch to parse.y that will modify the grammar to
|
||||
support this construct. It will not apply with `patch'; you must
|
||||
modify parse.y by hand. Note that if you apply this, you must
|
||||
|
|
@ -1109,7 +1165,7 @@ number of reduce/reduce conflicts into the shell grammar.
|
|||
|
||||
Section G: Where do I go from here?
|
||||
|
||||
37) How do I report bugs in bash, and where should I look for fixes and
|
||||
G1) How do I report bugs in bash, and where should I look for fixes and
|
||||
advice?
|
||||
|
||||
Use the `bashbug' script to report bugs. It is built and
|
||||
|
|
@ -1117,7 +1173,7 @@ installed at the same time as bash. It provides a standard
|
|||
template for reporting a problem and automatically includes
|
||||
information about your configuration and build environment.
|
||||
|
||||
`bashbug' sends its reports to bug-bash@prep.ai.mit.edu, which
|
||||
`bashbug' sends its reports to bug-bash@gnu.org, which
|
||||
is a large mailing list gatewayed to the usenet newsgroup gnu.bash.bug.
|
||||
|
||||
Bug fixes, answers to questions, and announcements of new releases
|
||||
|
|
@ -1125,24 +1181,23 @@ are all posted to gnu.bash.bug. Discussions concerning bash features
|
|||
and problems also take place there.
|
||||
|
||||
To reach the bash maintainers directly, send mail to
|
||||
bash-maintainers@prep.ai.mit.edu.
|
||||
bash-maintainers@gnu.org.
|
||||
|
||||
38) What kind of bash documentation is there?
|
||||
G2) What kind of bash documentation is there?
|
||||
|
||||
First, look in the doc directory in the bash distribution. It should
|
||||
contain at least the following files:
|
||||
|
||||
bash.1 an extensive, thorough Unix-style manual page
|
||||
builtins.1 a manual page covering just bash builtin commands
|
||||
bashref.texi a reference manual in GNU info format
|
||||
bash.html an HTML version of the manual page
|
||||
bashref.html an HTML version of the reference manual
|
||||
bashref.texi a reference manual in GNU tex`info format
|
||||
bashref.info an info version of the reference manual
|
||||
FAQ this file
|
||||
article.ms text of an article written for The Linux Journal
|
||||
readline.3 a man page describing readline
|
||||
|
||||
Postscript files created from the above source are available in
|
||||
the documentation distribution.
|
||||
Postscript, HTML, and ASCII files created from the above source are
|
||||
available in the documentation distribution.
|
||||
|
||||
There is additional documentation available for anonymous FTP from host
|
||||
ftp.cwru.edu in the `pub/bash' directory.
|
||||
|
|
@ -1158,14 +1213,14 @@ A second edition of this book is available, published in January, 1998.
|
|||
The ISBN number is 1-56592-347-2. Look for it in the same fine bookstores
|
||||
or on the web.
|
||||
|
||||
39) What's coming in future versions?
|
||||
G3) What's coming in future versions?
|
||||
|
||||
These are features I plan to include in a future version of bash.
|
||||
|
||||
a bash debugger (a minimally-tested version is included with bash-2.02)
|
||||
Programmable completion a la zsh
|
||||
Programmable completion a la zsh/tcsh
|
||||
|
||||
40) What's on the bash `wish list' for future versions?
|
||||
G4) What's on the bash `wish list' for future versions?
|
||||
|
||||
These are features that may or may not appear in a future version of bash.
|
||||
|
||||
|
|
@ -1177,14 +1232,17 @@ timeouts for the `read' builtin
|
|||
the ksh-93 ${!prefix*} and ${!prefix@} operators
|
||||
arithmetic ++ and -- prefix and postfix operators
|
||||
date-stamped command history
|
||||
a way to bind readline editing key sequences to shell commands
|
||||
a mechanism to open network connections and assign them to file descriptors
|
||||
using redirection (like ksh /dev/{tcp,udp})
|
||||
|
||||
41) When will the next release appear?
|
||||
G5) When will the next release appear?
|
||||
|
||||
The next version will appear sometime in 1998. Never make
|
||||
The next version will appear sometime in 1999. Never make
|
||||
predictions.
|
||||
|
||||
|
||||
This document is Copyright 1995, 1996, 1998 by Chester Ramey.
|
||||
This document is Copyright 1995-1999 by Chester Ramey.
|
||||
|
||||
Permission is hereby granted, without written agreement and
|
||||
without license or royalty fees, to use, copy, and distribute
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ have access to all of the shell facilities.
|
|||
|
||||
Help
|
||||
|
||||
Bash includes a built-in help factility.
|
||||
Bash includes a built-in help facility.
|
||||
|
||||
Shell Optional Behavior
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
# This Makefile is for the Bash/documentation directory -*- text -*-.
|
||||
#
|
||||
SHELL = @MAKE_SHELL@
|
||||
RM = rm -f
|
||||
|
||||
topdir = @top_srcdir@
|
||||
|
|
@ -84,11 +85,17 @@ RLUSER = $(RL_LIBDIR)/doc/rluser.texinfo
|
|||
all: ps info dvi text html
|
||||
nodvi: ps info text html
|
||||
|
||||
ps: bash.ps bashbug.ps readline.ps article.ps builtins.ps
|
||||
dvi: bashref.dvi bashref.ps
|
||||
info: bashref.info
|
||||
text: bash.0 bashbug.0 builtins.0 readline.0
|
||||
html: bashref.html bash.html
|
||||
PSFILES = bash.ps bashbug.ps readline.ps article.ps builtins.ps
|
||||
DVIFILES = bashref.dvi bashref.ps
|
||||
INFOFILES = bashref.info
|
||||
MAN0FILES = bash.0 bashbug.0 builtins.0 readline.0
|
||||
HTMLFILES = bashref.html bash.html
|
||||
|
||||
ps: ${PSFILES}
|
||||
dvi: ${DVIFILES}
|
||||
info: ${INFOFILES}
|
||||
text: ${MAN0FILES}
|
||||
html: ${HTMLFILES}
|
||||
|
||||
bashref.dvi: $(srcdir)/bashref.texi $(HSUSER) $(RLUSER)
|
||||
TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/bashref.texi
|
||||
|
|
@ -101,7 +108,7 @@ bashref.info: $(srcdir)/bashref.texi $(HSUSER) $(RLUSER)
|
|||
$(MAKEINFO) --no-split -I$(TEXINPUTDIR) $(srcdir)/bashref.texi
|
||||
|
||||
bashref.html: bashref.texi $(HSUSER) $(RLUSER)
|
||||
$(TEXI2HTML) -I $(TEXINPUTDIR) $(srcdir)/bashref.texi
|
||||
$(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/bashref.texi
|
||||
|
||||
bash.dvi: bash.texinfo $(HSUSER) $(RLUSER)
|
||||
TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) bash.texinfo
|
||||
|
|
@ -125,7 +132,9 @@ article.ps: article.ms
|
|||
$(MAN2HTML): ${topdir}/support/man2html.c
|
||||
-( cd ${BUILD_DIR}/support ; ${MAKE} ${MFLAGS} man2html)
|
||||
|
||||
faq: faq.news faq.news2 faq.mail faq.version
|
||||
CREATED_FAQ = faq.news faq.news2 faq.mail faq.version
|
||||
|
||||
faq: ${CREATED_FAQ}
|
||||
|
||||
faq.version: FAQ.version FAQ
|
||||
sh mkfaqvers FAQ.version > $@
|
||||
|
|
@ -143,15 +152,16 @@ faq.mail: FAQ FAQ.headers.mail faq.version
|
|||
cat FAQ.headers.mail faq.version FAQ > $@
|
||||
|
||||
clean:
|
||||
$(RM) *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps \
|
||||
*.pgs *.bt *.bts *.rw *.rws *.fns *.kys *.tps *.vrs *.o \
|
||||
core rluser.texinfo hsuser.texinfo
|
||||
$(RM) *.aux *.bak *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps \
|
||||
*.pgs *.bt *.bts *.rw *.rws *.fns *.kys *.tps *.vrs *.o
|
||||
${RM} core *.core
|
||||
|
||||
distclean mostlyclean: clean
|
||||
$(RM) Makefile
|
||||
|
||||
maintainer-clean: clean
|
||||
$(RM) *.0 *.ps *.dvi *.info *.txt
|
||||
${RM} ${PSFILES} ${DVIFILES} ${INFOFILES} ${MAN0FILES} ${HTMLFILES}
|
||||
${RM} ${CREATED_FAQ}
|
||||
$(RM) Makefile
|
||||
|
||||
installdirs:
|
||||
|
|
@ -166,7 +176,7 @@ install: info installdirs
|
|||
# uncomment the next line to install the readline man page
|
||||
# -$(INSTALL_DATA) $(srcdir)/readline.3 $(man3dir)/readline.${man3ext}
|
||||
# uncomment the next line to install the builtins man page
|
||||
# $(INSTALL_DATA) builtins.1 $(man1dir)/bash_builtins.${man1ext}
|
||||
# $(INSTALL_DATA) $(srcdir)/builtins.1 $(man1dir)/bash_builtins.${man1ext}
|
||||
-$(INSTALL_DATA) $(srcdir)/bashref.info $(infodir)/bash.info
|
||||
# run install-info if it is present to update the info directory
|
||||
if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
This directory contains the bash documentation.
|
||||
|
||||
FAQ - a set of frequently-asked questions about Bash with answers
|
||||
INTRO - a short introduction to bash
|
||||
article.ms - an article I wrote about bash for The Linux Journal
|
||||
bash.1 - the bash man page
|
||||
builtins.1 - a man page that documents the builtins, extracted from bash.1
|
||||
features.texi - the `bash reference manual'
|
||||
features.info - the `bash reference manual' processed by `makeinfo'
|
||||
bashref.texi - the `bash reference manual'
|
||||
bashref.info - the `bash reference manual' processed by `makeinfo'
|
||||
readline.3 - the readline man page
|
||||
|
||||
The `.ps' files are postscript versions of the above. The `.html'
|
||||
|
|
|
|||
102
doc/bash.1
102
doc/bash.1
|
|
@ -6,11 +6,11 @@
|
|||
.\" Case Western Reserve University
|
||||
.\" chet@ins.CWRU.Edu
|
||||
.\"
|
||||
.\" Last Change: Wed Apr 1 12:16:09 EST 1998
|
||||
.\" Last Change: Wed Jan 20 16:47:14 EST 1999
|
||||
.\"
|
||||
.\" bash_builtins, strip all but Built-Ins section
|
||||
.if \n(zZ=1 .ig zZ
|
||||
.TH BASH 1 "1998 Apr 1" GNU
|
||||
.TH BASH 1 "1999 Jan 20" GNU
|
||||
.\"
|
||||
.\" There's some problem with having a `@'
|
||||
.\" in a tagged paragraph with the BSD man macros.
|
||||
|
|
@ -50,8 +50,8 @@ bash \- GNU Bourne-Again SHell
|
|||
[options]
|
||||
[file]
|
||||
.SH COPYRIGHT
|
||||
.if n Bash is Copyright (C) 1989, 1991, 1993, 1995, 1996 by the Free Software Foundation, Inc.
|
||||
.if t Bash is Copyright \(co 1989, 1991, 1993, 1995, 1996 by the Free Software Foundation, Inc.
|
||||
.if n Bash is Copyright (C) 1989-1999 by the Free Software Foundation, Inc.
|
||||
.if t Bash is Copyright \(co 1989-1999 by the Free Software Foundation, Inc.
|
||||
.SH DESCRIPTION
|
||||
.B Bash
|
||||
is an \fBsh\fR-compatible command language interpreter that
|
||||
|
|
@ -260,7 +260,8 @@ section.
|
|||
.PP
|
||||
When
|
||||
.B bash
|
||||
is invoked as an interactive login shell, it first reads and
|
||||
is invoked as an interactive login shell, or as a non-interactive shell
|
||||
with the \fB\-\-login\fP option, it first reads and
|
||||
executes commands from the file \fI/etc/profile\fP, if that
|
||||
file exists.
|
||||
After reading that file, it looks for \fI~/.bash_profile\fP,
|
||||
|
|
@ -313,7 +314,8 @@ it tries to mimic the startup behavior of historical versions of
|
|||
.B sh
|
||||
as closely as possible,
|
||||
while conforming to the POSIX standard as well.
|
||||
When invoked as an interactive login shell, it first attempts to
|
||||
When invoked as an interactive login shell, or a non-interactive
|
||||
shell with the \fB\-\-login\fP option, it first attempts to
|
||||
read and execute commands from
|
||||
.I /etc/profile
|
||||
and
|
||||
|
|
@ -338,7 +340,7 @@ files, the
|
|||
option has no effect.
|
||||
A non-interactive shell invoked with the name
|
||||
.B sh
|
||||
does not attempt to read any startup files.
|
||||
does not attempt to read any other startup files.
|
||||
When invoked as
|
||||
.BR sh ,
|
||||
.B bash
|
||||
|
|
@ -375,6 +377,14 @@ option may be used to inhibit this behavior, and the
|
|||
option may be used to force another file to be read, but
|
||||
\fIrshd\fP does not generally invoke the shell with those options
|
||||
or allow them to be specified.
|
||||
.PP
|
||||
If the shell is started with the effective user (group) id not equal to the
|
||||
real user (group) id, and the \fB\-p\fP option is not supplied, no startup
|
||||
files are read, shell functions are not inherited from the environment,
|
||||
the \fBSHELLOPTS\fP variable, if it appears in the environment, is ignored,
|
||||
and the effective user id is set to the real user id.
|
||||
If the \fB\-p\fP option is supplied at invocation, the startup behavior is
|
||||
the same, but the effective user id is not reset.
|
||||
.SH DEFINITIONS
|
||||
.PP
|
||||
The following definitions are used throughout the rest of this
|
||||
|
|
@ -646,7 +656,7 @@ operators do not execute \fIexpression2\fP if the value of
|
|||
\fIexpression1\fP is sufficient to determine the return value of
|
||||
the entire conditional expression.
|
||||
.TP
|
||||
\fBfor\fP \fIname\fP [ \fBin\fP \fIword\fP; ] \fBdo\fP \fIlist\fP ; \fBdone\fP
|
||||
\fBfor\fP \fIname\fP [ \fBin\fP \fIword\fP ] ; \fBdo\fP \fIlist\fP ; \fBdone\fP
|
||||
The list of words following \fBin\fP is expanded, generating a list
|
||||
of items. The variable \fIname\fP is set to each element of this list
|
||||
in turn, and \fIlist\fP is executed each time. If the \fBin\fP
|
||||
|
|
@ -659,7 +669,7 @@ The return status is the exit status of the last command that executes.
|
|||
If the expansion of the items following \fBin\fP results in an empty
|
||||
list, no commands are executed, and the return status is 0.
|
||||
.TP
|
||||
\fBselect\fP \fIname\fP [ \fBin\fP \fIword\fP; ] \fBdo\fP \fIlist\fP ; \fBdone\fP
|
||||
\fBselect\fP \fIname\fP [ \fBin\fP \fIword\fP ] ; \fBdo\fP \fIlist\fP ; \fBdone\fP
|
||||
The list of words following \fBin\fP is expanded, generating a list
|
||||
of items. The set of expanded words is printed on the standard
|
||||
error, each preceded by a number. If the \fBin\fP
|
||||
|
|
@ -2095,9 +2105,9 @@ In the first form, only the first match is replaced.
|
|||
The second form causes all matches of \fIpattern\fP to be
|
||||
replaced with \fIstring\fP.
|
||||
If \fIpattern\fP begins with \fB#\fP, it must match at the beginning
|
||||
of \fIstring\fP.
|
||||
of the expanded value of \fIparameter\fP.
|
||||
If \fIpattern\fP begins with \fB%\fP, it must match at the end
|
||||
of \fIstring\fP.
|
||||
of the expanded value of \fIparameter\fP.
|
||||
If \fIstring\fP is null, matches of \fIpattern\fP are deleted
|
||||
and the \fB/\fP following \fIpattern\fP may be omitted.
|
||||
If
|
||||
|
|
@ -2985,6 +2995,9 @@ True if \fIfile\fP exists and is a regular file.
|
|||
.B \-g \fIfile\fP
|
||||
True if \fIfile\fP exists and is set-group-id.
|
||||
.TP
|
||||
.B \-h \fIfile\fP
|
||||
True if \fIfile\fP exists and is a symbolic link.
|
||||
.TP
|
||||
.B \-k \fIfile\fP
|
||||
True if \fIfile\fP exists and its ``sticky'' bit is set.
|
||||
.TP
|
||||
|
|
@ -4032,6 +4045,12 @@ regardless of what the terminal claims it can support. The name
|
|||
.B meta\-flag
|
||||
is a synonym for this variable.
|
||||
.TP
|
||||
.B isearch\-terminators (``C\-[C\-J'')
|
||||
The string of characters that should terminate an incremental
|
||||
search without subsequently executing the character as a command.
|
||||
If this variable has not been given a value, the characters
|
||||
\fIESC\fP and \fIC\-J\fP will terminate an incremental search.
|
||||
.TP
|
||||
.B keymap (emacs)
|
||||
Set the current readline keymap. The set of valid keymap names is
|
||||
\fIemacs, emacs\-standard, emacs\-meta, emacs\-ctlx, vi,
|
||||
|
|
@ -4159,8 +4178,10 @@ As each character of the search string is typed, readline displays
|
|||
the next entry from the history matching the string typed so far.
|
||||
An incremental search requires only as many characters as needed to
|
||||
find the desired history entry.
|
||||
The Escape character is used to terminate an incremental search.
|
||||
Control-J will also terminate the search.
|
||||
The characters present in the value of the \fIisearch-terminators\fP
|
||||
variable are used to terminate an incremental search.
|
||||
If that variable has not been assigned a value the Escape and
|
||||
Control-J characters will terminate an incremental search.
|
||||
Control-G will abort an incremental search and restore the original
|
||||
line.
|
||||
When the search is terminated, the history entry containing the
|
||||
|
|
@ -4341,6 +4362,11 @@ then return
|
|||
Delete the character behind the cursor. When given a numeric argument,
|
||||
save the deleted text on the kill ring.
|
||||
.TP
|
||||
.B forward\-backward\-delete\-char
|
||||
Delete the character under the cursor, unless the cursor is at the
|
||||
end of the line, in which case the character behind the cursor is
|
||||
deleted. By default, this is not bound to a key.
|
||||
.TP
|
||||
.B quoted\-insert (C\-q, C\-v)
|
||||
Add the next character typed to the line verbatim. This is
|
||||
how to insert characters like \fBC\-q\fP, for example.
|
||||
|
|
@ -4487,6 +4513,13 @@ through the list.
|
|||
This command is intended to be bound to \fBTAB\fP, but is unbound
|
||||
by default.
|
||||
.TP
|
||||
.B delete\-char\-or\-list
|
||||
Deletes the character under the cursor if not at the beginning or
|
||||
end of the line (like \fBdelete-char\fP).
|
||||
If at the end of the line, behaves identically to
|
||||
\fBpossible-completions\fP.
|
||||
This command is unbound by default.
|
||||
.TP
|
||||
.B complete\-filename (M\-/)
|
||||
Attempt filename completion on the text before point.
|
||||
.TP
|
||||
|
|
@ -4588,7 +4621,7 @@ Undo all changes made to this line. This is like executing the
|
|||
.B undo
|
||||
command enough times to return the line to its initial state.
|
||||
.TP
|
||||
.B tilde\-expand (M\-~)
|
||||
.B tilde\-expand (M\-&)
|
||||
Perform tilde expansion on the current word.
|
||||
.TP
|
||||
.B set\-mark (C\-@, M\-<space>)
|
||||
|
|
@ -6210,13 +6243,17 @@ The characters in
|
|||
.SM
|
||||
.B IFS
|
||||
are used to split the line into words.
|
||||
The backslash character (\fB\e\fP) may be used to remove any special
|
||||
meaning for the next character read and for line continuation.
|
||||
Options, if supplied, have the following meanings:
|
||||
.RS
|
||||
.PD 0
|
||||
.TP
|
||||
.B \-r
|
||||
A backslash-newline pair is not ignored, and
|
||||
the backslash is considered to be part of the line.
|
||||
Backslash does not act as an escape character.
|
||||
The backslash is considered to be part of the line.
|
||||
In particular, a backslash-newline pair may not be used as a line
|
||||
continuation.
|
||||
.TP
|
||||
.B \-p
|
||||
Display \fIprompt\fP, without a
|
||||
|
|
@ -6487,11 +6524,16 @@ Turn on
|
|||
.I privileged
|
||||
mode. In this mode, the
|
||||
.B $ENV
|
||||
file is not processed, shell functions are not inherited from the
|
||||
environment, and the variable
|
||||
The \fBSHELLOPTS\fP variable, if it appears in the environment, is ignored.
|
||||
This is enabled automatically on startup if the effective user (group)
|
||||
id is not equal to the real user (group) id.
|
||||
and
|
||||
.B $BASH_ENV
|
||||
files are not processed, shell functions are not inherited from the
|
||||
environment, and the \fBSHELLOPTS\fP variable, if it appears in the
|
||||
environment, is ignored.
|
||||
If the shell is started with the effective user (group) id not equal to the
|
||||
real user (group) id, and the \fB\-p\fP option is not supplied, these actions
|
||||
are taken and the effective user id is set to the real user id.
|
||||
If the \fB\-p\fP option is supplied at startup, the effective user id is
|
||||
not reset.
|
||||
Turning this option off causes the effective user
|
||||
and group ids to be set to the real user and group ids.
|
||||
.TP 8
|
||||
|
|
@ -6794,6 +6836,15 @@ being expanded as described in
|
|||
.B PROMPTING
|
||||
above. This option is enabled by default.
|
||||
.TP 8
|
||||
.B restricted_shell
|
||||
The shell sets this option if it is started in restricted mode (see
|
||||
.SM
|
||||
.B "RESTRICTED SHELL"
|
||||
below).
|
||||
The value may not be changed.
|
||||
This is not reset when the startup files are executed, allowing
|
||||
the startup files to discover whether or not a shell is restricted.
|
||||
.TP 8
|
||||
.B shift_verbose
|
||||
If set, the
|
||||
.B shift
|
||||
|
|
@ -7232,9 +7283,11 @@ with the exception that the following are disallowed or not performed:
|
|||
changing directories with \fBcd\fP
|
||||
.IP \(bu
|
||||
setting or unsetting the values of
|
||||
.B SHELL
|
||||
.BR SHELL ,
|
||||
.BR PATH ,
|
||||
.BR ENV ,
|
||||
or
|
||||
.B PATH
|
||||
.B BASH_ENV
|
||||
.IP \(bu
|
||||
specifying command names containing
|
||||
.B /
|
||||
|
|
@ -7313,6 +7366,9 @@ The personal initialization file, executed for login shells
|
|||
.FN ~/.bashrc
|
||||
The individual per-interactive-shell startup file
|
||||
.TP
|
||||
.FN ~/.bash_logout
|
||||
The individual login shell cleanup file, executed when a login shell exits
|
||||
.TP
|
||||
.FN ~/.inputrc
|
||||
Individual \fIreadline\fP initialization file
|
||||
.PD
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
.TH BASHBUG 1 "1995 August 10" GNU
|
||||
.TH BASHBUG 1 "1998 July 30" GNU
|
||||
.SH NAME
|
||||
bashbug \- report a bug in bash
|
||||
.SH SYNOPSIS
|
||||
|
|
@ -14,7 +14,7 @@ invokes the editor specified by the environment variable
|
|||
on a temporary copy of the bug report format outline. The user must
|
||||
fill in the appropriate fields and exit the editor.
|
||||
.B bashbug
|
||||
then mails the completed report to \fIbug-bash@prep.ai.mit.edu\fP, or
|
||||
then mails the completed report to \fIbug-bash@gnu.org\fP, or
|
||||
\fIaddress\fP. If the report cannot be mailed, it is saved in the
|
||||
file \fIdead.bashbug\fP in the invoking user's home directory.
|
||||
.PP
|
||||
|
|
|
|||
402
doc/bashref.info
402
doc/bashref.info
|
|
@ -9,11 +9,11 @@ END-INFO-DIR-ENTRY
|
|||
This text is a brief description of the features that are present in
|
||||
the Bash shell.
|
||||
|
||||
This is Edition 2.2, last updated 1 April 1998,
|
||||
This is Edition 2.3, last updated 20 January 1999,
|
||||
of `The GNU Bash Reference Manual',
|
||||
for `Bash', Version 2.02.
|
||||
for `Bash', Version 2.03.
|
||||
|
||||
Copyright (C) 1991, 1993, 1996, 1997 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991-1999 Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
|
|
@ -38,8 +38,8 @@ Bash Features
|
|||
This text is a brief description of the features that are present in
|
||||
the Bash shell.
|
||||
|
||||
This is Edition 2.2, last updated 1 April 1998, of `The GNU Bash
|
||||
Reference Manual', for `Bash', Version 2.02.
|
||||
This is Edition 2.3, last updated 20 January 1999, of `The GNU Bash
|
||||
Reference Manual', for `Bash', Version 2.03.
|
||||
|
||||
Copyright (C) 1991, 1993, 1996 Free Software Foundation, Inc.
|
||||
|
||||
|
|
@ -1232,15 +1232,16 @@ parameter that is unset.
|
|||
against its value is replaced with STRING. In the first form,
|
||||
only the first match is replaced. The second form causes all
|
||||
matches of PATTERN to be replaced with STRING. If PATTERN begins
|
||||
with `#', it must match at the beginning of STRING. If PATTERN
|
||||
begins with `%', it must match at the end of STRING. If STRING is
|
||||
null, matches of PATTERN are deleted and the `/' following PATTERN
|
||||
may be omitted. If PARAMETER is `@' or `*', the substitution
|
||||
operation is applied to each positional parameter in turn, and the
|
||||
expansion is the resultant list. If PARAMETER is an array
|
||||
variable subscripted with `@' or `*', the substitution operation
|
||||
is applied to each member of the array in turn, and the expansion
|
||||
is the resultant list.
|
||||
with `#', it must match at the beginning of the expanded value of
|
||||
PARAMETER. If PATTERN begins with `%', it must match at the end
|
||||
of the expanded value of PARAMETER. If STRING is null, matches of
|
||||
PATTERN are deleted and the `/' following PATTERN may be omitted.
|
||||
If PARAMETER is `@' or `*', the substitution operation is applied
|
||||
to each positional parameter in turn, and the expansion is the
|
||||
resultant list. If PARAMETER is an array variable subscripted
|
||||
with `@' or `*', the substitution operation is applied to each
|
||||
member of the array in turn, and the expansion is the resultant
|
||||
list.
|
||||
|
||||
|
||||
File: bashref.info, Node: Command Substitution, Next: Arithmetic Expansion, Prev: Shell Parameter Expansion, Up: Shell Expansions
|
||||
|
|
@ -1982,14 +1983,16 @@ standard.
|
|||
The return status is zero.
|
||||
|
||||
`.'
|
||||
. FILENAME
|
||||
. FILENAME [ARGUMENTS]
|
||||
Read and execute commands from the FILENAME argument in the
|
||||
current shell context. If FILENAME does not contain a slash, the
|
||||
`$PATH' variable is used to find FILENAME. The current directory
|
||||
is searched if FILENAME is not found in `$PATH'. The return
|
||||
status is the exit status of the last command executed, or zero if
|
||||
no commands are executed. If FILENAME is not found, or cannot be
|
||||
read, the return status is non-zero.
|
||||
is searched if FILENAME is not found in `$PATH'. If any ARGUMENTS
|
||||
are supplied, they become the positional parameters when FILENAME
|
||||
is executed. Otherwise the positional parameters are unchanged.
|
||||
The return status is the exit status of the last command executed,
|
||||
or zero if no commands are executed. If FILENAME is not found, or
|
||||
cannot be read, the return status is non-zero.
|
||||
|
||||
`break'
|
||||
break [N]
|
||||
|
|
@ -2762,8 +2765,9 @@ of the files exist but cannot be read, Bash reports an error. Tildes
|
|||
are expanded in file names as described above under Tilde Expansion
|
||||
(*note Tilde Expansion::.).
|
||||
|
||||
When Bash is invoked as an interactive login shell, it first reads
|
||||
and executes commands from the file `/etc/profile', if that file exists.
|
||||
When Bash is invoked as an interactive login shell, or as a
|
||||
non-interactive shell with the `--login' option, it first reads and
|
||||
executes commands from the file `/etc/profile', if that file exists.
|
||||
After reading that file, it looks for `~/.bash_profile',
|
||||
`~/.bash_login', and `~/.profile', in that order, and reads and
|
||||
executes commands from the first one that exists and is readable. The
|
||||
|
|
@ -2798,16 +2802,17 @@ name.
|
|||
behavior of historical versions of `sh' as closely as possible, while
|
||||
conforming to the POSIX standard as well.
|
||||
|
||||
When invoked as an interactive login shell, it first attempts to read
|
||||
and execute commands from `/etc/profile' and `~/.profile', in that
|
||||
order. The `--noprofile' option may be used to inhibit this behavior.
|
||||
When invoked as an interactive shell with the name `sh', Bash looks for
|
||||
the variable `ENV', expands its value if it is defined, and uses the
|
||||
When invoked as an interactive login shell, or as a non-interactive
|
||||
shell with the `--login' option, it first attempts to read and execute
|
||||
commands from `/etc/profile' and `~/.profile', in that order. The
|
||||
`--noprofile' option may be used to inhibit this behavior. When
|
||||
invoked as an interactive shell with the name `sh', Bash looks for the
|
||||
variable `ENV', expands its value if it is defined, and uses the
|
||||
expanded value as the name of a file to read and execute. Since a
|
||||
shell invoked as `sh' does not attempt to read and execute commands
|
||||
from any other startup files, the `--rcfile' option has no effect. A
|
||||
non-interactive shell invoked with the name `sh' does not attempt to
|
||||
read any startup files.
|
||||
read any other startup files.
|
||||
|
||||
When invoked as `sh', Bash enters POSIX mode after the startup files
|
||||
are read.
|
||||
|
|
@ -2827,6 +2832,14 @@ may be used to force another file to be read, but `rshd' does not
|
|||
generally invoke the shell with those options or allow them to be
|
||||
specified.
|
||||
|
||||
If Bash is started with the effective user (group) id not equal to
|
||||
the real user (group) id, and the `-p' option is not supplied, no
|
||||
startup files are read, shell functions are not inherited from the
|
||||
environment, the `SHELLOPTS' variable, if it appears in the
|
||||
environment, is ignored, and the effective user id is set to the real
|
||||
user id. If the `-p' option is supplied at invocation, the startup
|
||||
behavior is the same, but the effective user id is not reset.
|
||||
|
||||
|
||||
File: bashref.info, Node: Is This Shell Interactive?, Next: Bash Builtins, Prev: Bash Startup Files, Up: Bash Features
|
||||
|
||||
|
|
@ -3126,15 +3139,18 @@ been extended in Bash.
|
|||
assigned to the last NAME. If there are fewer words read from the
|
||||
standard input than names, the remaining names are assigned empty
|
||||
values. The characters in the value of the `IFS' variable are
|
||||
used to split the line into words. If no names are supplied, the
|
||||
used to split the line into words. The backslash character `\'
|
||||
may be used to remove any special meaning for the next character
|
||||
read and for line continuation. If no names are supplied, the
|
||||
line read is assigned to the variable `REPLY'. The return code is
|
||||
zero, unless end-of-file is encountered. Options, if supplied,
|
||||
have the following meanings:
|
||||
|
||||
`-r'
|
||||
If this option is given, a backslash-newline pair is not
|
||||
ignored, and the backslash is considered to be part of the
|
||||
line.
|
||||
If this option is given, backslash does not act as an escape
|
||||
character. The backslash is considered to be part of the
|
||||
line. In particular, a backslash-newline pair may not be
|
||||
used as a line continuation.
|
||||
|
||||
`-p PROMPT'
|
||||
Display PROMPT, without a trailing newline, before attempting
|
||||
|
|
@ -3287,6 +3303,13 @@ been extended in Bash.
|
|||
expansion after being expanded (*note Printing a Prompt::.).
|
||||
This option is enabled by default.
|
||||
|
||||
`restricted_shell'
|
||||
The shell sets this option if it is started in restricted mode
|
||||
(*note The Restricted Shell::.). The value may not be
|
||||
changed. This is not reset when the startup files are
|
||||
executed, allowing the startup files to discover whether or
|
||||
not a shell is restricted.
|
||||
|
||||
`shift_verbose'
|
||||
If this is set, the `shift' builtin prints an error message
|
||||
when the shift count exceeds the number of positional
|
||||
|
|
@ -3527,11 +3550,14 @@ The Set Builtin
|
|||
Turn on privileged mode. In this mode, the `$BASH_ENV' and
|
||||
`$ENV' files are not processed, shell functions are not
|
||||
inherited from the environment, and the `SHELLOPTS' variable,
|
||||
if it appears in the environment, is ignored. This is
|
||||
enabled automatically on startup if the effective user
|
||||
(group) id is not equal to the real user (group) id. Turning
|
||||
this option off causes the effective user and group ids to be
|
||||
set to the real user and group ids.
|
||||
if it appears in the environment, is ignored. If the shell
|
||||
is started with the effective user (group) id not equal to the
|
||||
real user (group) id, and the `-p' option is not supplied,
|
||||
these actions are taken and the effective user id is set to
|
||||
the real user id. If the `-p' option is supplied at startup,
|
||||
the effective user id is not reset. Turning this option off
|
||||
causes the effective user and group ids to be set to the real
|
||||
user and group ids.
|
||||
|
||||
`-t'
|
||||
Exit after reading and executing one command.
|
||||
|
|
@ -3640,6 +3666,9 @@ checked.
|
|||
`-g FILE'
|
||||
True if FILE exists and its set-group-id bit is set.
|
||||
|
||||
`-h FILE'
|
||||
True if FILE exists and is a symbolic link.
|
||||
|
||||
`-k FILE'
|
||||
True if FILE exists and its "sticky" bit is set.
|
||||
|
||||
|
|
@ -4450,7 +4479,8 @@ the standard shell. A restricted shell behaves identically to `bash'
|
|||
with the exception that the following are disallowed:
|
||||
* Changing directories with the `cd' builtin.
|
||||
|
||||
* Setting or unsetting the values of the `SHELL' or `PATH' variables.
|
||||
* Setting or unsetting the values of the `SHELL', `PATH', `ENV', or
|
||||
`BASH_ENV' variables.
|
||||
|
||||
* Specifying command names containing slashes.
|
||||
|
||||
|
|
@ -5346,18 +5376,19 @@ string. There are two search modes: INCREMENTAL and NON-INCREMENTAL.
|
|||
search string. As each character of the search string is typed,
|
||||
Readline displays the next entry from the history matching the string
|
||||
typed so far. An incremental search requires only as many characters
|
||||
as needed to find the desired history entry. The <ESC> character is
|
||||
used to terminate an incremental search. <C-j> will also terminate the
|
||||
search. <C-g> will abort an incremental search and restore the
|
||||
original line. When the search is terminated, the history entry
|
||||
containing the search string becomes the current line. To find other
|
||||
matching entries in the history list, type <C-s> or <C-r> as
|
||||
appropriate. This will search backward or forward in the history for
|
||||
the next entry matching the search string typed so far. Any other key
|
||||
sequence bound to a Readline command will terminate the search and
|
||||
execute that command. For instance, a <RET> will terminate the search
|
||||
and accept the line, thereby executing the command from the history
|
||||
list.
|
||||
as needed to find the desired history entry. The characters present in
|
||||
the value of the ISEARCH-TERMINATORS variable are used to terminate an
|
||||
incremental search. If that variable has not been assigned a value,
|
||||
the <ESC> and <C-J> characters will terminate an incremental search.
|
||||
<C-g> will abort an incremental search and restore the original line.
|
||||
When the search is terminated, the history entry containing the search
|
||||
string becomes the current line. To find other matching entries in the
|
||||
history list, type <C-s> or <C-r> as appropriate. This will search
|
||||
backward or forward in the history for the next entry matching the
|
||||
search string typed so far. Any other key sequence bound to a Readline
|
||||
command will terminate the search and execute that command. For
|
||||
instance, a <RET> will terminate the search and accept the line,
|
||||
thereby executing the command from the history list.
|
||||
|
||||
Non-incremental searches read the entire search string before
|
||||
starting to search for matching history lines. The search string may be
|
||||
|
|
@ -5471,6 +5502,20 @@ Variable Settings
|
|||
longer than the width of the screen, instead of wrapping onto
|
||||
a new screen line. By default, this variable is set to `off'.
|
||||
|
||||
`input-meta'
|
||||
If set to `on', Readline will enable eight-bit input (it will
|
||||
not strip the eighth bit from the characters it reads),
|
||||
regardless of what the terminal claims it can support. The
|
||||
default value is `off'. The name `meta-flag' is a synonym
|
||||
for this variable.
|
||||
|
||||
`isearch-terminators'
|
||||
The string of characters that should terminate an incremental
|
||||
search without subsequently executing the character as a
|
||||
command (*note Searching::.). If this variable has not been
|
||||
given a value, the characters <ESC> and <C-J> will terminate
|
||||
an incremental search.
|
||||
|
||||
`keymap'
|
||||
Sets Readline's idea of the current keymap for key binding
|
||||
commands. Acceptable `keymap' names are `emacs',
|
||||
|
|
@ -5489,13 +5534,6 @@ Variable Settings
|
|||
asterisk (`*') at the start of history lines which have been
|
||||
modified. This variable is `off' by default.
|
||||
|
||||
`input-meta'
|
||||
If set to `on', Readline will enable eight-bit input (it will
|
||||
not strip the eighth bit from the characters it reads),
|
||||
regardless of what the terminal claims it can support. The
|
||||
default value is `off'. The name `meta-flag' is a synonym
|
||||
for this variable.
|
||||
|
||||
`output-meta'
|
||||
If set to `on', Readline will display characters with the
|
||||
eighth bit set directly rather than as a meta-prefixed escape
|
||||
|
|
@ -5929,6 +5967,11 @@ Commands For Changing Text
|
|||
Delete the character behind the cursor. A numeric argument means
|
||||
to kill the characters instead of deleting them.
|
||||
|
||||
`forward-backward-delete-char ()'
|
||||
Delete the character under the cursor, unless the cursor is at the
|
||||
end of the line, in which case the character behind the cursor is
|
||||
deleted. By default, this is not bound to a key.
|
||||
|
||||
`quoted-insert (C-q, C-v)'
|
||||
Add the next character typed to the line verbatim. This is how to
|
||||
insert key sequences like <C-q>, for example.
|
||||
|
|
@ -6083,6 +6126,12 @@ Letting Readline Type For You
|
|||
This command is intended to be bound to `TAB', but is unbound by
|
||||
default.
|
||||
|
||||
`delete-char-or-list ()'
|
||||
Deletes the character under the cursor if not at the beginning or
|
||||
end of the line (like `delete-char'). If at the end of the line,
|
||||
behaves identically to `possible-completions'. This command is
|
||||
unbound by default.
|
||||
|
||||
`complete-filename (M-/)'
|
||||
Attempt filename completion on the text before point.
|
||||
|
||||
|
|
@ -6180,7 +6229,7 @@ Some Miscellaneous Commands
|
|||
Undo all changes made to this line. This is like executing the
|
||||
`undo' command enough times to get back to the beginning.
|
||||
|
||||
`tilde-expand (M-~)'
|
||||
`tilde-expand (M-&)'
|
||||
Perform tilde expansion on the current word.
|
||||
|
||||
`set-mark (C-@)'
|
||||
|
|
@ -6562,6 +6611,11 @@ that the Bash `configure' recognizes.
|
|||
for which this should be turned off, and `configure' disables this
|
||||
option automatically for a number of systems.
|
||||
|
||||
`--with-installed-readline'
|
||||
Define this to make bash link with a locally-installed version of
|
||||
Readline rather than the version in lib/readline. This works only
|
||||
with readline 4.0 and later versions.
|
||||
|
||||
`--with-purify'
|
||||
Define this to use the Purify memory allocation checker from Pure
|
||||
Software.
|
||||
|
|
@ -6857,6 +6911,7 @@ Parameter and Variable Index
|
|||
* IGNOREEOF: Bash Variables.
|
||||
* input-meta: Readline Init File Syntax.
|
||||
* INPUTRC: Bash Variables.
|
||||
* isearch-terminators: Readline Init File Syntax.
|
||||
* keymap: Readline Init File Syntax.
|
||||
* LANG: Bash Variables.
|
||||
* LC_ALL: Bash Variables.
|
||||
|
|
@ -6923,6 +6978,7 @@ Function Index
|
|||
* copy-forward-word (): Commands For Killing.
|
||||
* copy-region-as-kill (): Commands For Killing.
|
||||
* delete-char (C-d): Commands For Text.
|
||||
* delete-char-or-list (): Commands For Completion.
|
||||
* delete-horizontal-space (): Commands For Killing.
|
||||
* digit-argument (M-0, M-1, ... M--): Numeric Arguments.
|
||||
* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands.
|
||||
|
|
@ -6934,6 +6990,7 @@ Function Index
|
|||
* end-of-history (M->): Commands For History.
|
||||
* end-of-line (C-e): Commands For Moving.
|
||||
* exchange-point-and-mark (C-x C-x): Miscellaneous Commands.
|
||||
* forward-backward-delete-char (): Commands For Text.
|
||||
* forward-char (C-f): Commands For Moving.
|
||||
* forward-search-history (C-s): Commands For History.
|
||||
* forward-word (M-f): Commands For Moving.
|
||||
|
|
@ -6960,7 +7017,6 @@ Function Index
|
|||
* self-insert (a, b, A, 1, !, ...): Commands For Text.
|
||||
* set-mark (C-@): Miscellaneous Commands.
|
||||
* start-kbd-macro (C-x (): Keyboard Macros.
|
||||
* tilde-expand (M-~): Miscellaneous Commands.
|
||||
* transpose-chars (C-t): Commands For Text.
|
||||
* transpose-words (M-t): Commands For Text.
|
||||
* undo (C-_, C-x C-u): Miscellaneous Commands.
|
||||
|
|
@ -7092,120 +7148,120 @@ Concept Index
|
|||
|
||||
|
||||
Tag Table:
|
||||
Node: Top1197
|
||||
Node: Introduction3153
|
||||
Node: What is Bash?3378
|
||||
Node: What is a shell?4472
|
||||
Node: Definitions6494
|
||||
Node: Basic Shell Features9155
|
||||
Node: Shell Syntax10378
|
||||
Node: Shell Operation10667
|
||||
Node: Quoting11961
|
||||
Node: Escape Character12986
|
||||
Node: Single Quotes13458
|
||||
Node: Double Quotes13787
|
||||
Node: ANSI-C Quoting14685
|
||||
Node: Locale Translation15554
|
||||
Node: Comments15975
|
||||
Node: Shell Commands16589
|
||||
Node: Simple Commands17100
|
||||
Node: Pipelines17659
|
||||
Node: Lists19186
|
||||
Node: Looping Constructs20641
|
||||
Node: Conditional Constructs22246
|
||||
Node: Command Grouping28184
|
||||
Node: Shell Functions29561
|
||||
Node: Shell Parameters31525
|
||||
Node: Positional Parameters32851
|
||||
Node: Special Parameters33600
|
||||
Node: Shell Expansions36221
|
||||
Node: Brace Expansion38144
|
||||
Node: Tilde Expansion39705
|
||||
Node: Shell Parameter Expansion42037
|
||||
Node: Command Substitution48379
|
||||
Node: Arithmetic Expansion49653
|
||||
Node: Process Substitution50498
|
||||
Node: Word Splitting51392
|
||||
Node: Filename Expansion52844
|
||||
Node: Pattern Matching54808
|
||||
Node: Quote Removal57197
|
||||
Node: Redirections57483
|
||||
Node: Executing Commands63553
|
||||
Node: Simple Command Expansion64220
|
||||
Node: Command Search and Execution66143
|
||||
Node: Command Execution Environment68146
|
||||
Node: Environment70600
|
||||
Node: Exit Status72257
|
||||
Node: Signals73454
|
||||
Node: Shell Scripts75349
|
||||
Node: Bourne Shell Features77385
|
||||
Node: Bourne Shell Builtins78115
|
||||
Node: Bourne Shell Variables92056
|
||||
Node: Other Bourne Shell Features93761
|
||||
Node: Major Differences From The Bourne Shell94504
|
||||
Node: Bash Features106693
|
||||
Node: Invoking Bash107796
|
||||
Node: Bash Startup Files111981
|
||||
Node: Is This Shell Interactive?115540
|
||||
Node: Bash Builtins116511
|
||||
Node: The Set Builtin137351
|
||||
Node: Bash Conditional Expressions143960
|
||||
Node: Bash Variables147033
|
||||
Node: Shell Arithmetic159463
|
||||
Node: Aliases161511
|
||||
Node: Alias Builtins164086
|
||||
Node: Arrays164702
|
||||
Node: The Directory Stack167723
|
||||
Node: Printing a Prompt171073
|
||||
Node: The Restricted Shell172736
|
||||
Node: Bash POSIX Mode174072
|
||||
Node: Job Control178233
|
||||
Node: Job Control Basics178699
|
||||
Node: Job Control Builtins182898
|
||||
Node: Job Control Variables187190
|
||||
Node: Using History Interactively188340
|
||||
Node: Bash History Facilities189019
|
||||
Node: Bash History Builtins191360
|
||||
Node: History Interaction194728
|
||||
Node: Event Designators197280
|
||||
Node: Word Designators198207
|
||||
Node: Modifiers199456
|
||||
Node: Command Line Editing200773
|
||||
Node: Introduction and Notation201433
|
||||
Node: Readline Interaction202471
|
||||
Node: Readline Bare Essentials203663
|
||||
Node: Readline Movement Commands205203
|
||||
Node: Readline Killing Commands206168
|
||||
Node: Readline Arguments207883
|
||||
Node: Searching208857
|
||||
Node: Readline Init File210475
|
||||
Node: Readline Init File Syntax211514
|
||||
Node: Conditional Init Constructs220379
|
||||
Node: Sample Init File222817
|
||||
Node: Bindable Readline Commands225986
|
||||
Node: Commands For Moving226736
|
||||
Node: Commands For History227583
|
||||
Node: Commands For Text230412
|
||||
Node: Commands For Killing232146
|
||||
Node: Numeric Arguments234295
|
||||
Node: Commands For Completion235421
|
||||
Node: Keyboard Macros238991
|
||||
Node: Miscellaneous Commands239549
|
||||
Node: Readline vi Mode243869
|
||||
Node: Installing Bash244747
|
||||
Node: Basic Installation245824
|
||||
Node: Compilers and Options248734
|
||||
Node: Compiling For Multiple Architectures249468
|
||||
Node: Installation Names251125
|
||||
Node: Specifying the System Type251850
|
||||
Node: Sharing Defaults252554
|
||||
Node: Operation Controls253219
|
||||
Node: Optional Features254124
|
||||
Node: Reporting Bugs260319
|
||||
Node: Builtin Index261390
|
||||
Node: Reserved Word Index264793
|
||||
Node: Variable Index266251
|
||||
Node: Function Index271456
|
||||
Node: Concept Index275885
|
||||
Node: Top1187
|
||||
Node: Introduction3146
|
||||
Node: What is Bash?3371
|
||||
Node: What is a shell?4465
|
||||
Node: Definitions6487
|
||||
Node: Basic Shell Features9148
|
||||
Node: Shell Syntax10371
|
||||
Node: Shell Operation10660
|
||||
Node: Quoting11954
|
||||
Node: Escape Character12979
|
||||
Node: Single Quotes13451
|
||||
Node: Double Quotes13780
|
||||
Node: ANSI-C Quoting14678
|
||||
Node: Locale Translation15547
|
||||
Node: Comments15968
|
||||
Node: Shell Commands16582
|
||||
Node: Simple Commands17093
|
||||
Node: Pipelines17652
|
||||
Node: Lists19179
|
||||
Node: Looping Constructs20634
|
||||
Node: Conditional Constructs22239
|
||||
Node: Command Grouping28177
|
||||
Node: Shell Functions29554
|
||||
Node: Shell Parameters31518
|
||||
Node: Positional Parameters32844
|
||||
Node: Special Parameters33593
|
||||
Node: Shell Expansions36214
|
||||
Node: Brace Expansion38137
|
||||
Node: Tilde Expansion39698
|
||||
Node: Shell Parameter Expansion42030
|
||||
Node: Command Substitution48426
|
||||
Node: Arithmetic Expansion49700
|
||||
Node: Process Substitution50545
|
||||
Node: Word Splitting51439
|
||||
Node: Filename Expansion52891
|
||||
Node: Pattern Matching54855
|
||||
Node: Quote Removal57244
|
||||
Node: Redirections57530
|
||||
Node: Executing Commands63600
|
||||
Node: Simple Command Expansion64267
|
||||
Node: Command Search and Execution66190
|
||||
Node: Command Execution Environment68193
|
||||
Node: Environment70647
|
||||
Node: Exit Status72304
|
||||
Node: Signals73501
|
||||
Node: Shell Scripts75396
|
||||
Node: Bourne Shell Features77432
|
||||
Node: Bourne Shell Builtins78162
|
||||
Node: Bourne Shell Variables92273
|
||||
Node: Other Bourne Shell Features93978
|
||||
Node: Major Differences From The Bourne Shell94721
|
||||
Node: Bash Features106910
|
||||
Node: Invoking Bash108013
|
||||
Node: Bash Startup Files112198
|
||||
Node: Is This Shell Interactive?116342
|
||||
Node: Bash Builtins117313
|
||||
Node: The Set Builtin138717
|
||||
Node: Bash Conditional Expressions145533
|
||||
Node: Bash Variables148666
|
||||
Node: Shell Arithmetic161096
|
||||
Node: Aliases163144
|
||||
Node: Alias Builtins165719
|
||||
Node: Arrays166335
|
||||
Node: The Directory Stack169356
|
||||
Node: Printing a Prompt172706
|
||||
Node: The Restricted Shell174369
|
||||
Node: Bash POSIX Mode175730
|
||||
Node: Job Control179891
|
||||
Node: Job Control Basics180357
|
||||
Node: Job Control Builtins184556
|
||||
Node: Job Control Variables188848
|
||||
Node: Using History Interactively189998
|
||||
Node: Bash History Facilities190677
|
||||
Node: Bash History Builtins193018
|
||||
Node: History Interaction196386
|
||||
Node: Event Designators198938
|
||||
Node: Word Designators199865
|
||||
Node: Modifiers201114
|
||||
Node: Command Line Editing202431
|
||||
Node: Introduction and Notation203091
|
||||
Node: Readline Interaction204129
|
||||
Node: Readline Bare Essentials205321
|
||||
Node: Readline Movement Commands206861
|
||||
Node: Readline Killing Commands207826
|
||||
Node: Readline Arguments209541
|
||||
Node: Searching210515
|
||||
Node: Readline Init File212263
|
||||
Node: Readline Init File Syntax213302
|
||||
Node: Conditional Init Constructs222508
|
||||
Node: Sample Init File224946
|
||||
Node: Bindable Readline Commands228115
|
||||
Node: Commands For Moving228865
|
||||
Node: Commands For History229712
|
||||
Node: Commands For Text232541
|
||||
Node: Commands For Killing234508
|
||||
Node: Numeric Arguments236657
|
||||
Node: Commands For Completion237783
|
||||
Node: Keyboard Macros241615
|
||||
Node: Miscellaneous Commands242173
|
||||
Node: Readline vi Mode246493
|
||||
Node: Installing Bash247371
|
||||
Node: Basic Installation248448
|
||||
Node: Compilers and Options251358
|
||||
Node: Compiling For Multiple Architectures252092
|
||||
Node: Installation Names253749
|
||||
Node: Specifying the System Type254474
|
||||
Node: Sharing Defaults255178
|
||||
Node: Operation Controls255843
|
||||
Node: Optional Features256748
|
||||
Node: Reporting Bugs263158
|
||||
Node: Builtin Index264229
|
||||
Node: Reserved Word Index267632
|
||||
Node: Variable Index269090
|
||||
Node: Function Index274363
|
||||
Node: Concept Index278853
|
||||
|
||||
End Tag Table
|
||||
|
|
|
|||
|
|
@ -5,13 +5,13 @@
|
|||
@c %**end of header
|
||||
|
||||
@ignore
|
||||
last change: Wed Mar 25 11:36:48 EST 1998
|
||||
Last Change: Wed Jan 20 16:46:26 EST 1999
|
||||
@end ignore
|
||||
|
||||
@set EDITION 2.2
|
||||
@set VERSION 2.02
|
||||
@set UPDATED 1 April 1998
|
||||
@set UPDATE-MONTH April 1998
|
||||
@set EDITION 2.3
|
||||
@set VERSION 2.03
|
||||
@set UPDATED 20 January 1999
|
||||
@set UPDATE-MONTH January 1999
|
||||
|
||||
@iftex
|
||||
@finalout
|
||||
|
|
@ -36,7 +36,7 @@ This is Edition @value{EDITION}, last updated @value{UPDATED},
|
|||
of @cite{The GNU Bash Reference Manual},
|
||||
for @code{Bash}, Version @value{VERSION}.
|
||||
|
||||
Copyright (C) 1991, 1993, 1996, 1997 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991-1999 Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
|
|
@ -64,13 +64,13 @@ by the Free Software Foundation.
|
|||
@titlepage
|
||||
@title Bash Reference Manual
|
||||
@subtitle Reference Documentation for Bash
|
||||
@subtitle Edition @value{EDITION}, for @code{bash} Version @value{VERSION}.
|
||||
@subtitle @value{UPDATED}
|
||||
@subtitle Edition @value{EDITION}, for @code{Bash} Version @value{VERSION}.
|
||||
@subtitle @value{UPDATE-MONTH}
|
||||
@author Chet Ramey, Case Western Reserve University
|
||||
@author Brian Fox, Free Software Foundation
|
||||
@page
|
||||
@vskip 0pt plus 1filll
|
||||
Copyright @copyright{} 1991, 1993, 1996 Free Software Foundation, Inc.
|
||||
Copyright @copyright{} 1991-1999 Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
|
|
@ -1428,9 +1428,9 @@ In the first form, only the first match is replaced.
|
|||
The second form causes all matches of @var{pattern} to be
|
||||
replaced with @var{string}.
|
||||
If @var{pattern} begins with @samp{#}, it must match at the beginning
|
||||
of @var{string}.
|
||||
of the expanded value of @var{parameter}.
|
||||
If @var{pattern} begins with @samp{%}, it must match at the end
|
||||
of @var{string}.
|
||||
of the expanded value of @var{parameter}.
|
||||
If @var{string} is null, matches of @var{pattern} are deleted
|
||||
and the @code{/} following @var{pattern} may be omitted.
|
||||
If @var{parameter} is @samp{@@} or @samp{*},
|
||||
|
|
@ -2285,13 +2285,16 @@ The return status is zero.
|
|||
@item .
|
||||
@btindex .
|
||||
@example
|
||||
. @var{filename}
|
||||
. @var{filename} [@var{arguments}]
|
||||
@end example
|
||||
Read and execute commands from the @var{filename} argument in the
|
||||
current shell context. If @var{filename} does not contain a slash,
|
||||
the @code{$PATH} variable is used to find
|
||||
@var{filename}. The current directory is searched if @var{filename}
|
||||
is not found in @code{$PATH}.
|
||||
If any @var{arguments} are supplied, they become the positional
|
||||
parameters when @var{filename} is executed. Otherwise the positional
|
||||
parameters are unchanged.
|
||||
The return status is the exit status of the last command executed, or
|
||||
zero if no commands are executed. If @var{filename} is not found, or
|
||||
cannot be read, the return status is non-zero.
|
||||
|
|
@ -3245,7 +3248,8 @@ If any of the files exist but cannot be read, Bash reports an error.
|
|||
Tildes are expanded in file names as described above under
|
||||
Tilde Expansion (@pxref{Tilde Expansion}).
|
||||
|
||||
When Bash is invoked as an interactive login shell, it first reads and
|
||||
When Bash is invoked as an interactive login shell, or as a
|
||||
non-interactive shell with the @samp{--login} option, it first reads and
|
||||
executes commands from the file @file{/etc/profile}, if that file exists.
|
||||
After reading that file, it looks for @file{~/.bash_profile},
|
||||
@file{~/.bash_login}, and @file{~/.profile}, in that order, and reads
|
||||
|
|
@ -3285,7 +3289,8 @@ If Bash is invoked with the name @code{sh}, it tries to mimic the
|
|||
startup behavior of historical versions of @code{sh} as closely as
|
||||
possible, while conforming to the @sc{POSIX} standard as well.
|
||||
|
||||
When invoked as an interactive login shell, it first attempts to read
|
||||
When invoked as an interactive login shell, or as a non-interactive
|
||||
shell with the @samp{--login} option, it first attempts to read
|
||||
and execute commands from @file{/etc/profile} and @file{~/.profile}, in
|
||||
that order.
|
||||
The @samp{--noprofile} option may be used to inhibit this behavior.
|
||||
|
|
@ -3296,7 +3301,7 @@ Since a shell invoked as @code{sh} does not attempt to read and execute
|
|||
commands from any other startup files, the @samp{--rcfile} option has
|
||||
no effect.
|
||||
A non-interactive shell invoked with the name @code{sh} does not attempt
|
||||
to read any startup files.
|
||||
to read any other startup files.
|
||||
|
||||
When invoked as @code{sh}, Bash enters @sc{POSIX} mode after
|
||||
the startup files are read.
|
||||
|
|
@ -3319,6 +3324,14 @@ The @samp{--norc} option may be used to inhibit this behavior, and the
|
|||
@code{rshd} does not generally invoke the shell with those options or
|
||||
allow them to be specified.
|
||||
|
||||
If Bash is started with the effective user (group) id not equal to the
|
||||
real user (group) id, and the @code{-p} option is not supplied, no startup
|
||||
files are read, shell functions are not inherited from the environment,
|
||||
the @code{SHELLOPTS} variable, if it appears in the environment, is ignored,
|
||||
and the effective user id is set to the real user id.
|
||||
If the @code{-p} option is supplied at invocation, the startup behavior is
|
||||
the same, but the effective user id is not reset.
|
||||
|
||||
@node Is This Shell Interactive?
|
||||
@section Is This Shell Interactive?
|
||||
@cindex interactive shell
|
||||
|
|
@ -3676,6 +3689,8 @@ If there are fewer words read from the standard input than names,
|
|||
the remaining names are assigned empty values.
|
||||
The characters in the value of the @code{IFS} variable
|
||||
are used to split the line into words.
|
||||
The backslash character @samp{\} may be used to remove any special
|
||||
meaning for the next character read and for line continuation.
|
||||
If no names are supplied, the line read is assigned to the
|
||||
variable @code{REPLY}.
|
||||
The return code is zero, unless end-of-file is encountered.
|
||||
|
|
@ -3683,8 +3698,10 @@ Options, if supplied, have the following meanings:
|
|||
|
||||
@table @code
|
||||
@item -r
|
||||
If this option is given, a backslash-newline pair is not ignored, and
|
||||
the backslash is considered to be part of the line.
|
||||
If this option is given, backslash does not act as an escape
|
||||
character. The backslash is considered to be part of the line.
|
||||
In particular, a backslash-newline pair may not be used as a line
|
||||
continuation.
|
||||
|
||||
@item -p @var{prompt}
|
||||
Display @var{prompt}, without a
|
||||
|
|
@ -3853,6 +3870,13 @@ If set, prompt strings undergo variable and parameter expansion after
|
|||
being expanded (@pxref{Printing a Prompt}).
|
||||
This option is enabled by default.
|
||||
|
||||
@item restricted_shell
|
||||
The shell sets this option if it is started in restricted mode
|
||||
(@pxref{The Restricted Shell}).
|
||||
The value may not be changed.
|
||||
This is not reset when the startup files are executed, allowing
|
||||
the startup files to discover whether or not a shell is restricted.
|
||||
|
||||
@item shift_verbose
|
||||
If this is set, the @code{shift}
|
||||
builtin prints an error message when the shift count exceeds the
|
||||
|
|
@ -4120,9 +4144,12 @@ In this mode, the @code{$BASH_ENV} and @code{$ENV} files are not
|
|||
processed, shell functions are not inherited from the environment,
|
||||
and the @code{SHELLOPTS} variable, if it appears in the environment,
|
||||
is ignored.
|
||||
This is enabled automatically
|
||||
on startup if the effective user (group) id is not equal to the real
|
||||
user (group) id. Turning this option off causes the effective user
|
||||
If the shell is started with the effective user (group) id not equal to the
|
||||
real user (group) id, and the @code{-p} option is not supplied, these actions
|
||||
are taken and the effective user id is set to the real user id.
|
||||
If the @code{-p} option is supplied at startup, the effective user id is
|
||||
not reset.
|
||||
Turning this option off causes the effective user
|
||||
and group ids to be set to the real user and group ids.
|
||||
|
||||
@item -t
|
||||
|
|
@ -4235,6 +4262,9 @@ True if @var{file} exists and is a regular file.
|
|||
@item -g @var{file}
|
||||
True if @var{file} exists and its set-group-id bit is set.
|
||||
|
||||
@item -h @var{file}
|
||||
True if @var{file} exists and is a symbolic link.
|
||||
|
||||
@item -k @var{file}
|
||||
True if @var{file} exists and its "sticky" bit is set.
|
||||
|
||||
|
|
@ -5101,8 +5131,8 @@ with the exception that the following are disallowed:
|
|||
@item
|
||||
Changing directories with the @code{cd} builtin.
|
||||
@item
|
||||
Setting or unsetting the values of the @code{SHELL} or @code{PATH}
|
||||
variables.
|
||||
Setting or unsetting the values of the @code{SHELL}, @code{PATH},
|
||||
@code{ENV}, or @code{BASH_ENV} variables.
|
||||
@item
|
||||
Specifying command names containing slashes.
|
||||
@item
|
||||
|
|
@ -5815,6 +5845,11 @@ The @file{NOTES} file contains a list of systems for
|
|||
which this should be turned off, and @code{configure} disables this
|
||||
option automatically for a number of systems.
|
||||
|
||||
@item --with-installed-readline
|
||||
Define this to make bash link with a locally-installed version of Readline
|
||||
rather than the version in lib/readline. This works only with readline 4.0
|
||||
and later versions.
|
||||
|
||||
@item --with-purify
|
||||
Define this to use the Purify memory allocation checker from Pure
|
||||
Software.
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@
|
|||
.\" Case Western Reserve University
|
||||
.\" chet@ins.CWRU.Edu
|
||||
.\"
|
||||
.\" Last Change: Thu Feb 19 10:26:47 EST 1998
|
||||
.\" Last Change: Thu Dec 31 10:16:30 EST 1998
|
||||
.\"
|
||||
.TH READLINE 3 "1998 Feb 19" GNU
|
||||
.TH READLINE 3 "1998 Dec 31" GNU
|
||||
.\"
|
||||
.\" File Name macro. This used to be `.PN', for Path Name,
|
||||
.\" but Sun doesn't seem to like that very much.
|
||||
|
|
@ -22,6 +22,7 @@ readline \- get a line from a user with editing
|
|||
.LP
|
||||
.nf
|
||||
.ft B
|
||||
#include <stdio.h>
|
||||
#include <readline.h>
|
||||
#include <history.h>
|
||||
.ft
|
||||
|
|
@ -380,6 +381,19 @@ When set to \fBOn\fP, makes readline use a single line for display,
|
|||
scrolling the input horizontally on a single screen line when it
|
||||
becomes longer than the screen width rather than wrapping to a new line.
|
||||
.TP
|
||||
.B input\-meta (Off)
|
||||
If set to \fBOn\fP, readline will enable eight-bit input (that is,
|
||||
it will not strip the high bit from the characters it reads),
|
||||
regardless of what the terminal claims it can support. The name
|
||||
.B meta\-flag
|
||||
is a synonym for this variable.
|
||||
.TP
|
||||
.B isearch\-terminators (``C\-[C\-J'')
|
||||
The string of characters that should terminate an incremental
|
||||
search without subsequently executing the character as a command.
|
||||
If this variable has not been given a value, the characters
|
||||
\fIESC\fP and \fIC\-J\fP will terminate an incremental search.
|
||||
.TP
|
||||
.B keymap (emacs)
|
||||
Set the current readline keymap. The set of legal keymap names is
|
||||
\fIemacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
|
||||
|
|
@ -400,11 +414,6 @@ appended.
|
|||
If set to \fBOn\fP, history lines that have been modified are displayed
|
||||
with a preceding asterisk (\fB*\fP).
|
||||
.TP
|
||||
.B meta\-flag (Off)
|
||||
If set to \fBOn\fP, readline will enable eight-bit input (that is,
|
||||
it will not strip the high bit from the characters it reads),
|
||||
regardless of what the terminal claims it can support.
|
||||
.TP
|
||||
.B output\-meta (Off)
|
||||
If set to \fBOn\fP, readline will display characters with the
|
||||
eighth bit set directly rather than as a meta-prefixed escape
|
||||
|
|
@ -509,8 +518,10 @@ As each character of the search string is typed, readline displays
|
|||
the next entry from the history matching the string typed so far.
|
||||
An incremental search requires only as many characters as needed to
|
||||
find the desired history entry.
|
||||
The Escape character is used to terminate an incremental search.
|
||||
Control-J will also terminate the search.
|
||||
The characters present in the value of the \fIisearch-terminators\fP
|
||||
variable are used to terminate an incremental search.
|
||||
If that variable has not been assigned a value the Escape and
|
||||
Control-J characters will terminate an incremental search.
|
||||
Control-G will abort an incremental search and restore the original
|
||||
line.
|
||||
When the search is terminated, the history entry containing the
|
||||
|
|
@ -647,6 +658,11 @@ the last character typed was not bound to \fBBdelete\-char\fP, then return
|
|||
Delete the character behind the cursor. When given a numeric argument,
|
||||
save the deleted text on the kill ring.
|
||||
.TP
|
||||
.B forward\-backward\-delete\-char
|
||||
Delete the character under the cursor, unless the cursor is at the
|
||||
end of the line, in which case the character behind the cursor is
|
||||
deleted. By default, this is not bound to a key.
|
||||
.TP
|
||||
.B quoted\-insert (C\-q, C\-v)
|
||||
Add the next character that you type to the line verbatim. This is
|
||||
how to insert characters like \fBC\-q\fP, for example.
|
||||
|
|
@ -798,6 +814,13 @@ of matches; a negative argument may be used to move backward
|
|||
through the list.
|
||||
This command is intended to be bound to \fBTAB\fP, but is unbound
|
||||
by default.
|
||||
.TP
|
||||
.B delete\-char\-or\-list
|
||||
Deletes the character under the cursor if not at the beginning or
|
||||
end of the line (like \fBdelete-char\fP).
|
||||
If at the end of the line, behaves identically to
|
||||
\fBpossible-completions\fP.
|
||||
This command is unbound by default.
|
||||
.PD
|
||||
.SS Keyboard Macros
|
||||
.PP
|
||||
|
|
@ -847,7 +870,7 @@ Undo all changes made to this line. This is like executing the
|
|||
.B undo
|
||||
command enough times to return the line to its initial state.
|
||||
.TP
|
||||
.B tilde\-expand (M\-~)
|
||||
.B tilde\-expand (M\-&)
|
||||
Perform tilde expansion on the current word.
|
||||
.TP
|
||||
.B set\-mark (C\-@, M-<space>)
|
||||
|
|
|
|||
29
error.c
29
error.c
|
|
@ -496,3 +496,32 @@ trace (format, va_alist)
|
|||
#endif /* 0 */
|
||||
|
||||
#endif /* USE_VARARGS */
|
||||
|
||||
static char *cmd_error_table[] = {
|
||||
"unknown command error", /* CMDERR_DEFAULT */
|
||||
"bad command type", /* CMDERR_BADTYPE */
|
||||
"bad connector", /* CMDERR_BADCONN */
|
||||
"bad jump", /* CMDERR_BADJUMP */
|
||||
0
|
||||
};
|
||||
|
||||
void
|
||||
command_error (func, code, e, flags)
|
||||
const char *func;
|
||||
int code, e, flags; /* flags currently unused */
|
||||
{
|
||||
if (code > CMDERR_LAST)
|
||||
code = CMDERR_DEFAULT;
|
||||
|
||||
programming_error ("%s: %s: %d", func, cmd_error_table[code], e);
|
||||
}
|
||||
|
||||
char *
|
||||
command_errstr (code)
|
||||
int code;
|
||||
{
|
||||
if (code > CMDERR_LAST)
|
||||
code = CMDERR_DEFAULT;
|
||||
|
||||
return (cmd_error_table[code]);
|
||||
}
|
||||
|
|
|
|||
5
error.h
5
error.h
|
|
@ -50,4 +50,9 @@ extern void internal_error __P((const char *, ...));
|
|||
/* Report an internal warning. */
|
||||
extern void internal_warning __P((const char *, ...));
|
||||
|
||||
/* Report an error having to do with command parsing or execution. */
|
||||
extern void command_error __P((const char *, int, int, int));
|
||||
|
||||
extern char *command_errstr __P((int));
|
||||
|
||||
#endif /* !_ERROR_H_ */
|
||||
|
|
|
|||
26
eval.c
26
eval.c
|
|
@ -41,6 +41,10 @@
|
|||
#include "input.h"
|
||||
#include "execute_cmd.h"
|
||||
|
||||
#if defined (HISTORY)
|
||||
# include "bashhist.h"
|
||||
#endif
|
||||
|
||||
extern int yyparse ();
|
||||
|
||||
extern int EOF_reached;
|
||||
|
|
@ -105,7 +109,7 @@ reader_loop ()
|
|||
break;
|
||||
|
||||
default:
|
||||
programming_error ("reader_loop: bad jump: code %d", code);
|
||||
command_error ("reader_loop", CMDERR_BADJUMP, code, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -161,7 +165,7 @@ static sighandler
|
|||
alrm_catcher(i)
|
||||
int i;
|
||||
{
|
||||
printf ("%ctimed out waiting for input: auto-logout\n", '\07');
|
||||
printf ("\007timed out waiting for input: auto-logout\n");
|
||||
jump_to_top_level (EXITPROG);
|
||||
SIGRETURN (0);
|
||||
}
|
||||
|
|
@ -269,6 +273,17 @@ parse_string_to_word_list (s, whom)
|
|||
{
|
||||
WORD_LIST *wl;
|
||||
COMMAND *saved_global;
|
||||
#if defined (HISTORY)
|
||||
int old_remember_on_history, old_history_expansion_inhibited;
|
||||
#endif
|
||||
|
||||
#if defined (HISTORY)
|
||||
old_remember_on_history = remember_on_history;
|
||||
# if defined (BANG_HISTORY)
|
||||
old_history_expansion_inhibited = history_expansion_inhibited;
|
||||
# endif
|
||||
bash_history_disable ();
|
||||
#endif
|
||||
|
||||
push_stream (1);
|
||||
|
||||
|
|
@ -293,5 +308,12 @@ parse_string_to_word_list (s, whom)
|
|||
|
||||
pop_stream ();
|
||||
|
||||
#if defined (HISTORY)
|
||||
remember_on_history = old_remember_on_history;
|
||||
# if defined (BANG_HISTORY)
|
||||
history_expansion_inhibited = old_history_expansion_inhibited;
|
||||
# endif /* BANG_HISTORY */
|
||||
#endif /* HISTORY */
|
||||
|
||||
return (wl);
|
||||
}
|
||||
|
|
|
|||
125
examples/functions/autoload.v3
Normal file
125
examples/functions/autoload.v3
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
#From: Mark Kennedy <mtk@ny.ubs.com>
|
||||
#Message-ID: <35E2B899.63A02DF5@ny.ubs.com>
|
||||
#Date: Tue, 25 Aug 1998 09:14:01 -0400
|
||||
#To: chet@nike.ins.cwru.edu
|
||||
#Subject: a newer version of the ksh-style 'autoload'
|
||||
|
||||
#enclosed you'll find 'autoload.v3', a version of the autoloader
|
||||
#that emulates the ksh semantics of delaying the resolution (and loading) of the function
|
||||
#until its first use. i took the liberty of simplifying the code a bit although it still uses the
|
||||
#same functional breakdown. i recently went through the exercise of converting
|
||||
#my ksh-based environment to bash (a very, very pleasant experience)
|
||||
#and this popped out.
|
||||
|
||||
# the psuedo-ksh autoloader.
|
||||
|
||||
# The first cut of this was by Bill Trost, trost@reed.bitnet.
|
||||
# The second cut came from Chet Ramey, chet@ins.CWRU.Edu
|
||||
# The third cut came from Mark Kennedy, mtk@ny.ubs.com. 1998/08/25
|
||||
|
||||
unset _AUTOLOADS
|
||||
|
||||
_aload()
|
||||
{
|
||||
local func
|
||||
for func; do
|
||||
eval $func '()
|
||||
{
|
||||
local f=$(_autoload_resolve '$func')
|
||||
if [[ $f ]]; then
|
||||
. $f
|
||||
'$func' "$@"
|
||||
return $?
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}'
|
||||
_autoload_addlist $func
|
||||
done
|
||||
}
|
||||
|
||||
_autoload_addlist()
|
||||
{
|
||||
local func
|
||||
|
||||
for func in ${_AUTOLOADS[@]}; do
|
||||
[[ $func = "$1" ]] && return
|
||||
done
|
||||
|
||||
_AUTOLOADS[${#_AUTOLOADS[@]}]=$1
|
||||
}
|
||||
|
||||
_autoload_dump()
|
||||
{
|
||||
local func
|
||||
|
||||
for func in ${_AUTOLOADS[@]}; do
|
||||
[[ $1 ]] && echo -n "autoload "
|
||||
echo $func
|
||||
done
|
||||
}
|
||||
|
||||
_autoload_remove_one()
|
||||
{
|
||||
local func
|
||||
local -a NEW_AUTOLOADS
|
||||
|
||||
for func in ${_AUTOLOADS[@]}; do
|
||||
[[ $func != "$1" ]] && NEW_AUTOLOADS[${#NEW_AUTOLOADS[@]}]=$func
|
||||
done
|
||||
|
||||
_AUTOLOADS=( ${NEW_AUTOLOADS[@]} )
|
||||
}
|
||||
|
||||
_autoload_remove()
|
||||
{
|
||||
local victim func
|
||||
|
||||
for victim; do
|
||||
for func in ${_AUTOLOADS[@]}; do
|
||||
[[ $victim = "$func" ]] && unset -f $func && continue 2
|
||||
done
|
||||
echo "autoload: $func: not an autoloaded function" >&2
|
||||
done
|
||||
|
||||
for func; do
|
||||
_autoload_remove_one $func
|
||||
done
|
||||
}
|
||||
|
||||
_autoload_resolve()
|
||||
{
|
||||
if [[ ! "$FPATH" ]]; then
|
||||
echo "autoload: FPATH not set or null" >&2
|
||||
return
|
||||
fi
|
||||
|
||||
local p
|
||||
|
||||
for p in $( (IFS=':'; set -- ${FPATH}; echo "$@") ); do
|
||||
p=${p:-.}
|
||||
if [ -f $p/$1 ]; then echo $p/$1; return; fi
|
||||
done
|
||||
|
||||
echo "autoload: $1: function source file not found" >&2
|
||||
}
|
||||
|
||||
autoload()
|
||||
{
|
||||
if (( $# == 0 )) ; then _autoload_dump; return; fi
|
||||
|
||||
local opt OPTIND
|
||||
|
||||
while getopts pu opt
|
||||
do
|
||||
case $opt in
|
||||
p) _autoload_dump printable; return;;
|
||||
u) shift $((OPTIND-1)); _autoload_remove "$@"; return;;
|
||||
*) echo "autoload: usage: autoload [-pu] [function ...]" >&2; return;;
|
||||
esac
|
||||
done
|
||||
|
||||
shift $(($OPTIND-1))
|
||||
|
||||
_aload "$@"
|
||||
}
|
||||
|
|
@ -23,6 +23,17 @@ inet2hex ()
|
|||
hex2inet ()
|
||||
{
|
||||
local x1 x2 x3 x4
|
||||
local rev
|
||||
|
||||
OPTIND=1
|
||||
while getopts "r" o
|
||||
do
|
||||
case "$o" in
|
||||
r) rev=true;;
|
||||
*) echo "hex2inet: usage: hex2inet [0x]XXXXXXXX" >&2 ; exit 2;;
|
||||
esac
|
||||
done
|
||||
shift $(( $OPTIND - 1 ))
|
||||
|
||||
case "$1" in
|
||||
0x*) h=${1#??} ;;
|
||||
|
|
@ -40,5 +51,10 @@ hex2inet ()
|
|||
x3=$(( 0x${h:4:2} ))
|
||||
x4=$(( 0x${h:6:2} ))
|
||||
|
||||
printf "%d.%d.%d.%d\n" $x1 $x2 $x3 $x4
|
||||
if [ -z "$rev" ] ; then
|
||||
printf "%d.%d.%d.%d\n" $x1 $x2 $x3 $x4
|
||||
else
|
||||
printf "%d.%d.%d.%d\n" $x4 $x3 $x2 $x1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,19 +8,19 @@
|
|||
|
||||
lowercase()
|
||||
{
|
||||
for file; do
|
||||
filename=${file##*/}
|
||||
case "$filename" in
|
||||
*/*) dirname=${file%/*} ;;
|
||||
*) dirname=.;;
|
||||
esac
|
||||
nf=$(echo $filename | tr A-Z a-z)
|
||||
newname="${dirname}/${nf}"
|
||||
if [ "$nf" != "$filename" ]; then
|
||||
mv "$file" "$newname"
|
||||
echo "$0: $file -> $newname"
|
||||
else
|
||||
echo "$0: $file not changed."
|
||||
fi
|
||||
done
|
||||
for file; do
|
||||
filename=${file##*/}
|
||||
case "$filename" in
|
||||
*/*) dirname=${file%/*} ;;
|
||||
*) dirname=.;;
|
||||
esac
|
||||
nf=$(echo $filename | tr A-Z a-z)
|
||||
newname="${dirname}/${nf}"
|
||||
if [ "$nf" != "$filename" ]; then
|
||||
mv "$file" "$newname"
|
||||
echo "lowercase: $file -> $newname"
|
||||
else
|
||||
echo "lowercase: $file not changed."
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
|
|
|||
12
examples/functions/repeat3
Normal file
12
examples/functions/repeat3
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
# From psamuels@jake.niar.twsu.edu (Peter Samuelson)
|
||||
# posted to usenet, Message-ID: <6rtp8j$2a0$1@jake.niar.twsu.edu>
|
||||
|
||||
repeat ()
|
||||
{
|
||||
local i max; # note that you can use \$i in the command string
|
||||
max=$1; shift;
|
||||
|
||||
i=1; while ((i <= max)); do
|
||||
eval "$@"; ((i = i + 1));
|
||||
done;
|
||||
}
|
||||
37
examples/functions/seq2
Normal file
37
examples/functions/seq2
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
# Generate a sequence from m to n, m defaults to 1.
|
||||
|
||||
seq ()
|
||||
{
|
||||
declare -i lo hi i # makes local
|
||||
local _SEQ INIT COMPARE STEP
|
||||
|
||||
case "$1" in
|
||||
-r) INIT='i=$hi _SEQ=""' COMPARE='let "i >= $lo"' STEP='let i-=1' ; shift ;;
|
||||
*) INIT='i=$lo _SEQ=""' COMPARE='let "i <= $hi"' STEP='let i+=1' ;;
|
||||
esac
|
||||
|
||||
case $# in
|
||||
1) lo=1 hi="$1" ;;
|
||||
2) lo=$1 hi=$2 ;;
|
||||
*) echo seq: usage: seq [-r] [low] high 1>&2 ; return 2 ;;
|
||||
esac
|
||||
|
||||
# equivalent to the as-yet-unimplemented
|
||||
# for (( "$INIT" ; "$COMPARE" ; "$STEP" )); do _SEQ="${_SEQ}$i "; done
|
||||
eval "$INIT"
|
||||
while eval "$COMPARE"; do
|
||||
_SEQ="${_SEQ}$i "
|
||||
eval "$STEP"
|
||||
done
|
||||
echo "${_SEQ# }"
|
||||
return 0
|
||||
}
|
||||
|
||||
# like the APL `iota' function (or at least how I remember it :-)
|
||||
iota()
|
||||
{
|
||||
case $# in
|
||||
1) seq 1 "$1"; return $?;;
|
||||
*) echo "iota: usage: iota high" 1>&2; return 2;;
|
||||
esac
|
||||
}
|
||||
44
examples/functions/which
Normal file
44
examples/functions/which
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
#
|
||||
# which - emulation of `which' as it appears in FreeBSD
|
||||
#
|
||||
# usage: which [-as] command [command...]
|
||||
#
|
||||
|
||||
which()
|
||||
{
|
||||
local aflag sflag ES a
|
||||
|
||||
OPTIND=1
|
||||
while builtin getopts as opt ; do
|
||||
case "$opt" in
|
||||
a) aflag=-a ;;
|
||||
s) sflag=1 ;;
|
||||
?) echo "which: usage: which [-as] command [command ...]" >&2
|
||||
exit 2 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
(( $OPTIND > 1 )) && shift $(( $OPTIND - 1 ))
|
||||
|
||||
# without command arguments, exit with status 1
|
||||
ES=1
|
||||
|
||||
# exit status is 0 if all commands are found, 1 if any are not found
|
||||
for command; do
|
||||
# if $command is a function, make sure we add -a so type
|
||||
# will look in $PATH after finding the function
|
||||
a=$aflag
|
||||
case "$(builtin type -t $command)" in
|
||||
"function") a=-a;;
|
||||
esac
|
||||
|
||||
if [ -n "$sflag" ]; then
|
||||
builtin type -p $a $command >/dev/null 2>&1
|
||||
else
|
||||
builtin type -p $a $command
|
||||
fi
|
||||
ES=$?
|
||||
done
|
||||
|
||||
return $ES
|
||||
}
|
||||
|
|
@ -1,8 +1,6 @@
|
|||
#
|
||||
# Simple makefile for the sample loadable builtins
|
||||
#
|
||||
# This includes some boilerplate definitions added by configure, but will
|
||||
# still need hand-editing
|
||||
#
|
||||
# Include some boilerplate Gnu makefile definitions.
|
||||
prefix = @prefix@
|
||||
|
|
@ -22,123 +20,148 @@ VPATH = .:@srcdir@
|
|||
CC = @CC@
|
||||
RM = rm -f
|
||||
|
||||
SHELL = /bin/sh
|
||||
SHELL = @MAKE_SHELL@
|
||||
|
||||
# SunOS 4
|
||||
#PICFLAG = -pic
|
||||
# Some versions of gcc, esp. on NetBSD and FreeBSD
|
||||
PICFLAG = -fpic
|
||||
# Linux -- could also be -fpic
|
||||
#PICFLAG = -fPIC
|
||||
# SunOS 5
|
||||
#PICFLAG = -K pic
|
||||
# SVR4, SVR4.2, Irix
|
||||
#PICFLAG = -K PIC
|
||||
# BSD/OS 2.1, BSD/OS 3.x
|
||||
#PICFLAG =
|
||||
# AIX 4.2
|
||||
#PICFLAG = -K
|
||||
host_os = @host_os@
|
||||
host_cpu = @host_cpu@
|
||||
host_vendor = @host_vendor@
|
||||
|
||||
# SunOS 4, BSD/OS 2.1, BSD/OS 3.x, SVR4.2, SVR4, Linux, AIX 4.2, etc.
|
||||
LD = ld
|
||||
# SunOS 5, Linux
|
||||
#LD = ${CC}
|
||||
|
||||
# SunOS 4
|
||||
#LDOPT = -assert pure-text
|
||||
# OSF/1, Digital UNIX
|
||||
#LDOPT = -shared -soname $@ -expect_unresolved '*'
|
||||
# SunOS 5 using sun cc
|
||||
#LDOPT = -dy -z text -G -i -h $@
|
||||
# SunOS 5 using gcc with Sun ld
|
||||
#LDOPT = -shared -Wl,-dy -Wl,-G -Wl,-i
|
||||
# SVR4, SVR4.2
|
||||
#LDOPT = -dy -z text -G -h $@
|
||||
# NetBSD, FreeBSD -- might also need -r
|
||||
LDOPT = -x -Bshareable
|
||||
# Linux
|
||||
#LDOPT = -shared
|
||||
# BSD/OS 2.1, BSD/OS 3.x
|
||||
#LDOPT = -r
|
||||
# AIX 4.2
|
||||
#LDOPT = -bdynamic -bnoentry -bexpall -G
|
||||
|
||||
# other libraries to link the shared object against
|
||||
# BSD/OS 2.1
|
||||
#LDLIBS = -lc_s.2.1.0
|
||||
# BSD/OS 3.0, BSD/OS 3.1
|
||||
#LDLIBS = -lc_s.3.0.0
|
||||
CFLAGS = @CFLAGS@
|
||||
|
||||
#
|
||||
# These values are generated for configure by ${topdir}/support/shobj-conf.
|
||||
# If your system is not supported by that script, but includes facilities for
|
||||
# dynamic loading of shared objects, please update the script and send the
|
||||
# changes to bash-maintainers@gnu.org.
|
||||
#
|
||||
SHOBJ_CC = @SHOBJ_CC@
|
||||
SHOBJ_CFLAGS = @SHOBJ_CFLAGS@
|
||||
SHOBJ_LD = @SHOBJ_LD@
|
||||
SHOBJ_LDFLAGS = @SHOBJ_LDFLAGS@
|
||||
SHOBJ_XLDFLAGS = @SHOBJ_XLDFLAGS@
|
||||
SHOBJ_LIBS = @SHOBJ_LIBS@
|
||||
SHOBJ_STATUS = @SHOBJ_STATUS@
|
||||
|
||||
INC = -I. -I.. -I$(topdir) -I$(topdir)/lib -I$(topdir)/builtins \
|
||||
-I$(BUILD_DIR) -I$(BUILD_DIR)/lib -I$(BUILD_DIR)/builtins
|
||||
|
||||
.c.o:
|
||||
$(CC) $(PICFLAG) $(CFLAGS) $(INC) -c -o $@ $<
|
||||
$(SHOBJ_CC) $(SHOBJ_CFLAGS) $(CFLAGS) $(INC) -c -o $@ $<
|
||||
|
||||
|
||||
ALLPROG = print truefalse sleep pushd finfo logname basename dirname \
|
||||
tty pathchk tee head rmdir sprintf
|
||||
tty pathchk tee head mkdir rmdir sprintf printenv id whoami \
|
||||
uname sync push ln unlink
|
||||
OTHERPROG = necho getconf hello cat
|
||||
|
||||
all: $(ALLPROG)
|
||||
others: $(OTHERPROG)
|
||||
all: $(SHOBJ_STATUS)
|
||||
|
||||
everything: all others
|
||||
supported: $(ALLPROG)
|
||||
others: $(OTHERPROG)
|
||||
|
||||
unsupported:
|
||||
@echo "Your system (${host_os}) is not supported by the"
|
||||
@echo "${topdir}/support/shobj-conf script."
|
||||
@echo "If your operating system provides facilities for dynamic"
|
||||
@echo "loading of shared objects using the dlopen(3) interface,"
|
||||
@echo "please update the script and re-run configure.
|
||||
@echo "Please send the changes you made to bash-maintainers@gnu.org"
|
||||
@echo "for inclusion in future bash releases."
|
||||
|
||||
everything: supported others
|
||||
|
||||
sprintf: sprintf.o
|
||||
$(LD) $(LDOPT) -o $@ sprintf.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ sprintf.o $(SHOBJ_LIBS)
|
||||
|
||||
print: print.o
|
||||
$(LD) $(LDOPT) -o $@ print.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ print.o $(SHOBJ_LIBS)
|
||||
|
||||
necho: necho.o
|
||||
$(LD) $(LDOPT) -o $@ necho.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ necho.o $(SHOBJ_LIBS)
|
||||
|
||||
getconf: getconf.o
|
||||
$(LD) $(LDOPT) -o $@ getconf.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ getconf.o $(SHOBJ_LIBS)
|
||||
|
||||
hello: hello.o
|
||||
$(LD) $(LDOPT) -o $@ hello.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ hello.o $(SHOBJ_LIBS)
|
||||
|
||||
truefalse: truefalse.o
|
||||
$(LD) $(LDOPT) -o $@ truefalse.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ truefalse.o $(SHOBJ_LIBS)
|
||||
|
||||
sleep: sleep.o
|
||||
$(LD) $(LDOPT) -o $@ sleep.o $(LDLIBS)
|
||||
|
||||
pushd: pushd.o
|
||||
$(LD) $(LDOPT) -o $@ pushd.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ sleep.o $(SHOBJ_LIBS)
|
||||
|
||||
finfo: finfo.o
|
||||
$(LD) $(LDOPT) -o $@ finfo.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ finfo.o $(SHOBJ_LIBS)
|
||||
|
||||
cat: cat.o
|
||||
$(LD) $(LDOPT) -o $@ cat.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ cat.o $(SHOBJ_LIBS)
|
||||
|
||||
logname: logname.o
|
||||
$(LD) $(LDOPT) -o $@ logname.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ logname.o $(SHOBJ_LIBS)
|
||||
|
||||
basename: basename.o
|
||||
$(LD) $(LDOPT) -o $@ basename.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ basename.o $(SHOBJ_LIBS)
|
||||
|
||||
dirname: dirname.o
|
||||
$(LD) $(LDOPT) -o $@ dirname.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ dirname.o $(SHOBJ_LIBS)
|
||||
|
||||
tty: tty.o
|
||||
$(LD) $(LDOPT) -o $@ tty.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ tty.o $(SHOBJ_LIBS)
|
||||
|
||||
pathchk: pathchk.o
|
||||
$(LD) $(LDOPT) -o $@ pathchk.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ pathchk.o $(SHOBJ_LIBS)
|
||||
|
||||
tee: tee.o
|
||||
$(LD) $(LDOPT) -o $@ tee.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ tee.o $(SHOBJ_LIBS)
|
||||
|
||||
mkdir: mkdir.o
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ mkdir.o $(SHOBJ_LIBS)
|
||||
|
||||
rmdir: rmdir.o
|
||||
$(LD) $(LDOPT) -o $@ rmdir.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ rmdir.o $(SHOBJ_LIBS)
|
||||
|
||||
head: head.o
|
||||
$(LD) $(LDOPT) -o $@ head.o $(LDLIBS)
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ head.o $(SHOBJ_LIBS)
|
||||
|
||||
printenv: printenv.o
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ printenv.o $(SHOBJ_LIBS)
|
||||
|
||||
id: id.o
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ id.o $(SHOBJ_LIBS)
|
||||
|
||||
whoami: whoami.o
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ whoami.o $(SHOBJ_LIBS)
|
||||
|
||||
uname: uname.o
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ uname.o $(SHOBJ_LIBS)
|
||||
|
||||
sync: sync.o
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ sync.o $(SHOBJ_LIBS)
|
||||
|
||||
push: push.o
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ push.o $(SHOBJ_LIBS)
|
||||
|
||||
ln: ln.o
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ ln.o $(SHOBJ_LIBS)
|
||||
|
||||
unlink: unlink.o
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ unlink.o $(SHOBJ_LIBS)
|
||||
|
||||
|
||||
# pushd is a special case. We use the same source that the builtin version
|
||||
# uses, with special compilation options.
|
||||
#
|
||||
pushd.c: ${topdir}/builtins/pushd.def
|
||||
$(RM) $@
|
||||
${BUILD_DIR}/builtins/mkbuiltins -D ${topdir}/builtins ${topdir}/builtins/pushd.def
|
||||
|
||||
pushd.o: pushd.c
|
||||
$(RM) $@
|
||||
$(SHOBJ_CC) -DPUSHD_AND_POPD -DLOADABLE_BUILTIN $(SHOBJ_CFLAGS) $(CFLAGS) $(INC) -c -o $@ $<
|
||||
|
||||
pushd: pushd.o
|
||||
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ pushd.o $(SHOBJ_LIBS)
|
||||
|
||||
clean:
|
||||
$(RM) $(ALLPROG) $(OTHERPROG) *.o
|
||||
|
|
@ -146,12 +169,11 @@ clean:
|
|||
mostlyclean: clean
|
||||
|
||||
distclean maintainer-clean: clean
|
||||
$(RM) Makefile
|
||||
$(RM) Makefile pushd.c
|
||||
|
||||
print.o: print.c
|
||||
truefalse.o: truefalse.c
|
||||
sleep.o: sleep.c
|
||||
pushd.o: pushd.c
|
||||
finfo.o: finfo.c
|
||||
logname.o: logname.c
|
||||
basename.o: basename.c
|
||||
|
|
@ -166,4 +188,10 @@ necho.o: necho.c
|
|||
getconf.o: getconf.c
|
||||
hello.o: hello.c
|
||||
cat.o: cat.c
|
||||
|
||||
printenv.o: printenv.c
|
||||
id.o: id.c
|
||||
whoami.o: whoami.c
|
||||
uname.o: uname.c
|
||||
sync.o: sync.c
|
||||
push.o: push.c
|
||||
mkdir.o: mkdir.c
|
||||
|
|
|
|||
|
|
@ -10,13 +10,18 @@ of the shell.
|
|||
All of the new builtins in ksh93 that bash didn't already have
|
||||
are included here, as is the ksh `print' builtin.
|
||||
|
||||
Compile with cc and whatever pic options you need (look in the
|
||||
Makefile for a few common settings)
|
||||
The configure script in the top-level source directory uses the
|
||||
support/shobj-conf script to set the right values in the Makefile,
|
||||
so you should not need to change the Makefile. If your system
|
||||
is not supported by support/shobj-conf, and it has the necessary
|
||||
facilities for building shared objects and support for the
|
||||
dlopen/dlsyn/dlclose/dlerror family of functions, please make
|
||||
the necessary changes to support/shobj-conf and send the changes
|
||||
to bash-maintainers@gnu.org.
|
||||
|
||||
load with ld and whatever shared object options you need (again,
|
||||
look in the Makefile)
|
||||
Loadable builtins are loaded into a running shell with
|
||||
|
||||
then enable -f filename builtin-name
|
||||
enable -f filename builtin-name
|
||||
|
||||
enable uses a simple reference-counting scheme to avoid unloading a
|
||||
shared object that implements more than one loadable builtin before
|
||||
|
|
@ -24,4 +29,5 @@ all loadable builtins implemented in the object are removed.
|
|||
|
||||
Many of the details needed by builtin writers are found in hello.c,
|
||||
the canonical example. There is no real `builtin writers' programming
|
||||
guide'.
|
||||
guide'. The file template.c provides a template to use for creating
|
||||
new loadable builtins.
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ dirname_builtin (list)
|
|||
if (string[slen] == '/')
|
||||
break;
|
||||
|
||||
if (slen >= 0)
|
||||
if (slen < 0)
|
||||
{
|
||||
fputs (".\n", stdout);
|
||||
return (EXECUTION_SUCCESS);
|
||||
|
|
|
|||
|
|
@ -196,6 +196,13 @@ int m;
|
|||
obits[i++] = 'x';
|
||||
obits[i] = '\0';
|
||||
|
||||
if (m & S_ISUID)
|
||||
ubits[2] = (m & S_IXUSR) ? 's' : 'S';
|
||||
if (m & S_ISGID)
|
||||
gbits[2] = (m & S_IXGRP) ? 's' : 'S';
|
||||
if (m & S_ISVTX)
|
||||
obits[2] = (m & S_IXOTH) ? 't' : 'T';
|
||||
|
||||
printf ("u=%s,g=%s,o=%s", ubits, gbits, obits);
|
||||
}
|
||||
|
||||
|
|
@ -217,6 +224,10 @@ int mode;
|
|||
printf("S_IFLNK ");
|
||||
if (S_ISSOCK(mode))
|
||||
printf("S_IFSOCK ");
|
||||
#ifdef S_ISWHT
|
||||
if (S_ISWHT(mode))
|
||||
printf("S_ISWHT ");
|
||||
#endif
|
||||
perms(getperm(mode));
|
||||
printf("\n");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,19 +3,21 @@
|
|||
|
||||
/* See Makefile for compilation details. */
|
||||
|
||||
#include "config.h"
|
||||
#include <config.h>
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "builtins.h"
|
||||
#include "shell.h"
|
||||
#include "bashgetopt.h"
|
||||
|
||||
/* A builtin `xxx' is normally implemented with an `xxx_builtin' function.
|
||||
If you're converting a command that uses the normal Unix argc/argv
|
||||
calling convention, use argv = word_list_to_argv (list, &argc) and call
|
||||
calling convention, use argv = make_builtin_argv (list, &argc) and call
|
||||
the original `main' something like `xxx_main'. Look at cat.c for an
|
||||
example.
|
||||
|
||||
|
|
@ -41,7 +43,6 @@ hello_builtin (list)
|
|||
which is printed by `help xxx'. It must end with a NULL. */
|
||||
char *hello_doc[] = {
|
||||
"this is the long doc for the sample hello builtin",
|
||||
"which is a bare-bones echo",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
|
|
@ -53,7 +54,7 @@ struct builtin hello_struct = {
|
|||
hello_builtin, /* function implementing the builtin */
|
||||
BUILTIN_ENABLED, /* initial flags for builtin */
|
||||
hello_doc, /* array of long documentation strings. */
|
||||
"hello [args]", /* usage synopsis; becomes short_doc */
|
||||
"hello", /* usage synopsis; becomes short_doc */
|
||||
0 /* reserved for internal use */
|
||||
};
|
||||
|
||||
|
|
|
|||
308
examples/loadables/id.c
Normal file
308
examples/loadables/id.c
Normal file
|
|
@ -0,0 +1,308 @@
|
|||
/*
|
||||
* id - POSIX.2 user identity
|
||||
*
|
||||
* (INCOMPLETE -- supplementary groups for other users not yet done)
|
||||
*
|
||||
* usage: id [-Ggu] [-nr] [user]
|
||||
*
|
||||
* The default output format looks something like:
|
||||
* uid=xxx(chet) gid=xx groups=aa(aname), bb(bname), cc(cname)
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include "bashtypes.h"
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
#include "bashansi.h"
|
||||
|
||||
#ifdef HAVE_LIMITS_H
|
||||
# include <limits.h>
|
||||
#else
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
|
||||
#if !defined (HAVE_GETPW_DECLS)
|
||||
extern struct passwd *getpwuid ();
|
||||
#endif
|
||||
extern struct group *getgrgid ();
|
||||
|
||||
#include "shell.h"
|
||||
#include "builtins.h"
|
||||
#include "stdc.h"
|
||||
#include "common.h"
|
||||
#include "bashgetopt.h"
|
||||
|
||||
#define ID_ALLGROUPS 0x001 /* -G */
|
||||
#define ID_GIDONLY 0x002 /* -g */
|
||||
#define ID_USENAME 0x004 /* -n */
|
||||
#define ID_USEREAL 0x008 /* -r */
|
||||
#define ID_USERONLY 0x010 /* -u */
|
||||
|
||||
#define ID_FLAGSET(s) ((id_flags & (s)) != 0)
|
||||
|
||||
static int id_flags;
|
||||
|
||||
static uid_t ruid, euid;
|
||||
static gid_t rgid, egid;
|
||||
|
||||
static char *id_user;
|
||||
|
||||
static int inituser ();
|
||||
|
||||
static int id_pruser ();
|
||||
static int id_prgrp ();
|
||||
static int id_prgroups ();
|
||||
static int id_prall ();
|
||||
|
||||
int
|
||||
id_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int opt;
|
||||
char *user;
|
||||
|
||||
id_flags = 0;
|
||||
reset_internal_getopt ();
|
||||
while ((opt = internal_getopt (list, "Ggnru")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
case 'G': id_flags |= ID_ALLGROUPS; break;
|
||||
case 'g': id_flags |= ID_GIDONLY; break;
|
||||
case 'n': id_flags |= ID_USENAME; break;
|
||||
case 'r': id_flags |= ID_USEREAL; break;
|
||||
case 'u': id_flags |= ID_USERONLY; break;
|
||||
default:
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
}
|
||||
list = loptend;
|
||||
|
||||
user = list ? list->word->word : (char *)NULL;
|
||||
|
||||
/* Check for some invalid option combinations */
|
||||
opt = ID_FLAGSET (ID_ALLGROUPS) + ID_FLAGSET (ID_GIDONLY) + ID_FLAGSET (ID_USERONLY);
|
||||
if (opt > 1 || (opt == 0 && ((id_flags & (ID_USEREAL|ID_USENAME)) != 0)))
|
||||
{
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
|
||||
if (list && list->next)
|
||||
{
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
|
||||
if (inituser (user) < 0)
|
||||
return (EXECUTION_FAILURE);
|
||||
|
||||
opt = 0;
|
||||
if (id_flags & ID_USERONLY)
|
||||
opt += id_pruser ((id_flags & ID_USEREAL) ? ruid : euid);
|
||||
else if (id_flags & ID_GIDONLY)
|
||||
opt += id_prgrp ((id_flags & ID_USEREAL) ? rgid : egid);
|
||||
else if (id_flags & ID_ALLGROUPS)
|
||||
opt += id_prgroups (user);
|
||||
else
|
||||
opt += id_prall (user);
|
||||
putchar ('\n');
|
||||
fflush (stdout);
|
||||
|
||||
return (opt == 0 ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
static int
|
||||
inituser (uname)
|
||||
char *uname;
|
||||
{
|
||||
struct passwd *pwd;
|
||||
|
||||
if (uname)
|
||||
{
|
||||
pwd = getpwnam (uname);
|
||||
if (pwd == 0)
|
||||
{
|
||||
builtin_error ("%s: no such user", uname);
|
||||
return -1;
|
||||
}
|
||||
ruid = euid = pwd->pw_uid;
|
||||
rgid = egid = pwd->pw_gid;
|
||||
}
|
||||
else
|
||||
{
|
||||
ruid = current_user.uid;
|
||||
euid = current_user.euid;
|
||||
rgid = current_user.gid;
|
||||
egid = current_user.egid;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Print the name or value of user ID UID. */
|
||||
static int
|
||||
id_pruser (uid)
|
||||
int uid;
|
||||
{
|
||||
struct passwd *pwd = NULL;
|
||||
int r;
|
||||
|
||||
r = 0;
|
||||
if (id_flags & ID_USENAME)
|
||||
{
|
||||
pwd = getpwuid (uid);
|
||||
if (pwd == NULL)
|
||||
r = 1;
|
||||
}
|
||||
if (pwd)
|
||||
printf ("%s", pwd->pw_name);
|
||||
else
|
||||
printf ("%u", (unsigned) uid);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Print the name or value of group ID GID. */
|
||||
|
||||
static int
|
||||
id_prgrp (gid)
|
||||
int gid;
|
||||
{
|
||||
struct group *grp = NULL;
|
||||
int r;
|
||||
|
||||
r = 0;
|
||||
if (id_flags & ID_USENAME)
|
||||
{
|
||||
grp = getgrgid (gid);
|
||||
if (grp == NULL)
|
||||
r = 1;
|
||||
}
|
||||
|
||||
if (grp)
|
||||
printf ("%s", grp->gr_name);
|
||||
else
|
||||
printf ("%u", (unsigned) gid);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int
|
||||
id_prgroups (uname)
|
||||
char *uname;
|
||||
{
|
||||
int *glist, ng, i, r;
|
||||
|
||||
r = 0;
|
||||
id_prgrp (rgid);
|
||||
if (egid != rgid)
|
||||
{
|
||||
putchar (' ');
|
||||
id_prgrp (egid);
|
||||
}
|
||||
|
||||
if (uname)
|
||||
{
|
||||
builtin_error ("supplementary groups for other users not yet implemented");
|
||||
glist = (int *)NULL;
|
||||
ng = 0;
|
||||
r = 1;
|
||||
}
|
||||
else
|
||||
glist = get_group_array (&ng);
|
||||
|
||||
for (i = 0; i < ng; i++)
|
||||
if (glist[i] != rgid && glist[i] != egid)
|
||||
{
|
||||
putchar (' ');
|
||||
id_prgrp (glist[i]);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int
|
||||
id_prall (uname)
|
||||
char *uname;
|
||||
{
|
||||
int r, i, ng, *glist;
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
|
||||
r = 0;
|
||||
printf ("uid=%u", (unsigned) ruid);
|
||||
pwd = getpwuid (ruid);
|
||||
if (pwd == NULL)
|
||||
r = 1;
|
||||
else
|
||||
printf ("(%s)", pwd->pw_name);
|
||||
|
||||
printf (" gid=%u", (unsigned) rgid);
|
||||
grp = getgrgid (rgid);
|
||||
if (grp == NULL)
|
||||
r = 1;
|
||||
else
|
||||
printf ("(%s)", grp->gr_name);
|
||||
|
||||
if (euid != ruid)
|
||||
{
|
||||
printf (" euid=%u", (unsigned) euid);
|
||||
pwd = getpwuid (euid);
|
||||
if (pwd == NULL)
|
||||
r = 1;
|
||||
else
|
||||
printf ("(%s)", pwd->pw_name);
|
||||
}
|
||||
|
||||
if (egid != rgid)
|
||||
{
|
||||
printf (" egid=%u", (unsigned) egid);
|
||||
grp = getgrgid (egid);
|
||||
if (grp == NULL)
|
||||
r = 1;
|
||||
else
|
||||
printf ("(%s)", grp->gr_name);
|
||||
}
|
||||
|
||||
if (uname)
|
||||
{
|
||||
builtin_error ("supplementary groups for other users not yet implemented");
|
||||
glist = (int *)NULL;
|
||||
ng = 0;
|
||||
r = 1;
|
||||
}
|
||||
else
|
||||
glist = get_group_array (&ng);
|
||||
|
||||
if (ng > 0)
|
||||
printf (" groups=");
|
||||
for (i = 0; i < ng; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
printf (", ");
|
||||
printf ("%u", (unsigned) glist[i]);
|
||||
grp = getgrgid (glist[i]);
|
||||
if (grp == NULL)
|
||||
r = 1;
|
||||
else
|
||||
printf ("(%s)", grp->gr_name);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
char *id_doc[] = {
|
||||
"return information about user identity",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin id_struct = {
|
||||
"id",
|
||||
id_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
id_doc,
|
||||
"id [user]\n\tid -G [-n] [user]\n\tid -g [-nr] [user]\n\tid -u [-nr] [user]",
|
||||
0
|
||||
};
|
||||
203
examples/loadables/ln.c
Normal file
203
examples/loadables/ln.c
Normal file
|
|
@ -0,0 +1,203 @@
|
|||
/* ln - make links */
|
||||
|
||||
/* See Makefile for compilation details. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "bashtypes.h"
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "posixstat.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "builtins.h"
|
||||
#include "shell.h"
|
||||
#include "bashgetopt.h"
|
||||
|
||||
#if !defined (errno)
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#define LN_SYMLINK 0x01
|
||||
#define LN_UNLINK 0x02
|
||||
|
||||
static Function *linkfn;
|
||||
static int dolink ();
|
||||
|
||||
ln_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int rval, opt, flags;
|
||||
WORD_LIST *l;
|
||||
char *sdir;
|
||||
struct stat sb;
|
||||
|
||||
flags = 0;
|
||||
reset_internal_getopt ();
|
||||
while ((opt = internal_getopt (list, "fs")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
case 'f':
|
||||
flags |= LN_UNLINK;
|
||||
break;
|
||||
case 's':
|
||||
flags |= LN_SYMLINK;
|
||||
break;
|
||||
default:
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
}
|
||||
list = loptend;
|
||||
|
||||
if (list == 0)
|
||||
{
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
|
||||
linkfn = (flags & LN_SYMLINK) ? symlink : link;
|
||||
|
||||
if (list->next == 0) /* ln target, equivalent to ln target . */
|
||||
return (dolink (list->word->word, ".", flags));
|
||||
|
||||
if (list->next->next == 0) /* ln target source */
|
||||
return (dolink (list->word->word, list->next->word->word, flags));
|
||||
|
||||
/* ln target1 target2 ... directory */
|
||||
|
||||
/* find last argument: target directory, and make sure it's an existing
|
||||
directory. */
|
||||
for (l = list; l->next; l = l->next)
|
||||
;
|
||||
sdir = l->word->word;
|
||||
|
||||
if (stat(sdir, &sb) < 0)
|
||||
{
|
||||
builtin_error ("%s", sdir);
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
if (S_ISDIR (sb.st_mode) == 0)
|
||||
{
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
|
||||
for (rval = EXECUTION_SUCCESS; list != l; list = list->next)
|
||||
rval += dolink (list->word->word, sdir, flags);
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
static char *
|
||||
mkdirpath (dir, file)
|
||||
char *dir, *file;
|
||||
{
|
||||
int dlen, flen;
|
||||
char *ret;
|
||||
|
||||
dlen = strlen (dir);
|
||||
flen = strlen (file);
|
||||
|
||||
ret = xmalloc (2 + dlen + flen);
|
||||
|
||||
strcpy (ret, dir);
|
||||
if (ret[dlen - 1] != '/')
|
||||
ret[dlen++] = '/';
|
||||
strcpy (ret + dlen, file);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined (HAVE_LSTAT)
|
||||
# define LSTAT lstat
|
||||
#else
|
||||
# define LSTAT stat
|
||||
#endif
|
||||
|
||||
static int
|
||||
dolink (src, dst, flags)
|
||||
char *src, *dst;
|
||||
int flags;
|
||||
{
|
||||
struct stat ssb, dsb;
|
||||
int exists;
|
||||
char *dst_path, *p;
|
||||
|
||||
/* If we're not doing symlinks, the source must exist and not be a
|
||||
directory. */
|
||||
if ((flags & LN_SYMLINK) == 0)
|
||||
{
|
||||
if (stat (src, &ssb) != 0)
|
||||
{
|
||||
builtin_error ("%s: %s", src, strerror (errno));
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
if (S_ISDIR (ssb.st_mode))
|
||||
{
|
||||
errno = EISDIR;
|
||||
builtin_error ("%s: %s", src, strerror (errno));
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
/* If the destination is a directory, create the final filename by appending
|
||||
the basename of the source to the destination. */
|
||||
dst_path = 0;
|
||||
if ((stat (dst, &dsb) == 0) && S_ISDIR (dsb.st_mode))
|
||||
{
|
||||
if ((p = strrchr (src, '/')) == 0)
|
||||
p = src;
|
||||
else
|
||||
p++;
|
||||
|
||||
dst_path = mkdirpath (dst, p);
|
||||
dst = dst_path;
|
||||
}
|
||||
|
||||
exists = LSTAT (dst, &dsb) == 0;
|
||||
|
||||
/* If -f was specified, and the destination exists, unlink it. */
|
||||
if ((flags & LN_UNLINK) && exists && unlink (dst) != 0)
|
||||
{
|
||||
builtin_error ("%s: cannot unlink: %s", dst, strerror (errno));
|
||||
FREE (dst_path);
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
/* Perform the link. */
|
||||
if ((*linkfn) (src, dst) != 0)
|
||||
{
|
||||
builtin_error ("cannot link %s to %s: %s", dst, src, strerror (errno));
|
||||
FREE (dst_path);
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
FREE (dst_path);
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
char *ln_doc[] = {
|
||||
"Create a new directory entry with the same modes as the original",
|
||||
"file. The -f option means to unlink any existing file, permitting",
|
||||
"the link to occur. The -s option means to create a symbolic link.",
|
||||
"By default, ln makes hard links.",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
/* The standard structure describing a builtin command. bash keeps an array
|
||||
of these structures. */
|
||||
struct builtin ln_struct = {
|
||||
"ln", /* builtin name */
|
||||
ln_builtin, /* function implementing the builtin */
|
||||
BUILTIN_ENABLED, /* initial flags for builtin */
|
||||
ln_doc, /* array of long documentation strings. */
|
||||
"ln [-fs] file1 [file2] OR ln [-fs] file ... directory", /* usage synopsis; becomes short_doc */
|
||||
0 /* reserved for internal use */
|
||||
};
|
||||
216
examples/loadables/mkdir.c
Normal file
216
examples/loadables/mkdir.c
Normal file
|
|
@ -0,0 +1,216 @@
|
|||
/* mkdir - make directories */
|
||||
|
||||
/* See Makefile for compilation details. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "bashtypes.h"
|
||||
#include "posixstat.h"
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include "bashansi.h"
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "builtins.h"
|
||||
#include "shell.h"
|
||||
#include "bashgetopt.h"
|
||||
|
||||
#if !defined (errno)
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#define ISOCTAL(c) ((c) >= '0' && (c) <= '7')
|
||||
|
||||
extern int parse_symbolic_mode ();
|
||||
|
||||
static int make_path ();
|
||||
|
||||
static int original_umask;
|
||||
|
||||
int
|
||||
mkdir_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int opt, pflag, omode, rval, octal, nmode, parent_mode, um;
|
||||
char *mode;
|
||||
WORD_LIST *l;
|
||||
|
||||
reset_internal_getopt ();
|
||||
pflag = 0;
|
||||
mode = (char *)NULL;
|
||||
while ((opt = internal_getopt(list, "m:p")) != -1)
|
||||
switch (opt)
|
||||
{
|
||||
case 'p':
|
||||
pflag = 1;
|
||||
break;
|
||||
case 'm':
|
||||
mode = list_optarg;
|
||||
break;
|
||||
default:
|
||||
builtin_usage();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
list = loptend;
|
||||
|
||||
if (list == 0)
|
||||
{
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
|
||||
if (mode == NULL)
|
||||
omode = S_IRWXU | S_IRWXG | S_IRWXO; /* a=rwx */
|
||||
else if (ISOCTAL (*mode)) /* octal number */
|
||||
{
|
||||
omode = read_octal (mode);
|
||||
if (omode < 0)
|
||||
{
|
||||
builtin_error ("invalid file mode: %s", mode);
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
octal = 1;
|
||||
}
|
||||
else if (mode)
|
||||
{
|
||||
/* initial bits are a=rwx; the mode argument modifies them */
|
||||
omode = parse_symbolic_mode (mode, S_IRWXU | S_IRWXG | S_IRWXO);
|
||||
if (omode < 0)
|
||||
{
|
||||
builtin_error ("invalid file mode: %s", mode);
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
octal = 0;
|
||||
}
|
||||
|
||||
/* Make the new mode */
|
||||
original_umask = umask (0);
|
||||
umask (original_umask);
|
||||
|
||||
nmode = (S_IRWXU | S_IRWXG | S_IRWXO) & ~original_umask;
|
||||
parent_mode = nmode | (S_IWRITE|S_IEXEC); /* u+wx */
|
||||
|
||||
/* Adjust new mode based on mode argument */
|
||||
nmode &= omode;
|
||||
|
||||
for (rval = EXECUTION_SUCCESS, l = list; l; l = l->next)
|
||||
{
|
||||
if (pflag && make_path (l->word->word, nmode, parent_mode))
|
||||
{
|
||||
rval = EXECUTION_FAILURE;
|
||||
continue;
|
||||
}
|
||||
else if (pflag == 0 && mkdir (l->word->word, nmode) < 0)
|
||||
{
|
||||
builtin_error ("cannot create directory `%s': %s", l->word->word, strerror (errno));
|
||||
rval = EXECUTION_FAILURE;
|
||||
}
|
||||
}
|
||||
return rval;
|
||||
}
|
||||
|
||||
/* Make all the directories leading up to PATH, then create PATH. Note that
|
||||
this changes the process's umask; make sure that all paths leading to a
|
||||
return reset it to ORIGINAL_UMASK */
|
||||
static int
|
||||
make_path (path, nmode, parent_mode)
|
||||
char *path;
|
||||
int nmode, parent_mode;
|
||||
{
|
||||
int oumask;
|
||||
struct stat sb;
|
||||
char *p, *npath;
|
||||
|
||||
if (stat (path, &sb) == 0)
|
||||
{
|
||||
if (S_ISDIR (sb.st_mode) == 0)
|
||||
{
|
||||
builtin_error ("`%s': file exists but is not a directory", path);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (chmod (path, nmode))
|
||||
{
|
||||
builtin_error ("%s: %s", path, strerror (errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
oumask = umask (0);
|
||||
npath = savestring (path); /* So we can write to it. */
|
||||
|
||||
/* Check whether or not we need to do anything with intermediate dirs. */
|
||||
|
||||
/* Skip leading slashes. */
|
||||
p = npath;
|
||||
while (*p == '/')
|
||||
p++;
|
||||
|
||||
while (p = strchr (p, '/'))
|
||||
{
|
||||
*p = '\0';
|
||||
if (stat (npath, &sb) != 0)
|
||||
{
|
||||
if (mkdir (npath, parent_mode))
|
||||
{
|
||||
builtin_error ("cannot create directory `%s': %s", npath, strerror (errno));
|
||||
umask (original_umask);
|
||||
free (npath);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (S_ISDIR (sb.st_mode) == 0)
|
||||
{
|
||||
builtin_error ("`%s': file exists but is not a directory", npath);
|
||||
umask (original_umask);
|
||||
free (npath);
|
||||
return 1;
|
||||
}
|
||||
|
||||
*p++ = '/'; /* restore slash */
|
||||
while (*p == '/')
|
||||
p++;
|
||||
}
|
||||
|
||||
/* Create the final directory component. */
|
||||
if (stat (npath, &sb) && mkdir (npath, nmode))
|
||||
{
|
||||
builtin_error ("cannot create directory `%s': %s", npath, strerror (errno));
|
||||
umask (original_umask);
|
||||
free (npath);
|
||||
return 1;
|
||||
}
|
||||
|
||||
umask (original_umask);
|
||||
free (npath);
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *mkdir_doc[] = {
|
||||
"Make directories. Create the directories named as arguments, in",
|
||||
"the order specified, using mode rwxrwxrwx as modified by the current",
|
||||
"umask (see `help umask'). The -m option causes the file permission",
|
||||
"bits of the final directory to be MODE. The MODE argument may be",
|
||||
"an octal number or a symbolic mode like that used by chmod(1). If",
|
||||
"a symbolic mode is used, the operations are interpreted relative to",
|
||||
"an initial mode of \"a=rwx\". The -p option causes any required",
|
||||
"intermediate directories in PATH to be created. The directories",
|
||||
"are created with permssion bits of rwxrwxrwx as modified by the current",
|
||||
"umask, plus write and search permissions for the owner. mkdir",
|
||||
"returns 0 if the directories are created successfully, and non-zero",
|
||||
"if an error occurs.",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin mkdir_struct = {
|
||||
"mkdir",
|
||||
mkdir_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
mkdir_doc,
|
||||
"mkdir [-p] [-m mode] directory [directory ...]",
|
||||
0
|
||||
};
|
||||
|
|
@ -22,7 +22,7 @@ char *necho_doc[] = {
|
|||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin echo_struct = {
|
||||
struct builtin necho_struct = {
|
||||
"echo",
|
||||
necho_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
|
|
|
|||
|
|
@ -170,8 +170,7 @@ portable_chars_only (path)
|
|||
for (p = path; *p; ++p)
|
||||
if (portable_chars[(const unsigned char) *p] == 0)
|
||||
{
|
||||
error (0, 0, "path `%s' contains nonportable character `%c'",
|
||||
path, *p);
|
||||
builtin_error ("path `%s' contains nonportable character `%c'", path, *p);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
|
|
@ -212,7 +211,7 @@ dir_ok (path)
|
|||
|
||||
if (!S_ISDIR (stats.st_mode))
|
||||
{
|
||||
error (0, 0, "`%s' is not a directory", path);
|
||||
builtin_error ("`%s' is not a directory", path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -324,7 +323,7 @@ validate_path (path, portability)
|
|||
name_max = _POSIX_NAME_MAX;
|
||||
if (length > name_max)
|
||||
{
|
||||
error (0, 0, "name `%s' has length %d; exceeds limit of %d",
|
||||
builtin_error ("name `%s' has length %d; exceeds limit of %d",
|
||||
start, length, name_max);
|
||||
free (parent);
|
||||
return 1;
|
||||
|
|
@ -350,7 +349,7 @@ validate_path (path, portability)
|
|||
free (parent);
|
||||
if (strlen (path) > path_max)
|
||||
{
|
||||
error (0, 0, "path `%s' has length %d; exceeds limit of %d",
|
||||
builtin_error ("path `%s' has length %d; exceeds limit of %d",
|
||||
path, strlen (path), path_max);
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
71
examples/loadables/printenv.c
Normal file
71
examples/loadables/printenv.c
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* printenv -- minimal builtin clone of BSD printenv(1).
|
||||
*
|
||||
* usage: printenv [varname]
|
||||
*
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "builtins.h"
|
||||
#include "shell.h"
|
||||
#include "bashgetopt.h"
|
||||
|
||||
extern char **export_env;
|
||||
|
||||
int
|
||||
printenv_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
register char **envp;
|
||||
int opt;
|
||||
SHELL_VAR *var;
|
||||
|
||||
reset_internal_getopt ();
|
||||
while ((opt = internal_getopt (list, "")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
default:
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
}
|
||||
list = loptend;
|
||||
|
||||
/* printenv */
|
||||
if (list == 0)
|
||||
{
|
||||
maybe_make_export_env (); /* this allows minimal code */
|
||||
for (envp = export_env; *envp; envp++)
|
||||
printf ("%s\n", *envp);
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
/* printenv varname */
|
||||
var = find_variable (list->word->word);
|
||||
if (var == 0 || (exported_p (var) == 0))
|
||||
return (EXECUTION_FAILURE);
|
||||
|
||||
if (function_p (var))
|
||||
print_var_function (var);
|
||||
else
|
||||
print_var_value (var, 0);
|
||||
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
char *printenv_doc[] = {
|
||||
"print values of environment variables",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin printenv_struct = {
|
||||
"printenv",
|
||||
printenv_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
printenv_doc,
|
||||
"printenv [varname]",
|
||||
0
|
||||
};
|
||||
|
|
@ -1,608 +0,0 @@
|
|||
/* pushd.c, created from pushd.def. */
|
||||
#include <config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "bashansi.h"
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <tilde/tilde.h>
|
||||
|
||||
#include "shell.h"
|
||||
#include "builtins.h"
|
||||
#include "maxpath.h"
|
||||
#include "common.h"
|
||||
|
||||
#if !defined (errno)
|
||||
extern int errno;
|
||||
#endif /* !errno */
|
||||
|
||||
static char *m_badarg = "%s: bad argument";
|
||||
|
||||
/* The list of remembered directories. */
|
||||
static char **pushd_directory_list = (char **)NULL;
|
||||
|
||||
/* Number of existing slots in this list. */
|
||||
static int directory_list_size;
|
||||
|
||||
/* Offset to the end of the list. */
|
||||
static int directory_list_offset;
|
||||
|
||||
static void pushd_error ();
|
||||
static void clear_directory_stack ();
|
||||
static int cd_to_string ();
|
||||
static int change_to_temp ();
|
||||
static int get_dirstack_index ();
|
||||
static void add_dirstack_element ();
|
||||
|
||||
#define NOCD 0x01
|
||||
#define ROTATE 0x02
|
||||
#define LONGFORM 0x04
|
||||
#define CLEARSTAK 0x08
|
||||
|
||||
int
|
||||
pushd_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
char *temp, *current_directory, *top;
|
||||
int j, flags;
|
||||
long num;
|
||||
char direction;
|
||||
|
||||
/* If there is no argument list then switch current and
|
||||
top of list. */
|
||||
if (list == 0)
|
||||
{
|
||||
if (directory_list_offset == 0)
|
||||
{
|
||||
builtin_error ("no other directory");
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
current_directory = get_working_directory ("pushd");
|
||||
if (current_directory == 0)
|
||||
return (EXECUTION_FAILURE);
|
||||
|
||||
j = directory_list_offset - 1;
|
||||
temp = pushd_directory_list[j];
|
||||
pushd_directory_list[j] = current_directory;
|
||||
j = change_to_temp (temp);
|
||||
free (temp);
|
||||
return j;
|
||||
}
|
||||
|
||||
for (flags = 0; list; list = list->next)
|
||||
{
|
||||
if (ISOPTION (list->word->word, 'n'))
|
||||
{
|
||||
flags |= NOCD;
|
||||
}
|
||||
else if (ISOPTION (list->word->word, '-'))
|
||||
{
|
||||
list = list->next;
|
||||
break;
|
||||
}
|
||||
else if (list->word->word[0] == '-' && list->word->word[1] == '\0')
|
||||
/* Let `pushd -' work like it used to. */
|
||||
break;
|
||||
else if (((direction = list->word->word[0]) == '+') || direction == '-')
|
||||
{
|
||||
if (legal_number (list->word->word + 1, &num) == 0)
|
||||
{
|
||||
builtin_error (m_badarg, list->word->word);
|
||||
builtin_usage ();
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
if (direction == '-')
|
||||
num = directory_list_offset - num;
|
||||
|
||||
if (num > directory_list_offset || num < 0)
|
||||
{
|
||||
pushd_error (directory_list_offset, list->word->word);
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
flags |= ROTATE;
|
||||
}
|
||||
else if (*list->word->word == '-')
|
||||
{
|
||||
bad_option (list->word->word);
|
||||
builtin_usage ();
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (flags & ROTATE)
|
||||
{
|
||||
/* Rotate the stack num times. Remember, the current
|
||||
directory acts like it is part of the stack. */
|
||||
temp = get_working_directory ("pushd");
|
||||
|
||||
if (num == 0)
|
||||
{
|
||||
j = ((flags & NOCD) == 0) ? change_to_temp (temp) : EXECUTION_SUCCESS;
|
||||
free (temp);
|
||||
return j;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
top = pushd_directory_list[directory_list_offset - 1];
|
||||
|
||||
for (j = directory_list_offset - 2; j > -1; j--)
|
||||
pushd_directory_list[j + 1] = pushd_directory_list[j];
|
||||
|
||||
pushd_directory_list[j + 1] = temp;
|
||||
|
||||
temp = top;
|
||||
num--;
|
||||
}
|
||||
while (num);
|
||||
|
||||
j = ((flags & NOCD) == 0) ? change_to_temp (temp) : EXECUTION_SUCCESS;
|
||||
free (temp);
|
||||
return j;
|
||||
}
|
||||
|
||||
if (list == 0)
|
||||
return (EXECUTION_SUCCESS);
|
||||
|
||||
/* Change to the directory in list->word->word. Save the current
|
||||
directory on the top of the stack. */
|
||||
current_directory = get_working_directory ("pushd");
|
||||
if (current_directory == 0)
|
||||
return (EXECUTION_FAILURE);
|
||||
|
||||
j = ((flags & NOCD) == 0) ? cd_builtin (list) : EXECUTION_SUCCESS;
|
||||
if (j == EXECUTION_SUCCESS)
|
||||
{
|
||||
add_dirstack_element ((flags & NOCD) ? savestring (list->word->word) : current_directory);
|
||||
dirs_builtin ((WORD_LIST *)NULL);
|
||||
if (flags & NOCD)
|
||||
free (current_directory);
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
else
|
||||
{
|
||||
free (current_directory);
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
/* Pop the directory stack, and then change to the new top of the stack.
|
||||
If LIST is non-null it should consist of a word +N or -N, which says
|
||||
what element to delete from the stack. The default is the top one. */
|
||||
int
|
||||
popd_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
register int i;
|
||||
long which;
|
||||
int flags;
|
||||
char direction;
|
||||
char *which_word;
|
||||
|
||||
which_word = (char *)NULL;
|
||||
for (flags = 0, which = 0L, direction = '+'; list; list = list->next)
|
||||
{
|
||||
if (ISOPTION (list->word->word, 'n'))
|
||||
{
|
||||
flags |= NOCD;
|
||||
}
|
||||
else if (ISOPTION (list->word->word, '-'))
|
||||
{
|
||||
list = list->next;
|
||||
break;
|
||||
}
|
||||
else if (((direction = list->word->word[0]) == '+') || direction == '-')
|
||||
{
|
||||
if (legal_number (list->word->word + 1, &which) == 0)
|
||||
{
|
||||
builtin_error (m_badarg, list->word->word);
|
||||
builtin_usage ();
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
which_word = list->word->word;
|
||||
}
|
||||
else if (*list->word->word == '-')
|
||||
{
|
||||
bad_option (list->word->word);
|
||||
builtin_usage ();
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (which > directory_list_offset || (directory_list_offset == 0 && which == 0))
|
||||
{
|
||||
pushd_error (directory_list_offset, which_word ? which_word : "");
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
/* Handle case of no specification, or top of stack specification. */
|
||||
if ((direction == '+' && which == 0) ||
|
||||
(direction == '-' && which == directory_list_offset))
|
||||
{
|
||||
i = ((flags & NOCD) == 0) ? cd_to_string (pushd_directory_list[directory_list_offset - 1])
|
||||
: EXECUTION_SUCCESS;
|
||||
if (i != EXECUTION_SUCCESS)
|
||||
return (i);
|
||||
free (pushd_directory_list[--directory_list_offset]);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Since an offset other than the top directory was specified,
|
||||
remove that directory from the list and shift the remainder
|
||||
of the list into place. */
|
||||
i = (direction == '+') ? directory_list_offset - which : which;
|
||||
free (pushd_directory_list[i]);
|
||||
directory_list_offset--;
|
||||
|
||||
/* Shift the remainder of the list into place. */
|
||||
for (; i < directory_list_offset; i++)
|
||||
pushd_directory_list[i] = pushd_directory_list[i + 1];
|
||||
}
|
||||
|
||||
dirs_builtin ((WORD_LIST *)NULL);
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
/* Print the current list of directories on the directory stack. */
|
||||
int
|
||||
dirs_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int flags, desired_index, index_flag, vflag;
|
||||
long i;
|
||||
char *temp, *w;
|
||||
|
||||
for (flags = vflag = index_flag = 0, desired_index = -1, w = ""; list; list = list->next)
|
||||
{
|
||||
if (ISOPTION (list->word->word, 'l'))
|
||||
{
|
||||
flags |= LONGFORM;
|
||||
}
|
||||
else if (ISOPTION (list->word->word, 'c'))
|
||||
{
|
||||
flags |= CLEARSTAK;
|
||||
}
|
||||
else if (ISOPTION (list->word->word, 'v'))
|
||||
{
|
||||
vflag |= 2;
|
||||
}
|
||||
else if (ISOPTION (list->word->word, 'p'))
|
||||
{
|
||||
vflag |= 1;
|
||||
}
|
||||
else if (ISOPTION (list->word->word, '-'))
|
||||
{
|
||||
list = list->next;
|
||||
break;
|
||||
}
|
||||
else if (*list->word->word == '+' || *list->word->word == '-')
|
||||
{
|
||||
int sign;
|
||||
if (legal_number (w = list->word->word + 1, &i) == 0)
|
||||
{
|
||||
builtin_error (m_badarg, list->word->word);
|
||||
builtin_usage ();
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
sign = (*list->word->word == '+') ? 1 : -1;
|
||||
desired_index = get_dirstack_index (i, sign, &index_flag);
|
||||
}
|
||||
else
|
||||
{
|
||||
bad_option (list->word->word);
|
||||
builtin_usage ();
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & CLEARSTAK)
|
||||
{
|
||||
clear_directory_stack ();
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
if (index_flag && (desired_index < 0 || desired_index > directory_list_offset))
|
||||
{
|
||||
pushd_error (directory_list_offset, w);
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
#define DIRSTACK_FORMAT(temp) \
|
||||
(flags & LONGFORM) ? temp : polite_directory_format (temp)
|
||||
|
||||
/* The first directory printed is always the current working directory. */
|
||||
if (index_flag == 0 || (index_flag == 1 && desired_index == 0))
|
||||
{
|
||||
temp = get_working_directory ("dirs");
|
||||
if (temp == 0)
|
||||
temp = savestring ("<no current directory>");
|
||||
if (vflag & 2)
|
||||
printf ("%2d %s", 0, DIRSTACK_FORMAT (temp));
|
||||
else
|
||||
printf ("%s", DIRSTACK_FORMAT (temp));
|
||||
free (temp);
|
||||
if (index_flag)
|
||||
{
|
||||
putchar ('\n');
|
||||
return EXECUTION_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
#define DIRSTACK_ENTRY(i) \
|
||||
(flags & LONGFORM) ? pushd_directory_list[i] \
|
||||
: polite_directory_format (pushd_directory_list[i])
|
||||
|
||||
/* Now print the requested directory stack entries. */
|
||||
if (index_flag)
|
||||
{
|
||||
if (vflag & 2)
|
||||
printf ("%2d %s", directory_list_offset - desired_index,
|
||||
DIRSTACK_ENTRY (desired_index));
|
||||
else
|
||||
printf ("%s", DIRSTACK_ENTRY (desired_index));
|
||||
}
|
||||
else
|
||||
for (i = directory_list_offset - 1; i >= 0; i--)
|
||||
if (vflag >= 2)
|
||||
printf ("\n%2d %s", directory_list_offset - (int)i, DIRSTACK_ENTRY (i));
|
||||
else
|
||||
printf ("%s%s", (vflag & 1) ? "\n" : " ", DIRSTACK_ENTRY (i));
|
||||
|
||||
putchar ('\n');
|
||||
fflush (stdout);
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
static void
|
||||
pushd_error (offset, arg)
|
||||
int offset;
|
||||
char *arg;
|
||||
{
|
||||
if (offset == 0)
|
||||
builtin_error ("directory stack empty");
|
||||
else if (arg)
|
||||
builtin_error ("%s: bad directory stack index", arg);
|
||||
else
|
||||
builtin_error ("bad directory stack index");
|
||||
}
|
||||
|
||||
static void
|
||||
clear_directory_stack ()
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; i < directory_list_offset; i++)
|
||||
free (pushd_directory_list[i]);
|
||||
directory_list_offset = 0;
|
||||
}
|
||||
|
||||
/* Switch to the directory in NAME. This uses the cd_builtin to do the work,
|
||||
so if the result is EXECUTION_FAILURE then an error message has already
|
||||
been printed. */
|
||||
static int
|
||||
cd_to_string (name)
|
||||
char *name;
|
||||
{
|
||||
WORD_LIST *tlist;
|
||||
int result;
|
||||
|
||||
tlist = make_word_list (make_word (name), NULL);
|
||||
result = cd_builtin (tlist);
|
||||
dispose_words (tlist);
|
||||
return (result);
|
||||
}
|
||||
|
||||
static int
|
||||
change_to_temp (temp)
|
||||
char *temp;
|
||||
{
|
||||
int tt;
|
||||
|
||||
tt = temp ? cd_to_string (temp) : EXECUTION_FAILURE;
|
||||
|
||||
if (tt == EXECUTION_SUCCESS)
|
||||
dirs_builtin ((WORD_LIST *)NULL);
|
||||
|
||||
return (tt);
|
||||
}
|
||||
|
||||
static void
|
||||
add_dirstack_element (dir)
|
||||
char *dir;
|
||||
{
|
||||
int j;
|
||||
|
||||
if (directory_list_offset == directory_list_size)
|
||||
{
|
||||
j = (directory_list_size += 10) * sizeof (char *);
|
||||
pushd_directory_list = (char **)xrealloc (pushd_directory_list, j);
|
||||
}
|
||||
pushd_directory_list[directory_list_offset++] = dir;
|
||||
}
|
||||
|
||||
static int
|
||||
get_dirstack_index (ind, sign, indexp)
|
||||
int ind, sign, *indexp;
|
||||
{
|
||||
if (indexp)
|
||||
*indexp = sign > 0 ? 1 : 2;
|
||||
|
||||
/* dirs +0 prints the current working directory. */
|
||||
/* dirs -0 prints last element in directory stack */
|
||||
if (ind == 0 && sign > 0)
|
||||
return 0;
|
||||
else if (ind == directory_list_offset)
|
||||
{
|
||||
if (indexp)
|
||||
*indexp = sign > 0 ? 2 : 1;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
return (sign > 0 ? directory_list_offset - ind : ind);
|
||||
}
|
||||
|
||||
char *
|
||||
get_dirstack_element (ind, sign)
|
||||
int ind, sign;
|
||||
{
|
||||
int i;
|
||||
|
||||
i = get_dirstack_index (ind, sign, (int *)NULL);
|
||||
return (i < 0 || i > directory_list_offset) ? (char *)NULL
|
||||
: pushd_directory_list[i];
|
||||
}
|
||||
|
||||
void
|
||||
set_dirstack_element (ind, sign, value)
|
||||
int ind, sign;
|
||||
char *value;
|
||||
{
|
||||
int i;
|
||||
|
||||
i = get_dirstack_index (ind, sign, (int *)NULL);
|
||||
if (ind == 0 || i < 0 || i > directory_list_offset)
|
||||
return;
|
||||
free (pushd_directory_list[i]);
|
||||
pushd_directory_list[i] = savestring (value);
|
||||
}
|
||||
|
||||
WORD_LIST *
|
||||
get_directory_stack ()
|
||||
{
|
||||
register int i;
|
||||
WORD_LIST *ret;
|
||||
char *d, *t;
|
||||
|
||||
for (ret = (WORD_LIST *)NULL, i = 0; i < directory_list_offset; i++)
|
||||
{
|
||||
d = polite_directory_format (pushd_directory_list[i]);
|
||||
ret = make_word_list (make_word (d), ret);
|
||||
}
|
||||
/* Now the current directory. */
|
||||
d = get_working_directory ("dirstack");
|
||||
i = 0; /* sentinel to decide whether or not to free d */
|
||||
if (d == 0)
|
||||
d = ".";
|
||||
else
|
||||
{
|
||||
t = polite_directory_format (d);
|
||||
/* polite_directory_format sometimes returns its argument unchanged.
|
||||
If it does not, we can free d right away. If it does, we need to
|
||||
mark d to be deleted later. */
|
||||
if (t != d)
|
||||
{
|
||||
free (d);
|
||||
d = t;
|
||||
}
|
||||
else /* t == d, so d is what we want */
|
||||
i = 1;
|
||||
}
|
||||
ret = make_word_list (make_word (d), ret);
|
||||
if (i)
|
||||
free (d);
|
||||
return ret; /* was (REVERSE_LIST (ret, (WORD_LIST *)); */
|
||||
}
|
||||
|
||||
static char *dirs_doc[] = {
|
||||
"Display the list of currently remembered directories. Directories",
|
||||
"find their way onto the list with the `pushd' command; you can get",
|
||||
"back up through the list with the `popd' command.",
|
||||
"",
|
||||
"The -l flag specifies that `dirs' should not print shorthand versions",
|
||||
"of directories which are relative to your home directory. This means",
|
||||
"that `~/bin' might be displayed as `/homes/bfox/bin'. The -v flag",
|
||||
"causes `dirs' to print the directory stack with one entry per line,",
|
||||
"prepending the directory name with its position in the stack. The -p",
|
||||
"flag does the same thing, but the stack position is not prepended.",
|
||||
"The -c flag clears the directory stack by deleting all of the elements.",
|
||||
"",
|
||||
"+N displays the Nth entry counting from the left of the list shown by",
|
||||
" dirs when invoked without options, starting with zero.",
|
||||
"",
|
||||
"-N displays the Nth entry counting from the right of the list shown by",
|
||||
" dirs when invoked without options, starting with zero.",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
static char *pushd_doc[] = {
|
||||
"Adds a directory to the top of the directory stack, or rotates",
|
||||
"the stack, making the new top of the stack the current working",
|
||||
"directory. With no arguments, exchanges the top two directories.",
|
||||
"",
|
||||
"+N Rotates the stack so that the Nth directory (counting",
|
||||
" from the left of the list shown by `dirs', starting with"
|
||||
" zero) is at the top.",
|
||||
"",
|
||||
"-N Rotates the stack so that the Nth directory (counting",
|
||||
" from the right of the list shown by `dirs', starting with"
|
||||
" zero) is at the top.",
|
||||
"",
|
||||
"-n suppress the normal change of directory when adding directories",
|
||||
" to the stack, so only the stack is manipulated.",
|
||||
"",
|
||||
"dir adds DIR to the directory stack at the top, making it the",
|
||||
" new current working directory.",
|
||||
"",
|
||||
"You can see the directory stack with the `dirs' command.",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
static char *popd_doc[] = {
|
||||
"Removes entries from the directory stack. With no arguments,",
|
||||
"removes the top directory from the stack, and cd's to the new",
|
||||
"top directory.",
|
||||
"",
|
||||
"+N removes the Nth entry counting from the left of the list",
|
||||
" shown by `dirs', starting with zero. For example: `popd +0'",
|
||||
" removes the first directory, `popd +1' the second.",
|
||||
"",
|
||||
"-N removes the Nth entry counting from the right of the list",
|
||||
" shown by `dirs', starting with zero. For example: `popd -0'",
|
||||
" removes the last directory, `popd -1' the next to last.",
|
||||
"",
|
||||
"-n suppress the normal change of directory when removing directories",
|
||||
" from the stack, so only the stack is manipulated.",
|
||||
"",
|
||||
"You can see the directory stack with the `dirs' command.",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin pushd_struct = {
|
||||
"pushd",
|
||||
pushd_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
pushd_doc,
|
||||
"pushd [+N | -N] [-n] [dir]",
|
||||
0
|
||||
};
|
||||
|
||||
struct builtin popd_struct = {
|
||||
"popd",
|
||||
popd_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
popd_doc,
|
||||
"popd [+N | -N] [-n]",
|
||||
0
|
||||
};
|
||||
|
||||
struct builtin dirs_struct = {
|
||||
"dirs",
|
||||
dirs_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
dirs_doc,
|
||||
"dirs [-clpv] [+N] [-N]",
|
||||
0
|
||||
};
|
||||
|
|
@ -60,6 +60,8 @@ long sec, usec;
|
|||
/*
|
||||
* An incredibly simplistic floating point converter.
|
||||
*/
|
||||
static int multiplier[7] = { 1, 100000, 10000, 1000, 100, 10, 1 };
|
||||
|
||||
static int
|
||||
convert(s, sp, usp)
|
||||
char *s;
|
||||
|
|
@ -95,18 +97,11 @@ long *sp, *usp;
|
|||
}
|
||||
|
||||
/* Now convert to millionths */
|
||||
if (n == 1)
|
||||
usec *= 100000;
|
||||
else if (n == 2)
|
||||
usec *= 10000;
|
||||
else if (n == 3)
|
||||
usec *= 1000;
|
||||
else if (n == 4)
|
||||
usec *= 100;
|
||||
else if (n == 5)
|
||||
usec *= 10;
|
||||
else if (n == 6 && p[6] && isdigit(p[6]) && p[6] >= '5')
|
||||
usec *= multiplier[n];
|
||||
|
||||
if (n == 6 && p[6] && isdigit(p[6]) && p[6] >= '5')
|
||||
usec++; /* round up 1 */
|
||||
|
||||
RETURN(1);
|
||||
}
|
||||
|
||||
|
|
|
|||
32
examples/loadables/sync.c
Normal file
32
examples/loadables/sync.c
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
/* sync - sync the disks by forcing pending filesystem writes to complete */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "builtins.h"
|
||||
#include "shell.h"
|
||||
#include "bashgetopt.h"
|
||||
|
||||
sync_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
sync();
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
char *sync_doc[] = {
|
||||
"force completion of pending disk writes",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin sync_struct = {
|
||||
"sync", /* builtin name */
|
||||
sync_builtin, /* function implementing the builtin */
|
||||
BUILTIN_ENABLED, /* initial flags for builtin */
|
||||
sync_doc, /* array of long documentation strings. */
|
||||
"sync", /* usage synopsis; becomes short_doc */
|
||||
0 /* reserved for internal use */
|
||||
};
|
||||
56
examples/loadables/template.c
Normal file
56
examples/loadables/template.c
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
/* template - example template for loadable builtin */
|
||||
|
||||
/* See Makefile for compilation details. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
#include "bashansi.h"
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "builtins.h"
|
||||
#include "shell.h"
|
||||
#include "bashgetopt.h"
|
||||
|
||||
#if !defined (errno)
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
extern char *strerror ();
|
||||
|
||||
template_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int opt, rval;
|
||||
|
||||
rval = EXECUTION_SUCCESS;
|
||||
reset_internal_getopt ();
|
||||
while ((opt = internal_getopt (list, "")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
default:
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
}
|
||||
list = loptend;
|
||||
|
||||
return (rval);
|
||||
}
|
||||
|
||||
char *template_doc[] = {
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin template_struct = {
|
||||
"template", /* builtin name */
|
||||
template_builtin, /* function implementing the builtin */
|
||||
BUILTIN_ENABLED, /* initial flags for builtin */
|
||||
template_doc, /* array of long documentation strings. */
|
||||
"template", /* usage synopsis; becomes short_doc */
|
||||
0 /* reserved for internal use */
|
||||
};
|
||||
139
examples/loadables/uname.c
Normal file
139
examples/loadables/uname.c
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* uname - print system information
|
||||
*
|
||||
* usage: uname [-amnrsv]
|
||||
*
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "bashtypes.h"
|
||||
|
||||
#if defined (HAVE_UNAME)
|
||||
# include <sys/utsname.h>
|
||||
#else
|
||||
struct utsname {
|
||||
char sysname[32];
|
||||
char nodename[32];
|
||||
char release[32];
|
||||
char version[32];
|
||||
char machine[32];
|
||||
};
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include "builtins.h"
|
||||
#include "shell.h"
|
||||
#include "bashgetopt.h"
|
||||
|
||||
#define FLAG_SYSNAME 0x01 /* -s */
|
||||
#define FLAG_NODENAME 0x02 /* -n */
|
||||
#define FLAG_RELEASE 0x04 /* -r */
|
||||
#define FLAG_VERSION 0x08 /* -v */
|
||||
#define FLAG_MACHINE 0x10 /* -m, -p */
|
||||
|
||||
#define FLAG_ALL 0x1f
|
||||
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
static void uprint();
|
||||
|
||||
static int uname_flags;
|
||||
|
||||
uname_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int opt, r;
|
||||
struct utsname uninfo;
|
||||
|
||||
uname_flags = 0;
|
||||
reset_internal_getopt ();
|
||||
while ((opt = internal_getopt (list, "amnprsv")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
case 'a':
|
||||
uname_flags |= FLAG_ALL;
|
||||
break;
|
||||
case 'm':
|
||||
case 'p':
|
||||
uname_flags |= FLAG_MACHINE;
|
||||
break;
|
||||
case 'n':
|
||||
uname_flags |= FLAG_NODENAME;
|
||||
break;
|
||||
case 'r':
|
||||
uname_flags |= FLAG_RELEASE;
|
||||
break;
|
||||
case 's':
|
||||
uname_flags |= FLAG_SYSNAME;
|
||||
break;
|
||||
case 'v':
|
||||
uname_flags |= FLAG_VERSION;
|
||||
break;
|
||||
default:
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
}
|
||||
list = loptend;
|
||||
|
||||
if (list)
|
||||
{
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
|
||||
if (uname_flags == 0)
|
||||
uname_flags = FLAG_SYSNAME;
|
||||
|
||||
/* Only ancient systems will not have uname(2). */
|
||||
#ifdef HAVE_UNAME
|
||||
if (uname (&uninfo) < 0)
|
||||
{
|
||||
builtin_error ("cannot get system name: %s", strerror (errno));
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
#else
|
||||
builtin_error ("cannot get system information: uname(2) not available");
|
||||
return (EXECUTION_FAILURE);
|
||||
#endif
|
||||
|
||||
uprint (FLAG_SYSNAME, uninfo.sysname);
|
||||
uprint (FLAG_NODENAME, uninfo.nodename);
|
||||
uprint (FLAG_RELEASE, uninfo.release);
|
||||
uprint (FLAG_VERSION, uninfo.version);
|
||||
uprint (FLAG_MACHINE, uninfo.machine);
|
||||
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
static void
|
||||
uprint (flag, info)
|
||||
int flag;
|
||||
char *info;
|
||||
{
|
||||
if (uname_flags & flag)
|
||||
{
|
||||
uname_flags &= ~flag;
|
||||
printf ("%s%c", info, uname_flags ? ' ' : '\n');
|
||||
}
|
||||
}
|
||||
|
||||
char *uname_doc[] = {
|
||||
"display information about the system",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin uname_struct = {
|
||||
"uname",
|
||||
uname_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
uname_doc,
|
||||
"uname [-amnrsv]",
|
||||
0
|
||||
};
|
||||
52
examples/loadables/unlink.c
Normal file
52
examples/loadables/unlink.c
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
/* unlink - remove a directory entry */
|
||||
|
||||
/* Should only be used to remove directories by a superuser prepared to let
|
||||
fsck clean up the file system. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "builtins.h"
|
||||
#include "shell.h"
|
||||
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
unlink_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
if (list == 0)
|
||||
{
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
|
||||
if (unlink (list->word->word) != 0)
|
||||
{
|
||||
builtin_error ("%s: cannot unlink: %s", list->word->word, strerror (errno));
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
char *unlink_doc[] = {
|
||||
"Remove a directory entry.",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin unlink_struct = {
|
||||
"unlink", /* builtin name */
|
||||
unlink_builtin, /* function implementing the builtin */
|
||||
BUILTIN_ENABLED, /* initial flags for builtin */
|
||||
unlink_doc, /* array of long documentation strings. */
|
||||
"unlink name", /* usage synopsis; becomes short_doc */
|
||||
0 /* reserved for internal use */
|
||||
};
|
||||
52
examples/loadables/whoami.c
Normal file
52
examples/loadables/whoami.c
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* whoami - print out username of current user
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "builtins.h"
|
||||
#include "shell.h"
|
||||
#include "bashgetopt.h"
|
||||
|
||||
whoami_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int opt;
|
||||
|
||||
reset_internal_getopt ();
|
||||
while ((opt = internal_getopt (list, "")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
default:
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
}
|
||||
list = loptend;
|
||||
if (list)
|
||||
{
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
|
||||
if (current_user.user_name == 0)
|
||||
get_current_user_info ();
|
||||
printf ("%s\n", current_user.user_name);
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
char *whoami_doc[] = {
|
||||
"display name of current user",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
struct builtin whoami_struct = {
|
||||
"whoami",
|
||||
whoami_builtin,
|
||||
BUILTIN_ENABLED,
|
||||
whoami_doc,
|
||||
"whoami",
|
||||
0
|
||||
};
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
#! /bin/bash
|
||||
#
|
||||
# alias-conv.sh - convert csh aliases to bash aliases and functions
|
||||
# aliasconv.bash - convert csh aliases to bash aliases and functions
|
||||
#
|
||||
# usage: alias-conv.sh
|
||||
# usage: aliasconv.bash
|
||||
#
|
||||
# Chet Ramey
|
||||
# chet@po.cwru.edu
|
||||
|
|
@ -27,7 +27,11 @@ mkalias ()
|
|||
}
|
||||
EOF
|
||||
|
||||
sed "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>/tmp/cb$$.1
|
||||
# the first thing we want to do is to protect single quotes in the alias,
|
||||
# since they whole thing is going to be surrounded by single quotes when
|
||||
# passed to mkalias
|
||||
|
||||
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>/tmp/cb$$.1
|
||||
|
||||
$BASH /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \
|
||||
-e 's/\$term/\$TERM/g' \
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
#! /bin/bash
|
||||
#
|
||||
# alias-conv.sh - convert csh aliases to bash aliases and functions
|
||||
# aliasconv.sh - convert csh aliases to bash aliases and functions
|
||||
#
|
||||
# usage: alias-conv.sh
|
||||
# usage: aliasconv.sh
|
||||
#
|
||||
# Chet Ramey
|
||||
# chet@po.cwru.edu
|
||||
|
|
@ -27,7 +27,11 @@ mkalias ()
|
|||
}
|
||||
EOF
|
||||
|
||||
sed "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>/tmp/cb$$.1
|
||||
# the first thing we want to do is to protect single quotes in the alias,
|
||||
# since they whole thing is going to be surrounded by single quotes when
|
||||
# passed to mkalias
|
||||
|
||||
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>/tmp/cb$$.1
|
||||
|
||||
sh /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \
|
||||
-e 's/\$term/\$TERM/g' \
|
||||
|
|
|
|||
|
|
@ -90,6 +90,11 @@ ash_lk(){ echo " $1 " | fgrep " $2 " >&- 2>&-; }
|
|||
ash_pr(){ echo $* | tr ' ' '\012' | pr -5 -t -w75 -l$[ ( $# + 4 ) / 5 ]; }
|
||||
ash_rm(){ echo " $1 " | sed -e "s/ $2 / /" -e 's/^ //' -e 's/ $//'; }
|
||||
|
||||
# enable history, bang history expansion, and emacs editing
|
||||
set -o history
|
||||
set -o histexpand
|
||||
set -o emacs
|
||||
|
||||
cd
|
||||
LIM=.limbo # $HOME/$LIM contains "destroyed" objects
|
||||
mkdir $LIM >&- 2>&-
|
||||
|
|
@ -164,8 +169,7 @@ do room=`pwd`
|
|||
prev=$room
|
||||
fi
|
||||
|
||||
echo -n '-advsh> ' # prompt
|
||||
read verb obj x
|
||||
read -e -p '-advsh> ' verb obj x # prompt is '-advsh> '
|
||||
if [ $? != 0 ]
|
||||
then verb=quit # EOF
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -737,6 +737,13 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
|
|||
commands, this causes the last simple command in
|
||||
the function to be waited for twice. */
|
||||
exec_result = wait_for (last_made_pid);
|
||||
#if defined (RECYCLES_PIDS)
|
||||
/* LynxOS, for one, recycles pids very quickly -- so quickly
|
||||
that a new process may have the same pid as the last one
|
||||
created. This has been reported to fix the problem. */
|
||||
if (exec_result == 0)
|
||||
last_made_pid = NO_PID;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -863,8 +870,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
|
|||
break;
|
||||
|
||||
default:
|
||||
programming_error
|
||||
("execute_command: bad command type `%d'", command->type);
|
||||
command_error ("execute_command", CMDERR_BADTYPE, command->type, 0);
|
||||
}
|
||||
|
||||
if (my_undo_list)
|
||||
|
|
@ -905,7 +911,10 @@ difftimeval (d, t1, t2)
|
|||
d->tv_usec += 1000000;
|
||||
d->tv_sec -= 1;
|
||||
if (d->tv_sec < 0) /* ??? -- BSD/OS does this */
|
||||
d->tv_sec = 0;
|
||||
{
|
||||
d->tv_sec = 0;
|
||||
d->tv_usec = 0;
|
||||
}
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
|
@ -916,7 +925,7 @@ addtimeval (d, t1, t2)
|
|||
{
|
||||
d->tv_sec = t1->tv_sec + t2->tv_sec;
|
||||
d->tv_usec = t1->tv_usec + t2->tv_usec;
|
||||
if (d->tv_usec > 1000000)
|
||||
if (d->tv_usec >= 1000000)
|
||||
{
|
||||
d->tv_usec -= 1000000;
|
||||
d->tv_sec += 1;
|
||||
|
|
@ -1472,7 +1481,7 @@ execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)
|
|||
break;
|
||||
|
||||
default:
|
||||
programming_error ("execute_connection: bad connector `%d'", command->value.Connection->connector);
|
||||
command_error ("execute_connection", CMDERR_BADCONN, command->value.Connection->connector, 0);
|
||||
jump_to_top_level (DISCARD);
|
||||
exec_result = EXECUTION_FAILURE;
|
||||
}
|
||||
|
|
@ -2062,7 +2071,7 @@ execute_arith_command (arith_command)
|
|||
|
||||
result = 0;
|
||||
|
||||
this_command_name = "((";
|
||||
this_command_name = "(("; /* )) */
|
||||
/* If we're in a function, update the line number information. */
|
||||
if (variable_context)
|
||||
line_number = arith_command->line - function_line_number;
|
||||
|
|
@ -2092,7 +2101,7 @@ static int
|
|||
execute_cond_node (cond)
|
||||
COND_COM *cond;
|
||||
{
|
||||
int result, invert, patmatch;
|
||||
int result, invert, patmatch, flags;
|
||||
char *arg1, *arg2, *print2;
|
||||
|
||||
invert = (cond->flags & CMD_INVERT_RETURN);
|
||||
|
|
@ -2124,8 +2133,9 @@ execute_cond_node (cond)
|
|||
}
|
||||
else if (cond->type == COND_BINARY)
|
||||
{
|
||||
patmatch = (cond->op->word[1] == '=') && (cond->op->word[2] == '\0') &&
|
||||
(cond->op->word[0] == '!' || cond->op->word[0] == '=');
|
||||
patmatch = ((cond->op->word[1] == '=') && (cond->op->word[2] == '\0') &&
|
||||
(cond->op->word[0] == '!' || cond->op->word[0] == '=') ||
|
||||
(cond->op->word[0] == '=' && cond->op->word[1] == '\0'));
|
||||
|
||||
arg1 = cond_expand_word (cond->left->op, 0);
|
||||
if (arg1 == 0)
|
||||
|
|
@ -2147,7 +2157,7 @@ execute_cond_node (cond)
|
|||
}
|
||||
else
|
||||
{
|
||||
programming_error ("execute_cond_node: %d: unknown conditional command type", cond->type);
|
||||
command_error ("execute_cond_node", CMDERR_BADTYPE, cond->type, 0);
|
||||
jump_to_top_level (DISCARD);
|
||||
result = EXECUTION_FAILURE;
|
||||
}
|
||||
|
|
@ -2262,7 +2272,7 @@ fix_assignment_words (words)
|
|||
|
||||
for (w = words; w; w = w->next)
|
||||
if (w->word->flags & W_ASSIGNMENT)
|
||||
w->word->flags |= W_NOSPLIT;
|
||||
w->word->flags |= (W_NOSPLIT|W_NOGLOB);
|
||||
}
|
||||
|
||||
/* The meaty part of all the executions. We have to start hacking the
|
||||
|
|
@ -2277,7 +2287,7 @@ execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
|
|||
WORD_LIST *words, *lastword;
|
||||
char *command_line, *lastarg, *temp;
|
||||
int first_word_quoted, result, builtin_is_special, already_forked, dofork;
|
||||
pid_t old_last_command_subst_pid;
|
||||
pid_t old_last_command_subst_pid, old_last_async_pid;
|
||||
Function *builtin;
|
||||
SHELL_VAR *func;
|
||||
|
||||
|
|
@ -2297,6 +2307,7 @@ execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
|
|||
simple_command->words ? (simple_command->words->word->flags & W_QUOTED): 0;
|
||||
|
||||
old_last_command_subst_pid = last_command_subst_pid;
|
||||
old_last_async_pid = last_asynchronous_pid;
|
||||
|
||||
already_forked = dofork = 0;
|
||||
|
||||
|
|
@ -2327,6 +2338,7 @@ execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
|
|||
do_piping (pipe_in, pipe_out);
|
||||
pipe_in = pipe_out = -1;
|
||||
|
||||
last_asynchronous_pid = old_last_async_pid;
|
||||
subshell_environment = async ? SUBSHELL_ASYNC : SUBSHELL_FORK;
|
||||
}
|
||||
else
|
||||
|
|
@ -2770,11 +2782,14 @@ execute_subshell_builtin_or_function (words, redirects, builtin, var,
|
|||
struct fd_bitmap *fds_to_close;
|
||||
int flags;
|
||||
{
|
||||
int result, r;
|
||||
int result, r, jobs_hack;
|
||||
|
||||
/* A subshell is neither a login shell nor interactive. */
|
||||
login_shell = interactive = 0;
|
||||
|
||||
jobs_hack = (builtin == jobs_builtin) &&
|
||||
((subshell_environment & SUBSHELL_ASYNC) == 0 || pipe_out != NO_PIPE);
|
||||
|
||||
subshell_environment = SUBSHELL_ASYNC;
|
||||
|
||||
maybe_make_export_env (); /* XXX - is this needed? */
|
||||
|
|
@ -2785,8 +2800,7 @@ execute_subshell_builtin_or_function (words, redirects, builtin, var,
|
|||
the shell itself. */
|
||||
|
||||
/* Allow the output of `jobs' to be piped. */
|
||||
if (builtin == jobs_builtin && !async &&
|
||||
(pipe_out != NO_PIPE || pipe_in != NO_PIPE))
|
||||
if (jobs_hack)
|
||||
kill_current_pipeline ();
|
||||
else
|
||||
without_job_control ();
|
||||
|
|
@ -2898,6 +2912,10 @@ execute_builtin_or_function (words, builtin, var, redirects,
|
|||
void
|
||||
setup_async_signals ()
|
||||
{
|
||||
#if defined (__BEOS__)
|
||||
set_signal_handler (SIGHUP, SIG_IGN); /* they want csh-like behavior */
|
||||
#endif
|
||||
|
||||
#if defined (JOB_CONTROL)
|
||||
if (job_control == 0)
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ extern void disable_priv_mode __P((void));
|
|||
extern void unbind_args __P((void));
|
||||
|
||||
#if defined (RESTRICTED_SHELL)
|
||||
extern int shell_is_restricted __P((char *));
|
||||
extern int maybe_make_restricted __P((char *));
|
||||
#endif
|
||||
|
||||
|
|
@ -116,6 +117,7 @@ extern char *getcwd __P((char *, size_t));
|
|||
#endif
|
||||
|
||||
/* Declarations for functions defined in lib/sh/itos.c */
|
||||
extern char *inttostr __P((int, char *, int));
|
||||
extern char *itos __P((int));
|
||||
|
||||
/* Declarations for functions defined in lib/sh/oslib.c */
|
||||
|
|
|
|||
3
flags.c
3
flags.c
|
|
@ -129,7 +129,8 @@ int interactive_comments = 1;
|
|||
disallows: changing directories, command or path names containing `/',
|
||||
unsetting or resetting the values of $PATH and $SHELL, and any type of
|
||||
output redirection. */
|
||||
int restricted = 0;
|
||||
int restricted = 0; /* currently restricted */
|
||||
int restricted_shell = 0; /* shell was started in restricted mode. */
|
||||
#endif /* RESTRICTED_SHELL */
|
||||
|
||||
/* Non-zero means that this shell is running in `privileged' mode. This
|
||||
|
|
|
|||
1
flags.h
1
flags.h
|
|
@ -61,6 +61,7 @@ extern int history_expansion;
|
|||
|
||||
#if defined (RESTRICTED_SHELL)
|
||||
extern int restricted;
|
||||
extern int restricted_shell;
|
||||
#endif /* RESTRICTED_SHELL */
|
||||
|
||||
extern int *find_flag __P((int));
|
||||
|
|
|
|||
83
general.c
83
general.c
|
|
@ -152,6 +152,13 @@ timeval_to_secs (tvp, sp, sfp)
|
|||
*sfp = (*sfp * 1000) / 1000000;
|
||||
if (rest >= 500)
|
||||
*sfp += 1;
|
||||
|
||||
/* Sanity check */
|
||||
if (*sfp >= 1000)
|
||||
{
|
||||
*sp += 1;
|
||||
*sfp -= 1000;
|
||||
}
|
||||
}
|
||||
|
||||
/* Print the contents of a struct timeval * in a standard way to stdio
|
||||
|
|
@ -189,6 +196,13 @@ clock_t_to_secs (t, sp, sfp)
|
|||
*sfp = (*sfp * 1000) / clk_tck;
|
||||
|
||||
*sp = t / clk_tck;
|
||||
|
||||
/* Sanity check */
|
||||
if (*sfp >= 1000)
|
||||
{
|
||||
*sp += 1;
|
||||
*sfp -= 1000;
|
||||
}
|
||||
}
|
||||
|
||||
/* Print the time defined by a time_t (returned by the `times' and `time'
|
||||
|
|
@ -347,8 +361,16 @@ unset_nodelay_mode (fd)
|
|||
fcntl (fd, F_SETFL, flags);
|
||||
}
|
||||
|
||||
/* There is a bug in the NeXT 2.1 rlogind that causes opens
|
||||
of /dev/tty to fail. */
|
||||
/* There is a bug in the NeXT 2.1 rlogind that causes opens
|
||||
of /dev/tty to fail. */
|
||||
|
||||
#if defined (__BEOS__)
|
||||
/* On BeOS, opening in non-blocking mode exposes a bug in BeOS, so turn it
|
||||
into a no-op. This should probably go away in the future. */
|
||||
# undef O_NONBLOCK
|
||||
# define O_NONBLOCK 0
|
||||
#endif /* __BEOS__ */
|
||||
|
||||
void
|
||||
check_dev_tty ()
|
||||
{
|
||||
|
|
@ -620,11 +642,21 @@ canonicalize_pathname (path)
|
|||
result[1] = '\0';
|
||||
}
|
||||
|
||||
#if 1
|
||||
/* Turn `//' into `/' -- XXX experimental */
|
||||
if (result[0] == '/' && result[1] == '/' && result[2] == '\0')
|
||||
result[1] = '\0';
|
||||
#endif
|
||||
/* If the result starts with `//', but the original path does not, we
|
||||
can turn the // into /. */
|
||||
if ((result[0] == '/' && result[1] == '/' && result[2] != '/') &&
|
||||
(path[0] != '/' || path[1] != '/' || path[2] == '/'))
|
||||
{
|
||||
char *r2;
|
||||
if (result[2] == '\0') /* short-circuit for bare `//' */
|
||||
result[1] = '\0';
|
||||
else
|
||||
{
|
||||
r2 = savestring (result + 1);
|
||||
free (result);
|
||||
result = r2;
|
||||
}
|
||||
}
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
|
@ -742,7 +774,8 @@ full_pathname (file)
|
|||
return ((char *)NULL);
|
||||
}
|
||||
dlen = strlen (current_dir);
|
||||
current_dir[dlen++] = '/';
|
||||
if (current_dir[0] == '/' && dlen > 1)
|
||||
current_dir[dlen++] = '/';
|
||||
|
||||
/* Turn /foo/./bar into /foo/bar. */
|
||||
if (file[0] == '.' && file[1] == '/')
|
||||
|
|
@ -1054,7 +1087,41 @@ get_group_list (ngp)
|
|||
nbuf = itos ((int)group_array[i]);
|
||||
group_vector[i] = nbuf;
|
||||
}
|
||||
|
||||
if (ngp)
|
||||
*ngp = ngroups;
|
||||
return group_vector;
|
||||
}
|
||||
|
||||
int *
|
||||
get_group_array (ngp)
|
||||
int *ngp;
|
||||
{
|
||||
int i;
|
||||
static int *group_iarray = (int *)NULL;
|
||||
|
||||
if (group_iarray)
|
||||
{
|
||||
if (ngp)
|
||||
*ngp = ngroups;
|
||||
return (group_iarray);
|
||||
}
|
||||
|
||||
if (ngroups == 0)
|
||||
initialize_group_array ();
|
||||
|
||||
if (ngroups <= 0)
|
||||
{
|
||||
if (ngp)
|
||||
*ngp = 0;
|
||||
return (int *)NULL;
|
||||
}
|
||||
|
||||
group_iarray = (int *)xmalloc (ngroups * sizeof (int));
|
||||
for (i = 0; i < ngroups; i++)
|
||||
group_iarray[i] = (int)group_array[i];
|
||||
|
||||
if (ngp)
|
||||
*ngp = ngroups;
|
||||
return group_iarray;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -221,5 +221,6 @@ extern char *bash_tilde_expand __P((char *));
|
|||
|
||||
extern int group_member __P((gid_t));
|
||||
extern char **get_group_list __P((int *));
|
||||
extern int *get_group_array __P((int *));
|
||||
|
||||
#endif /* _GENERAL_H_ */
|
||||
|
|
|
|||
|
|
@ -67,6 +67,9 @@ make_hash_table (buckets)
|
|||
/* Return the location of the bucket which should contain the data
|
||||
for STRING. TABLE is a pointer to a HASH_TABLE. */
|
||||
|
||||
/* A possibly better distribution may be obtained by initializing i to
|
||||
~0UL and using i = (i * 33) + *string++ as the step */
|
||||
|
||||
#define ALL_ONES (~((unsigned long) 0))
|
||||
#define BITS(h, n) ((unsigned long)(h) & ~(ALL_ONES << (n)))
|
||||
|
||||
|
|
|
|||
156
jobs.c
156
jobs.c
|
|
@ -107,6 +107,10 @@
|
|||
extern int errno;
|
||||
#endif /* !errno */
|
||||
|
||||
#if !defined (CHILD_MAX)
|
||||
# define CHILD_MAX 32
|
||||
#endif
|
||||
|
||||
/* Take care of system dependencies that must be handled when waiting for
|
||||
children. The arguments to the WAITPID macro match those to the Posix.1
|
||||
waitpid() function. */
|
||||
|
|
@ -543,12 +547,7 @@ cleanup_dead_jobs ()
|
|||
BLOCK_CHILD (set, oset);
|
||||
|
||||
for (i = 0; i < job_slots; i++)
|
||||
#if 0
|
||||
if (jobs[i] && DEADJOB (i) && IS_NOTIFIED (i) &&
|
||||
(interactive_shell || (find_last_pid (i) != last_asynchronous_pid)))
|
||||
#else
|
||||
if (jobs[i] && DEADJOB (i) && IS_NOTIFIED (i))
|
||||
#endif
|
||||
delete_job (i, 0);
|
||||
|
||||
UNBLOCK_CHILD (oset);
|
||||
|
|
@ -1150,9 +1149,9 @@ make_child (command, async_p)
|
|||
{
|
||||
/* In the child. Give this child the right process group, set the
|
||||
signals to the default state for a new process. */
|
||||
pid_t mine;
|
||||
pid_t mypid;
|
||||
|
||||
mine = getpid ();
|
||||
mypid = getpid ();
|
||||
#if defined (BUFFERED_INPUT)
|
||||
/* Close default_buffered_input if it's > 0. We don't close it if it's
|
||||
0 because that's the file descriptor used when redirecting input,
|
||||
|
|
@ -1169,7 +1168,7 @@ make_child (command, async_p)
|
|||
process group. */
|
||||
|
||||
if (pipeline_pgrp == 0) /* This is the first child. */
|
||||
pipeline_pgrp = mine;
|
||||
pipeline_pgrp = mypid;
|
||||
|
||||
/* Check for running command in backquotes. */
|
||||
if (pipeline_pgrp == shell_pgrp)
|
||||
|
|
@ -1185,12 +1184,18 @@ make_child (command, async_p)
|
|||
this would have for the first child) is an error. Section
|
||||
B.4.3.3, p. 237 also covers this, in the context of job control
|
||||
shells. */
|
||||
if (setpgid (mine, pipeline_pgrp) < 0)
|
||||
sys_error ("child setpgid (%d to %d)", mine, pipeline_pgrp);
|
||||
if (setpgid (mypid, pipeline_pgrp) < 0)
|
||||
sys_error ("child setpgid (%d to %d)", mypid, pipeline_pgrp);
|
||||
#if defined (PGRP_PIPE)
|
||||
if (pipeline_pgrp == mine)
|
||||
if (pipeline_pgrp == mypid)
|
||||
{
|
||||
#endif
|
||||
/* XXX - By convention (and assumption above), if
|
||||
pipeline_pgrp == shell_pgrp, we are making a child for
|
||||
command substitution.
|
||||
In this case, we don't want to give the terminal to the
|
||||
shell's process group (we could be in the middle of a
|
||||
pipeline, for example). */
|
||||
if (async_p == 0 && pipeline_pgrp != shell_pgrp)
|
||||
give_terminal_to (pipeline_pgrp);
|
||||
|
||||
|
|
@ -1471,16 +1476,13 @@ wait_for_single_pid (pid)
|
|||
|
||||
r = wait_for (pid);
|
||||
|
||||
/* POSIX.2: if we just waited for $!, we can remove the job from the
|
||||
jobs table. */
|
||||
if (pid == last_asynchronous_pid)
|
||||
{
|
||||
BLOCK_CHILD (set, oset);
|
||||
job = find_job (pid);
|
||||
if (job != NO_JOB && jobs[job] && DEADJOB (job))
|
||||
jobs[job]->flags |= J_NOTIFIED;
|
||||
UNBLOCK_CHILD (oset);
|
||||
}
|
||||
/* POSIX.2: if we just waited for a job, we can remove it from the jobs
|
||||
table. */
|
||||
BLOCK_CHILD (set, oset);
|
||||
job = find_job (pid);
|
||||
if (job != NO_JOB && jobs[job] && DEADJOB (job))
|
||||
jobs[job]->flags |= J_NOTIFIED;
|
||||
UNBLOCK_CHILD (oset);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
@ -1521,6 +1523,11 @@ wait_for_background_pids ()
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* POSIX.2 says the shell can discard the statuses of all completed jobs if
|
||||
`wait' is called with no arguments. */
|
||||
mark_dead_jobs_as_notified (1);
|
||||
cleanup_dead_jobs ();
|
||||
}
|
||||
|
||||
/* Make OLD_SIGINT_HANDLER the SIGINT signal handler. */
|
||||
|
|
@ -1722,7 +1729,27 @@ wait_for (pid)
|
|||
termination_state = process_exit_status (child->status);
|
||||
|
||||
if (job == NO_JOB || IS_JOBCONTROL (job))
|
||||
give_terminal_to (shell_pgrp);
|
||||
{
|
||||
/* XXX - under what circumstances is a job not present in the jobs
|
||||
table (job == NO_JOB)?
|
||||
1. command substitution
|
||||
|
||||
In the case of command substitution, at least, it's probably not
|
||||
the right thing to give the terminal to the shell's process group,
|
||||
even though there is code in subst.c:command_substitute to work
|
||||
around it.
|
||||
|
||||
Things that don't:
|
||||
$PROMPT_COMMAND execution
|
||||
process substitution
|
||||
*/
|
||||
#if 0
|
||||
if (job == NO_JOB)
|
||||
itrace("wait_for: job == NO_JOB, giving the terminal to shell_pgrp (%d)", shell_pgrp);
|
||||
#endif
|
||||
|
||||
give_terminal_to (shell_pgrp);
|
||||
}
|
||||
|
||||
/* If the command did not exit cleanly, or the job is just
|
||||
being stopped, then reset the tty state back to what it
|
||||
|
|
@ -1775,13 +1802,7 @@ wait_for (pid)
|
|||
sure we turn on the notify bit so we don't get an unwanted
|
||||
message about the job's termination, and so delete_job really
|
||||
clears the slot in the jobs table. */
|
||||
#if 0
|
||||
if (DEADJOB (job))
|
||||
jobs[job]->flags |= J_NOTIFIED;
|
||||
cleanup_dead_jobs ();
|
||||
#else
|
||||
notify_and_cleanup ();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1810,15 +1831,12 @@ wait_for_job (job)
|
|||
pid = last_pid (job);
|
||||
r = wait_for (pid);
|
||||
|
||||
/* POSIX.2: if we just waited for $!, we can remove the job from the
|
||||
jobs table. */
|
||||
if (pid == last_asynchronous_pid)
|
||||
{
|
||||
BLOCK_CHILD (set, oset);
|
||||
if (job != NO_JOB && jobs[job] && DEADJOB (job))
|
||||
jobs[job]->flags |= J_NOTIFIED;
|
||||
UNBLOCK_CHILD (oset);
|
||||
}
|
||||
/* POSIX.2: we can remove the job from the jobs table if we just waited
|
||||
for it. */
|
||||
BLOCK_CHILD (set, oset);
|
||||
if (job != NO_JOB && jobs[job] && DEADJOB (job))
|
||||
jobs[job]->flags |= J_NOTIFIED;
|
||||
UNBLOCK_CHILD (oset);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
@ -1844,7 +1862,7 @@ notify_and_cleanup ()
|
|||
void
|
||||
reap_dead_jobs ()
|
||||
{
|
||||
mark_dead_jobs_as_notified ();
|
||||
mark_dead_jobs_as_notified (0);
|
||||
cleanup_dead_jobs ();
|
||||
}
|
||||
|
||||
|
|
@ -2488,23 +2506,25 @@ notify_of_job_status ()
|
|||
s = jobs[job]->pipe->status;
|
||||
termsig = WTERMSIG (s);
|
||||
|
||||
/* POSIX.2 says we have to hang onto the statuses of at most the
|
||||
last CHILD_MAX background processes if the shell is running a
|
||||
script. If the shell is not interactive, don't print anything
|
||||
unless the job was killed by a signal. */
|
||||
if (startup_state == 0 && WIFSIGNALED (s) == 0 &&
|
||||
((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job)))
|
||||
continue;
|
||||
|
||||
/* If job control is disabled, don't print the status messages.
|
||||
Mark dead jobs as notified so that they get cleaned up. If
|
||||
startup_state == 2, we were started to run `-c command', so
|
||||
don't print anything. If the shell is not interactive, don't
|
||||
print anything unless the job was killed by a signal. */
|
||||
if ((job_control == 0 && interactive_shell) || startup_state == 2 ||
|
||||
(startup_state == 0 && WIFSIGNALED (s) == 0))
|
||||
don't print anything. */
|
||||
if ((job_control == 0 && interactive_shell) || startup_state == 2)
|
||||
{
|
||||
#if 0
|
||||
if (DEADJOB (job))
|
||||
#else
|
||||
/* POSIX.2 compatibility: if the shell is not interactive,
|
||||
hang onto the job corresponding to the last asynchronous
|
||||
pid until the user has been notified of its status or does
|
||||
a `wait'. */
|
||||
if (DEADJOB (job) && (interactive_shell || (find_last_pid (job) != last_asynchronous_pid)))
|
||||
#endif
|
||||
jobs[job]->flags |= J_NOTIFIED;
|
||||
continue;
|
||||
}
|
||||
|
|
@ -2516,9 +2536,7 @@ notify_of_job_status ()
|
|||
{
|
||||
case JDEAD:
|
||||
if (interactive_shell == 0 && termsig && WIFSIGNALED (s) &&
|
||||
#if 1
|
||||
termsig != SIGINT &&
|
||||
#endif
|
||||
#if defined (DONT_REPORT_SIGPIPE)
|
||||
termsig != SIGPIPE &&
|
||||
#endif
|
||||
|
|
@ -2943,24 +2961,48 @@ nohup_all_jobs (running_only)
|
|||
}
|
||||
|
||||
/* Mark all dead jobs as notified, so delete_job () cleans them out
|
||||
of the job table properly. */
|
||||
of the job table properly. POSIX.2 says we need to save the
|
||||
status of the last CHILD_MAX jobs, so we count the number of dead
|
||||
jobs and mark only enough as notified to save CHILD_MAX statuses. */
|
||||
static void
|
||||
mark_dead_jobs_as_notified ()
|
||||
mark_dead_jobs_as_notified (force)
|
||||
int force;
|
||||
{
|
||||
register int i;
|
||||
register int i, ndead;
|
||||
sigset_t set, oset;
|
||||
|
||||
if (job_slots)
|
||||
{
|
||||
BLOCK_CHILD (set, oset);
|
||||
|
||||
/* Count the number of dead jobs */
|
||||
for (i = ndead = 0; force == 0 && i < job_slots; i++)
|
||||
{
|
||||
if (jobs[i] && DEADJOB (i))
|
||||
ndead++;
|
||||
}
|
||||
|
||||
/* Don't do anything if the number of jobs is less than CHILD_MAX and
|
||||
we're not forcing a cleanup. */
|
||||
if (force == 0 && ndead <= CHILD_MAX)
|
||||
{
|
||||
UNBLOCK_CHILD (oset);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Mark enough dead jobs as notified that we keep CHILD_MAX jobs in
|
||||
the list. This isn't exactly right yet; changes need to be made
|
||||
to stop_pipeline so we don't mark the newer jobs after we've
|
||||
created CHILD_MAX slots in the jobs array. */
|
||||
for (i = 0; i < job_slots; i++)
|
||||
#if 0
|
||||
if (jobs[i] && DEADJOB (i))
|
||||
#else
|
||||
if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i) != last_asynchronous_pid)))
|
||||
#endif
|
||||
jobs[i]->flags |= J_NOTIFIED;
|
||||
{
|
||||
if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i) != last_asynchronous_pid)))
|
||||
{
|
||||
jobs[i]->flags |= J_NOTIFIED;
|
||||
if (force == 0 && --ndead <= CHILD_MAX)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
UNBLOCK_CHILD (oset);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,10 +16,13 @@ INSTALL_DATA = @INSTALL_DATA@
|
|||
CC = @CC@
|
||||
RANLIB = @RANLIB@
|
||||
AR = @AR@
|
||||
ARFLAGS = @ARFLAGS@
|
||||
RM = rm
|
||||
CP = cp
|
||||
MV = mv
|
||||
|
||||
SHELL = @MAKE_SHELL@
|
||||
|
||||
CFLAGS = @CFLAGS@
|
||||
LOCAL_CFLAGS = @LOCAL_CFLAGS@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
|
|
@ -66,7 +69,7 @@ all: $(LIBRARY_NAME)
|
|||
|
||||
$(LIBRARY_NAME): $(OBJECTS)
|
||||
$(RM) -f $@
|
||||
$(AR) cr $@ $(OBJECTS)
|
||||
$(AR) $(ARFLAGS) $@ $(OBJECTS)
|
||||
-test -n "$(RANLIB)" && $(RANLIB) $@
|
||||
|
||||
what-tar:
|
||||
|
|
|
|||
|
|
@ -25,10 +25,17 @@
|
|||
#include "collsyms.h"
|
||||
#include <ctype.h>
|
||||
|
||||
#if defined (HAVE_STRING_H)
|
||||
# include <string.h>
|
||||
#else
|
||||
# include <strings.h>
|
||||
#endif /* HAVE_STRING_H */
|
||||
|
||||
static int gmatch ();
|
||||
static char *brackmatch ();
|
||||
#ifdef EXTENDED_GLOB
|
||||
static int extmatch ();
|
||||
static char *patscan ();
|
||||
#endif
|
||||
|
||||
#if !defined (isascii)
|
||||
|
|
@ -155,11 +162,17 @@ gmatch (string, se, pattern, pe, flags)
|
|||
sc = n < se ? *n : '\0';
|
||||
|
||||
#ifdef EXTENDED_GLOB
|
||||
/* extmatch () will handle recursively calling gmatch, so we can
|
||||
just return what extmatch() returns. */
|
||||
if ((flags & FNM_EXTMATCH) && *p == '(' &&
|
||||
(c == '+' || c == '*' || c == '?' || c == '@' || c == '!')) /* ) */
|
||||
/* extmatch () will handle recursively calling gmatch, so we can
|
||||
just return what extmatch() returns. */
|
||||
return (extmatch (c, n, se, p, pe, flags));
|
||||
{
|
||||
int lflags;
|
||||
/* If we're not matching the start of the string, we're not
|
||||
concerned about the special cases for matching `.' */
|
||||
lflags = (n == string) ? flags : (flags & ~FNM_PERIOD);
|
||||
return (extmatch (c, n, se, p, pe, lflags));
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (c)
|
||||
|
|
@ -226,7 +239,23 @@ gmatch (string, se, pattern, pe, flags)
|
|||
#ifdef EXTENDED_GLOB
|
||||
/* Handle ******(patlist) */
|
||||
if ((flags & FNM_EXTMATCH) && c == '*' && *p == '(') /*)*/
|
||||
return (extmatch (c, n, se, p, pe, flags));
|
||||
{
|
||||
char *newn;
|
||||
/* We need to check whether or not the extended glob
|
||||
pattern matches the remainder of the string.
|
||||
If it does, we match the entire pattern. */
|
||||
for (newn = n; newn < se; ++newn)
|
||||
{
|
||||
if (extmatch (c, newn, se, p, pe, flags) == 0)
|
||||
return (0);
|
||||
}
|
||||
/* We didn't match the extended glob pattern, but
|
||||
that's OK, since we can match 0 or more occurrences.
|
||||
We need to skip the glob pattern and see if we
|
||||
match the rest of the string. */
|
||||
newn = patscan (p, pe, 0);
|
||||
p = newn;
|
||||
}
|
||||
#endif
|
||||
if (p == pe)
|
||||
break;
|
||||
|
|
@ -245,11 +274,24 @@ gmatch (string, se, pattern, pe, flags)
|
|||
c1 = (unsigned char)((flags & FNM_NOESCAPE) == 0 && c == '\\') ? *p : c;
|
||||
c1 = FOLD (c1);
|
||||
for (--p; n < se; ++n)
|
||||
/* Only call fnmatch if the first character indicates a
|
||||
possible match. */
|
||||
if ((c == '[' || FOLD (*n) == c1) &&
|
||||
gmatch (n, se, p, pe, flags & ~FNM_PERIOD) == 0)
|
||||
return (0);
|
||||
{
|
||||
/* Only call fnmatch if the first character indicates a
|
||||
possible match. We can check the first character if
|
||||
we're not doing an extended glob match. */
|
||||
if ((flags & FNM_EXTMATCH) == 0 && c != '[' && FOLD (*n) != c1)
|
||||
continue;
|
||||
|
||||
/* If we're doing an extended glob match and the pattern is not
|
||||
one of the extended glob patterns, we can check the first
|
||||
character. */
|
||||
if ((flags & FNM_EXTMATCH) && p[1] != '(' && /*)*/
|
||||
strchr ("?*+@!", *p) == 0 && c != '[' && FOLD (*n) != c1)
|
||||
continue;
|
||||
|
||||
/* Otherwise, we just recurse. */
|
||||
if (gmatch (n, se, p, pe, flags & ~FNM_PERIOD) == 0)
|
||||
return (0);
|
||||
}
|
||||
return FNM_NOMATCH;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ Cambridge, MA 02139, USA. */
|
|||
#ifndef _FNMATCH_H
|
||||
#define _FNMATCH_H 1
|
||||
|
||||
#include "stdc.h"
|
||||
|
||||
/* We #undef these before defining them because some losing systems
|
||||
(HP-UX A.08.07 for example) define these in <unistd.h>. */
|
||||
#undef FNM_PATHNAME
|
||||
|
|
@ -41,6 +43,6 @@ Cambridge, MA 02139, USA. */
|
|||
|
||||
/* Match STRING against the filename pattern PATTERN,
|
||||
returning zero if it matches, FNM_NOMATCH if not. */
|
||||
extern int fnmatch();
|
||||
extern int fnmatch __P((char *, char *, int));
|
||||
|
||||
#endif /* _FNMATCH_H */
|
||||
|
|
|
|||
|
|
@ -75,9 +75,9 @@
|
|||
# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
|
||||
#endif /* _POSIX_SOURCE */
|
||||
|
||||
#if !defined (HAVE_BCOPY)
|
||||
#if !defined (HAVE_BCOPY) && !defined (bcopy)
|
||||
# define bcopy(s, d, n) ((void) memcpy ((d), (s), (n)))
|
||||
#endif /* !HAVE_BCOPY */
|
||||
#endif /* !HAVE_BCOPY && !bcopy */
|
||||
|
||||
#if defined (SHELL)
|
||||
# include "posixstat.h"
|
||||
|
|
@ -251,7 +251,7 @@ glob_vector (pat, dir)
|
|||
register struct dirent *dp;
|
||||
struct globval *lastlink;
|
||||
register struct globval *nextlink;
|
||||
register char *nextname;
|
||||
register char *nextname, *npat;
|
||||
unsigned int count;
|
||||
int lose, skip;
|
||||
register char **name_vector;
|
||||
|
|
@ -297,32 +297,32 @@ glob_vector (pat, dir)
|
|||
|
||||
dirlen = strlen (dir);
|
||||
nextname = (char *)malloc (dirlen + strlen (pat) + 2);
|
||||
if (nextname == 0)
|
||||
npat = (char *)malloc (strlen (pat) + 1);
|
||||
if (nextname == 0 || npat == 0)
|
||||
lose = 1;
|
||||
else
|
||||
{
|
||||
strcpy (npat, pat);
|
||||
dequote_pathname (npat);
|
||||
|
||||
strcpy (nextname, dir);
|
||||
nextname[dirlen++] = '/';
|
||||
strcpy (nextname + dirlen, pat);
|
||||
strcpy (nextname + dirlen, npat);
|
||||
|
||||
if (GLOB_TESTNAME (nextname) >= 0)
|
||||
{
|
||||
free (nextname);
|
||||
nextlink = (struct globval *)alloca (sizeof (struct globval));
|
||||
nextlink->next = (struct globval *)0;
|
||||
nextname = (char *) malloc (strlen (pat) + 1);
|
||||
if (nextname == 0)
|
||||
lose = 1;
|
||||
else
|
||||
{
|
||||
lastlink = nextlink;
|
||||
nextlink->name = nextname;
|
||||
strcpy (nextname, pat);
|
||||
count = 1;
|
||||
}
|
||||
lastlink = nextlink;
|
||||
nextlink->name = npat;
|
||||
count = 1;
|
||||
}
|
||||
else
|
||||
free (nextname);
|
||||
{
|
||||
free (nextname);
|
||||
free (npat);
|
||||
}
|
||||
}
|
||||
|
||||
skip = 1;
|
||||
|
|
@ -379,6 +379,16 @@ glob_vector (pat, dir)
|
|||
if (REAL_DIR_ENTRY (dp) == 0)
|
||||
continue;
|
||||
|
||||
/* If a leading dot need not be explicitly matched, and the pattern
|
||||
doesn't start with a `.', don't match `.' or `..' */
|
||||
#define dname dp->d_name
|
||||
if (noglob_dot_filenames == 0 && pat[0] != '.' &&
|
||||
(pat[0] != '\\' || pat[1] != '.') &&
|
||||
(dname[0] == '.' &&
|
||||
(dname[1] == '\0' || (dname[1] == '.' && dname[2] == '\0'))))
|
||||
#undef dname
|
||||
continue;
|
||||
|
||||
/* If a dot must be explicity matched, check to see if they do. */
|
||||
if (noglob_dot_filenames && dp->d_name[0] == '.' && pat[0] != '.' &&
|
||||
(pat[0] != '\\' || pat[1] != '.'))
|
||||
|
|
|
|||
|
|
@ -13,10 +13,13 @@ INSTALL_DATA = @INSTALL_DATA@
|
|||
CC = @CC@
|
||||
RANLIB = @RANLIB@
|
||||
AR = @AR@
|
||||
ARFLAGS = @ARFLAGS@
|
||||
RM = rm -f
|
||||
CP = cp
|
||||
MV = mv
|
||||
|
||||
SHELL = @MAKE_SHELL@
|
||||
|
||||
PROFILE_FLAGS =
|
||||
|
||||
CFLAGS = @CFLAGS@
|
||||
|
|
@ -63,32 +66,32 @@ all: malloc
|
|||
|
||||
malloc: ${MALLOC_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${MALLOC_OBJS}
|
||||
${AR} ${ARFLAGS} libmalloc.a ${MALLOC_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
nmalloc: ${NMALLOC_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${NMALLOC_OBJS}
|
||||
${AR} ${ARFLAGS} libmalloc.a ${NMALLOC_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
nmalloc2: ${NMALLOC2_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${NMALLOC2_OBJS}
|
||||
${AR} ${ARFLAGS} libmalloc.a ${NMALLOC2_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
gmalloc: ${GMALLOC_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${GMALLOC_OBJS}
|
||||
${AR} ${ARFLAGS} libmalloc.a ${GMALLOC_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
ngmalloc: ${NGMALLOC_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${NGMALLOC_OBJS}
|
||||
${AR} ${ARFLAGS} libmalloc.a ${NGMALLOC_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
stubmalloc: ${STUB_OBJS}
|
||||
${RM} libmalloc.a
|
||||
${AR} cr libmalloc.a ${STUB_OBJS}
|
||||
${AR} ${ARFLAGS} libmalloc.a ${STUB_OBJS}
|
||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||
|
||||
alloca.o: $(srcdir)/$(ALLOCA_SOURCE)
|
||||
|
|
|
|||
|
|
@ -184,7 +184,7 @@ struct bucket_stats {
|
|||
enough room in the block for the new size. Range checking is always
|
||||
done. */
|
||||
union mhead {
|
||||
double mh_align;
|
||||
bits64_t mh_align; /* 8 */
|
||||
struct {
|
||||
char mi_alloc; /* ISALLOC or ISFREE */ /* 1 */
|
||||
char mi_index; /* index in nextf[] */ /* 1 */
|
||||
|
|
@ -200,8 +200,8 @@ union mhead {
|
|||
|
||||
/* Access free-list pointer of a block.
|
||||
It is stored at block + sizeof (char *).
|
||||
This is not a field in the mhead structure
|
||||
because we want sizeof (struct mhead)
|
||||
This is not a field in the minfo structure member of union mhead
|
||||
because we want sizeof (union mhead)
|
||||
to describe the overhead for when the block is in use,
|
||||
and we do not want the free-list pointer to count in that. */
|
||||
|
||||
|
|
@ -490,6 +490,8 @@ morecore_done:
|
|||
#else
|
||||
# if defined (HAVE_POSIX_SIGNALS)
|
||||
sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
|
||||
# else
|
||||
; /* nothing to do, but need a null statement before the brace */
|
||||
# endif
|
||||
#endif /* HAVE_BSD_SIGNALS */
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue