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,
|
This document details the changes between this version, bash-2.02.1-release,
|
||||||
and the previous version, bash-2.02-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.
|
a loop.
|
||||||
|
|
||||||
y. A fix was made to the parser so that `((cmd); cmd2)' is now parsed as
|
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.
|
command.
|
||||||
|
|
||||||
z. A fix was made to the globbing code so that it correctly matches quoted
|
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,
|
This document details the incompatibilites between this version of bash,
|
||||||
bash-2.01, and the previous widely-available version, bash-1.14. These
|
bash-2.03, and the previous widely-available version, bash-1.14 (which
|
||||||
were discovered by alpha and beta testers, so they will likely be
|
is still the `standard' version for many Linux distributions). These
|
||||||
encountered by a significant number of users.
|
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
|
1. Bash now uses a new quoting syntax, $"...", to do locale-specific
|
||||||
string translation. Users who have relied on the (undocumented)
|
string translation. Users who have relied on the (undocumented)
|
||||||
|
|
@ -63,9 +63,11 @@ encountered by a significant number of users.
|
||||||
"\C-\\": self-insert
|
"\C-\\": self-insert
|
||||||
|
|
||||||
6. A number of people complained above having to use ESC to terminate an
|
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
|
incremental search, and asked for an alternate mechanism. Bash-2.03
|
||||||
allows ^J to terminate the search without accepting the line. Use
|
uses the value of the settable readline variable `isearch-terminators'
|
||||||
^M to terminate the search and accept the line, as in bash-1.14.
|
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,
|
7. Some variables have been removed: MAIL_WARNING, notify, history_control,
|
||||||
command_oriented_history, glob_dot_filenames, allow_null_glob_expansion,
|
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
|
An interactive shell started in posix mode reads and executes commands
|
||||||
from the file named by $ENV.
|
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
|
performed on the values of `PS1' and `PS2' regardless of the
|
||||||
setting of the `promptvars' option.
|
setting of the `promptvars' option.
|
||||||
|
|
||||||
6. Interactive comments are enabled by default. (Note that Bash has
|
6. Interactive comments are enabled by default. (Bash has them on by
|
||||||
them on by default anyway.)
|
default anyway.)
|
||||||
|
|
||||||
7. The POSIX.2 startup files are executed (`$ENV') rather than the
|
7. The POSIX.2 startup files are executed (`$ENV') rather than the
|
||||||
normal Bash files.
|
normal Bash files.
|
||||||
|
|
|
||||||
|
|
@ -14,4 +14,7 @@ modification.
|
||||||
sh-redir-hack - diff to parse.y to get redirections before
|
sh-redir-hack - diff to parse.y to get redirections before
|
||||||
compound commands
|
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
|
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
|
point `config.cache' contains results you don't want to keep, you may
|
||||||
remove or edit it.
|
remove or edit it.
|
||||||
|
|
||||||
If you need to do unusual things to compile the package, please try to
|
If you need to do unusual things to compile Bash, please try to figure
|
||||||
figure out how `configure' could check whether or not to do them, and
|
out how `configure' could check whether or not to do them, and mail
|
||||||
mail diffs or instructions to `bash-maintainers@prep.ai.mit.edu' so
|
diffs or instructions to <bash-maintainers@gnu.org> so they can be
|
||||||
they can be considered for the next release.
|
considered for the next release.
|
||||||
|
|
||||||
The file `configure.in' is used to create `configure' by a program
|
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
|
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
|
If you need to change `configure.in' or regenerate `configure', you
|
||||||
will need to create two files: `_distribution' and `_patchlevel'.
|
will need to create two files: `_distribution' and `_patchlevel'.
|
||||||
`_distribution' should contain the major and minor version numbers of
|
`_distribution' should contain the major and minor version numbers of
|
||||||
the Bash distribution, for example `2.02'. `_patchlevel' should
|
the Bash distribution, for example `2.01'. `_patchlevel' should
|
||||||
contain the patch level of the Bash distribution, `1' for example. The
|
contain the patch level of the Bash distribution, `0' for example. The
|
||||||
script `support/mkconffiles' has been provided to automate the creation
|
script `support/mkconffiles' has been provided to automate the creation
|
||||||
of these files.
|
of these files.
|
||||||
|
|
||||||
|
|
@ -115,17 +115,17 @@ than `/usr/local' by giving `configure' the option `--prefix=PATH'.
|
||||||
|
|
||||||
You can specify separate installation prefixes for
|
You can specify separate installation prefixes for
|
||||||
architecture-specific files and architecture-independent files. If you
|
architecture-specific files and architecture-independent files. If you
|
||||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
give `configure' the option `--exec-prefix=PATH', `make install' will
|
||||||
`PATH' as the prefix for installing programs and libraries.
|
use `PATH' as the prefix for installing programs and libraries.
|
||||||
Documentation and other data files will still use the regular prefix.
|
Documentation and other data files will still use the regular prefix.
|
||||||
|
|
||||||
Specifying the System Type
|
Specifying the System Type
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
There may be some features `configure' can not figure out
|
There may be some features `configure' can not figure out
|
||||||
automatically, but needs to determine by the type of host the package
|
automatically, but needs to determine by the type of host Bash will run
|
||||||
will run on. Usually `configure' can figure that out, but if it prints
|
on. Usually `configure' can figure that out, but if it prints a
|
||||||
a message saying it can not guess the host type, give it the
|
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
|
`--host=TYPE' option. `TYPE' can either be a short name for the system
|
||||||
type, such as `sun4', or a canonical name with three fields:
|
type, such as `sun4', or a canonical name with three fields:
|
||||||
`CPU-COMPANY-SYSTEM' (e.g., `sparc-sun-sunos4.1.2').
|
`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
|
The Bash `configure' has a number of `--enable-FEATURE' options, where
|
||||||
FEATURE indicates an optional part of the package. There are also
|
FEATURE indicates an optional part of Bash. There are also several
|
||||||
several `--with-PACKAGE' options, where PACKAGE is something like
|
`--with-PACKAGE' options, where PACKAGE is something like `gnu-malloc'
|
||||||
`gnu-malloc' or `purify' (for the Purify memory allocation checker). To
|
or `purify'. To turn off the default use of a package, use
|
||||||
turn off the default use of a package, use `--without-PACKAGE'. To
|
`--without-PACKAGE'. To configure Bash without a feature that is
|
||||||
configure Bash without a feature that is enabled by default, use
|
enabled by default, use `--disable-FEATURE'.
|
||||||
`--disable-FEATURE'.
|
|
||||||
|
|
||||||
Here is a complete list of the `--enable-' and `--with-' options that
|
Here is a complete list of the `--enable-' and `--with-' options that
|
||||||
the Bash `configure' recognizes.
|
the Bash `configure' recognizes.
|
||||||
|
|
@ -212,6 +211,11 @@ the Bash `configure' recognizes.
|
||||||
for which this should be turned off, and `configure' disables this
|
for which this should be turned off, and `configure' disables this
|
||||||
option automatically for a number of systems.
|
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'
|
`--with-purify'
|
||||||
Define this to use the Purify memory allocation checker from Pure
|
Define this to use the Purify memory allocation checker from Pure
|
||||||
Software.
|
Software.
|
||||||
|
|
@ -241,16 +245,19 @@ does not provide the necessary support.
|
||||||
|
|
||||||
`--enable-alias'
|
`--enable-alias'
|
||||||
Allow alias expansion and include the `alias' and `unalias'
|
Allow alias expansion and include the `alias' and `unalias'
|
||||||
builtins.
|
builtins (*note Aliases::.).
|
||||||
|
|
||||||
`--enable-array-variables'
|
`--enable-array-variables'
|
||||||
Include support for one-dimensional array shell variables.
|
Include support for one-dimensional array shell variables (*note
|
||||||
|
Arrays::.).
|
||||||
|
|
||||||
`--enable-bang-history'
|
`--enable-bang-history'
|
||||||
Include support for `csh'-like history substitution.
|
Include support for `csh'-like history substitution (*note History
|
||||||
|
Interaction::.).
|
||||||
|
|
||||||
`--enable-brace-expansion'
|
`--enable-brace-expansion'
|
||||||
Include `csh'-like brace expansion ( `b{a,b}c' ==> `bac bbc' ).
|
Include `csh'-like brace expansion ( `b{a,b}c' ==> `bac bbc' ).
|
||||||
|
See *Note Brace Expansion::, for a complete description.
|
||||||
|
|
||||||
`--enable-command-timing'
|
`--enable-command-timing'
|
||||||
Include support for recognizing `time' as a reserved word and for
|
Include support for recognizing `time' as a reserved word and for
|
||||||
|
|
@ -259,11 +266,12 @@ does not provide the necessary support.
|
||||||
be timed.
|
be timed.
|
||||||
|
|
||||||
`--enable-cond-command'
|
`--enable-cond-command'
|
||||||
Include support for the `[[' conditional command.
|
Include support for the `[[' conditional command (*note
|
||||||
|
Conditional Constructs::.).
|
||||||
|
|
||||||
`--enable-directory-stack'
|
`--enable-directory-stack'
|
||||||
Include support for a `csh'-like directory stack and the `pushd',
|
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'
|
`--enable-disabled-builtins'
|
||||||
Allow builtin commands to be invoked via `builtin xxx' even after
|
Allow builtin commands to be invoked via `builtin xxx' even after
|
||||||
|
|
@ -272,7 +280,8 @@ does not provide the necessary support.
|
||||||
commands.
|
commands.
|
||||||
|
|
||||||
`--enable-dparen-arithmetic'
|
`--enable-dparen-arithmetic'
|
||||||
Include support for the `ksh' `((...))' command.
|
Include support for the `((...))' command (*note Conditional
|
||||||
|
Constructs::.).
|
||||||
|
|
||||||
`--enable-extended-glob'
|
`--enable-extended-glob'
|
||||||
Include support for the extended pattern matching features
|
Include support for the extended pattern matching features
|
||||||
|
|
@ -287,20 +296,22 @@ does not provide the necessary support.
|
||||||
commands.
|
commands.
|
||||||
|
|
||||||
`--enable-job-control'
|
`--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'
|
`--enable-process-substitution'
|
||||||
This enables process substitution (*note 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'
|
`--enable-prompt-string-decoding'
|
||||||
Turn on the interpretation of a number of backslash-escaped
|
Turn on the interpretation of a number of backslash-escaped
|
||||||
characters in the `$PS1', `$PS2', `$PS3', and `$PS4' prompt
|
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'
|
`--enable-readline'
|
||||||
Include support for command-line editing and history with the Bash
|
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'
|
`--enable-restricted'
|
||||||
Include support for a "restricted shell". If this is enabled,
|
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.
|
The Restricted Shell::, for a description of restricted mode.
|
||||||
|
|
||||||
`--enable-select'
|
`--enable-select'
|
||||||
Include the `ksh' `select' builtin, which allows the generation of
|
Include the `select' builtin, which allows the generation of simple
|
||||||
simple menus.
|
menus (*note Conditional Constructs::.).
|
||||||
|
|
||||||
`--enable-usg-echo-default'
|
`--enable-usg-echo-default'
|
||||||
Make the `echo' builtin expand backslash-escaped characters by
|
Make the `echo' builtin expand backslash-escaped characters by
|
||||||
|
|
|
||||||
39
MANIFEST
39
MANIFEST
|
|
@ -43,11 +43,12 @@ NEWS f
|
||||||
NOTES f
|
NOTES f
|
||||||
README f
|
README f
|
||||||
AUTHORS f
|
AUTHORS f
|
||||||
|
Y2K f
|
||||||
configure.in f
|
configure.in f
|
||||||
configure f
|
configure f
|
||||||
Makefile.in f
|
Makefile.in f
|
||||||
config.h.top f
|
config-top.h f
|
||||||
config.h.bot f
|
config-bot.h f
|
||||||
config.h.in f
|
config.h.in f
|
||||||
aclocal.m4 f
|
aclocal.m4 f
|
||||||
array.c f
|
array.c f
|
||||||
|
|
@ -195,6 +196,9 @@ builtins/common.h f
|
||||||
builtins/bashgetopt.h f
|
builtins/bashgetopt.h f
|
||||||
cross-build/cygwin32.cache f
|
cross-build/cygwin32.cache f
|
||||||
cross-build/win32sig.h 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/ChangeLog f
|
||||||
lib/glob/Makefile.in f
|
lib/glob/Makefile.in f
|
||||||
lib/glob/fnmatch.c f
|
lib/glob/fnmatch.c f
|
||||||
|
|
@ -256,6 +260,7 @@ lib/readline/input.c f
|
||||||
lib/readline/callback.c f
|
lib/readline/callback.c f
|
||||||
lib/readline/nls.c f
|
lib/readline/nls.c f
|
||||||
lib/readline/shell.c f
|
lib/readline/shell.c f
|
||||||
|
lib/readline/savestring.c f
|
||||||
lib/readline/tilde.c f
|
lib/readline/tilde.c f
|
||||||
lib/readline/tilde.h f
|
lib/readline/tilde.h f
|
||||||
lib/readline/rldefs.h f
|
lib/readline/rldefs.h f
|
||||||
|
|
@ -272,7 +277,9 @@ lib/readline/posixdir.h f
|
||||||
lib/readline/posixjmp.h f
|
lib/readline/posixjmp.h f
|
||||||
lib/readline/posixstat.h f
|
lib/readline/posixstat.h f
|
||||||
lib/readline/ansi_stdlib.h f
|
lib/readline/ansi_stdlib.h f
|
||||||
|
lib/readline/rlstdc.h f
|
||||||
lib/readline/doc/Makefile f
|
lib/readline/doc/Makefile f
|
||||||
|
lib/readline/doc/manvers.texinfo f
|
||||||
lib/readline/doc/rlman.texinfo f
|
lib/readline/doc/rlman.texinfo f
|
||||||
lib/readline/doc/rltech.texinfo f
|
lib/readline/doc/rltech.texinfo f
|
||||||
lib/readline/doc/rluser.texinfo f
|
lib/readline/doc/rluser.texinfo f
|
||||||
|
|
@ -292,6 +299,7 @@ lib/sh/getcwd.c f
|
||||||
lib/sh/getenv.c f
|
lib/sh/getenv.c f
|
||||||
lib/sh/itos.c f
|
lib/sh/itos.c f
|
||||||
lib/sh/oslib.c f
|
lib/sh/oslib.c f
|
||||||
|
lib/sh/rename.c f
|
||||||
lib/sh/setlinebuf.c f
|
lib/sh/setlinebuf.c f
|
||||||
lib/sh/strcasecmp.c f
|
lib/sh/strcasecmp.c f
|
||||||
lib/sh/strerror.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/configure.in f
|
||||||
lib/termcap/grot/COPYING f
|
lib/termcap/grot/COPYING f
|
||||||
lib/termcap/grot/README f
|
lib/termcap/grot/README f
|
||||||
|
lib/tilde/README f
|
||||||
lib/tilde/ChangeLog f
|
lib/tilde/ChangeLog f
|
||||||
lib/tilde/Makefile.in f
|
lib/tilde/Makefile.in f
|
||||||
lib/tilde/doc/tilde.texi f
|
lib/tilde/doc/tilde.texi f
|
||||||
lib/tilde/doc/Makefile f
|
lib/tilde/doc/Makefile f
|
||||||
lib/tilde/tilde.c f
|
lib/tilde/tilde.c f
|
||||||
lib/tilde/tilde.h f
|
lib/tilde/tilde.h f
|
||||||
|
lib/tilde/shell.c f
|
||||||
CWRU/misc/open-files.c f
|
CWRU/misc/open-files.c f
|
||||||
CWRU/misc/sigs.c f
|
CWRU/misc/sigs.c f
|
||||||
CWRU/misc/pid.c f
|
CWRU/misc/pid.c f
|
||||||
CWRU/misc/sigstat.c f
|
CWRU/misc/sigstat.c f
|
||||||
CWRU/misc/bison f
|
CWRU/misc/bison f
|
||||||
|
CWRU/misc/errlist.c f
|
||||||
|
CWRU/misc/hpux10-dlfcn.h f
|
||||||
CWRU/PLATFORMS f
|
CWRU/PLATFORMS f
|
||||||
CWRU/README f
|
CWRU/README f
|
||||||
CWRU/POSIX.NOTES f
|
CWRU/POSIX.NOTES f
|
||||||
CWRU/changelog f
|
CWRU/changelog f
|
||||||
CWRU/sh-redir-hack f
|
CWRU/sh-redir-hack f
|
||||||
|
CWRU/empty-for-wordlist f
|
||||||
CWRU/mh-folder-comp f
|
CWRU/mh-folder-comp f
|
||||||
doc/FAQ f
|
doc/FAQ f
|
||||||
doc/Makefile.in f
|
doc/Makefile.in f
|
||||||
|
|
@ -355,6 +368,7 @@ support/config.sub f
|
||||||
support/printenv.sh f 755
|
support/printenv.sh f 755
|
||||||
support/printenv.c f
|
support/printenv.c f
|
||||||
support/bash.xbm f
|
support/bash.xbm f
|
||||||
|
support/missing f 755
|
||||||
support/mkclone f 755
|
support/mkclone f 755
|
||||||
support/mkconffiles f 755
|
support/mkconffiles f 755
|
||||||
support/mkdirs f 755
|
support/mkdirs f 755
|
||||||
|
|
@ -368,14 +382,17 @@ support/SYMLINKS f
|
||||||
support/fixlinks f 755
|
support/fixlinks f 755
|
||||||
support/install.sh f 755
|
support/install.sh f 755
|
||||||
support/texi2dvi f
|
support/texi2dvi f
|
||||||
support/texi2html f
|
support/texi2html f 755
|
||||||
support/xenix-link.sh f 755
|
support/xenix-link.sh f 755
|
||||||
|
support/shobj-conf f 755
|
||||||
|
support/rlvers.sh f 755
|
||||||
examples/bashdb/PERMISSION f
|
examples/bashdb/PERMISSION f
|
||||||
examples/bashdb/README f
|
examples/bashdb/README f
|
||||||
examples/bashdb/bashdb f
|
examples/bashdb/bashdb f
|
||||||
examples/bashdb/bashdb.fns f
|
examples/bashdb/bashdb.fns f
|
||||||
examples/bashdb/bashdb.pre f
|
examples/bashdb/bashdb.pre f
|
||||||
examples/loadables/README f
|
examples/loadables/README f
|
||||||
|
examples/loadables/template.c f
|
||||||
examples/loadables/Makefile.in f
|
examples/loadables/Makefile.in f
|
||||||
examples/loadables/necho.c f
|
examples/loadables/necho.c f
|
||||||
examples/loadables/hello.c f
|
examples/loadables/hello.c f
|
||||||
|
|
@ -384,7 +401,6 @@ examples/loadables/sprintf.c f
|
||||||
examples/loadables/sleep.c f
|
examples/loadables/sleep.c f
|
||||||
examples/loadables/truefalse.c f
|
examples/loadables/truefalse.c f
|
||||||
examples/loadables/getconf.c f
|
examples/loadables/getconf.c f
|
||||||
examples/loadables/pushd.c f
|
|
||||||
examples/loadables/finfo.c f
|
examples/loadables/finfo.c f
|
||||||
examples/loadables/cat.c f
|
examples/loadables/cat.c f
|
||||||
examples/loadables/logname.c f
|
examples/loadables/logname.c f
|
||||||
|
|
@ -395,8 +411,17 @@ examples/loadables/pathchk.c f
|
||||||
examples/loadables/tee.c f
|
examples/loadables/tee.c f
|
||||||
examples/loadables/rmdir.c f
|
examples/loadables/rmdir.c f
|
||||||
examples/loadables/head.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 f
|
||||||
examples/functions/autoload.v2 f
|
examples/functions/autoload.v2 f
|
||||||
|
examples/functions/autoload.v3 f
|
||||||
examples/functions/basename f
|
examples/functions/basename f
|
||||||
examples/functions/basename2 f
|
examples/functions/basename2 f
|
||||||
examples/functions/csh-compat f
|
examples/functions/csh-compat f
|
||||||
|
|
@ -423,7 +448,9 @@ examples/functions/mhfold f
|
||||||
examples/functions/notify.bash f
|
examples/functions/notify.bash f
|
||||||
examples/functions/pathfuncs f
|
examples/functions/pathfuncs f
|
||||||
examples/functions/repeat2 f
|
examples/functions/repeat2 f
|
||||||
|
examples/functions/repeat3 f
|
||||||
examples/functions/seq f
|
examples/functions/seq f
|
||||||
|
examples/functions/seq2 f
|
||||||
examples/functions/shcat f
|
examples/functions/shcat f
|
||||||
examples/functions/shcat2 f
|
examples/functions/shcat2 f
|
||||||
examples/functions/substr f
|
examples/functions/substr f
|
||||||
|
|
@ -431,6 +458,7 @@ examples/functions/substr2 f
|
||||||
examples/functions/term f
|
examples/functions/term f
|
||||||
examples/functions/whatis f
|
examples/functions/whatis f
|
||||||
examples/functions/whence f
|
examples/functions/whence f
|
||||||
|
examples/functions/which f
|
||||||
examples/functions/xalias.bash f
|
examples/functions/xalias.bash f
|
||||||
examples/scripts/adventure.sh f
|
examples/scripts/adventure.sh f
|
||||||
examples/scripts/bcsh.sh f
|
examples/scripts/bcsh.sh f
|
||||||
|
|
@ -479,6 +507,8 @@ tests/source4.sub f
|
||||||
tests/source5.sub f
|
tests/source5.sub f
|
||||||
tests/cond.tests f
|
tests/cond.tests f
|
||||||
tests/cond.right f
|
tests/cond.right f
|
||||||
|
tests/cprint.tests f
|
||||||
|
tests/cprint.right f
|
||||||
tests/dollar-at-star f
|
tests/dollar-at-star f
|
||||||
tests/dollar.right f
|
tests/dollar.right f
|
||||||
tests/dstack.tests f
|
tests/dstack.tests f
|
||||||
|
|
@ -573,6 +603,7 @@ tests/run-array2 f
|
||||||
tests/run-braces f
|
tests/run-braces f
|
||||||
tests/run-builtins f
|
tests/run-builtins f
|
||||||
tests/run-cond f
|
tests/run-cond f
|
||||||
|
tests/run-cprint f
|
||||||
tests/run-dirstack f
|
tests/run-dirstack f
|
||||||
tests/run-dollars f
|
tests/run-dollars f
|
||||||
tests/run-errors 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
|
# Make sure the first target in the makefile is the right one
|
||||||
all: .made
|
all: .made
|
||||||
|
|
@ -29,15 +29,17 @@ VPATH = .:@srcdir@
|
||||||
CC = @CC@
|
CC = @CC@
|
||||||
CC_FOR_BUILD = @CC_FOR_BUILD@
|
CC_FOR_BUILD = @CC_FOR_BUILD@
|
||||||
YACC = @YACC@
|
YACC = @YACC@
|
||||||
SHELL=/bin/sh
|
SHELL = @MAKE_SHELL@
|
||||||
CP = cp
|
CP = cp
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
|
ARFLAGS = @ARFLAGS@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
|
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALLMODE= -m 0755
|
||||||
|
|
||||||
COMPRESS = gzip
|
COMPRESS = gzip
|
||||||
COMPRESS_EXT = .gz
|
COMPRESS_EXT = .gz
|
||||||
|
|
@ -63,6 +65,7 @@ RELSTATUS = release
|
||||||
|
|
||||||
Machine = @host_cpu@
|
Machine = @host_cpu@
|
||||||
OS = @host_os@
|
OS = @host_os@
|
||||||
|
VENDOR = @host_vendor@
|
||||||
MACHTYPE = @host@
|
MACHTYPE = @host@
|
||||||
|
|
||||||
THIS_SH = $(BUILD_DIR)/$(Program)
|
THIS_SH = $(BUILD_DIR)/$(Program)
|
||||||
|
|
@ -80,20 +83,21 @@ LOCAL_CFLAGS = @LOCAL_CFLAGS@
|
||||||
DEFS = @DEFS@
|
DEFS = @DEFS@
|
||||||
LOCAL_DEFS = @LOCAL_DEFS@
|
LOCAL_DEFS = @LOCAL_DEFS@
|
||||||
LOCAL_LIBS = @LOCAL_LIBS@
|
LOCAL_LIBS = @LOCAL_LIBS@
|
||||||
LIBS = $(BUILTINS_LIB) $(LIBRARIES) $(LOCAL_LIBS) @LIBS@
|
LIBS = $(BUILTINS_LIB) $(LIBRARIES) @LIBS@
|
||||||
LDFLAGS = @LDFLAGS@ $(LOCAL_LDFLAGS) $(PROFILE_FLAGS) $(CFLAGS)
|
LDFLAGS = @LDFLAGS@ $(STATIC_LD) $(LOCAL_LDFLAGS) $(PROFILE_FLAGS) $(CFLAGS)
|
||||||
|
STATIC_LD = @STATIC_LD@
|
||||||
LOCAL_LDFLAGS = @LOCAL_LDFLAGS@
|
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) \
|
CCFLAGS = $(PROFILE_FLAGS) $(SYSTEM_FLAGS) $(LOCAL_DEFS) \
|
||||||
$(DEFS) $(LOCAL_CFLAGS) $(CPPFLAGS) $(INCLUDES) $(CFLAGS)
|
$(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 \
|
GCC_LINT_FLAGS = -ansi -Wall -Wshadow -Wpointer-arith -Wcast-qual \
|
||||||
-Wwrite-strings -Werror -Wstrict-prototypes \
|
-Wwrite-strings -Werror -Wstrict-prototypes \
|
||||||
-Wmissing-prototypes
|
-Wmissing-prototypes -Wno-implicit
|
||||||
GCC_LINT_CFLAGS = $(CCFLAGS) $(GCC_LINT_FLAGS)
|
GCC_LINT_CFLAGS = $(CCFLAGS) $(GCC_LINT_FLAGS)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
@ -105,7 +109,7 @@ dot = .
|
||||||
LIBSUBDIR = lib
|
LIBSUBDIR = lib
|
||||||
LIBSRC = $(srcdir)/$(LIBSUBDIR)
|
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 bash library
|
||||||
# the library is a mix of functions that the C library does not provide on
|
# 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}/strcasecmp.c ${SH_LIBSRC}/strerror.c \
|
||||||
${SH_LIBSRC}/strtod.c ${SH_LIBSRC}/strtol.c \
|
${SH_LIBSRC}/strtod.c ${SH_LIBSRC}/strtol.c \
|
||||||
${SH_LIBSRC}/strtoul.c ${SH_LIBSRC}/vprint.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_LIB = -lsh
|
||||||
SHLIB_LIBNAME = libsh.a
|
SHLIB_LIBNAME = libsh.a
|
||||||
|
|
@ -131,7 +135,7 @@ SHLIB_DEP = ${SHLIB_LIBRARY}
|
||||||
# we assume for now that readline source is being shipped with bash
|
# we assume for now that readline source is being shipped with bash
|
||||||
RL_LIBSRC = $(LIBSRC)/readline
|
RL_LIBSRC = $(LIBSRC)/readline
|
||||||
RL_LIBDOC = $(RL_LIBSRC)/doc
|
RL_LIBDOC = $(RL_LIBSRC)/doc
|
||||||
RL_LIBDIR = $(dot)/$(LIBSUBDIR)/readline
|
RL_LIBDIR = @RL_LIBDIR@
|
||||||
RL_ABSSRC = ${topdir}/$(RL_LIBDIR)
|
RL_ABSSRC = ${topdir}/$(RL_LIBDIR)
|
||||||
|
|
||||||
READLINE_LIB = @READLINE_LIB@
|
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)/chardefs.h $(RL_LIBSRC)/keymaps.h \
|
||||||
$(RL_LIBSRC)/history.h $(RL_LIBSRC)/histlib.h \
|
$(RL_LIBSRC)/history.h $(RL_LIBSRC)/histlib.h \
|
||||||
$(RL_LIBSRC)/posixstat.h $(RL_LIBSRC)/tilde.h \
|
$(RL_LIBSRC)/posixstat.h $(RL_LIBSRC)/tilde.h \
|
||||||
|
$(RL_LIBSRC)/rlstdc.h \
|
||||||
$(RL_LIBSRC)/funmap.c $(RL_LIBSRC)/emacs_keymap.c \
|
$(RL_LIBSRC)/funmap.c $(RL_LIBSRC)/emacs_keymap.c \
|
||||||
$(RL_LIBSRC)/search.c $(RL_LIBSRC)/vi_keymap.c \
|
$(RL_LIBSRC)/search.c $(RL_LIBSRC)/vi_keymap.c \
|
||||||
$(RL_LIBSRC)/keymaps.c $(RL_LIBSRC)/parens.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)/undo.c $(RL_LIBSRC)/macro.c \
|
||||||
$(RL_LIBSRC)/terminal.c $(RL_LIBSRC)/nls.c \
|
$(RL_LIBSRC)/terminal.c $(RL_LIBSRC)/nls.c \
|
||||||
$(RL_LIBSRC)/input.c $(RL_LIBSRC)/xmalloc.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)/histexpand.c $(RL_LIBSRC)/history.c \
|
||||||
$(RL_LIBSRC)/histsearch.c $(RL_LIBSRC)/histfile.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)/kill.o $(RL_LIBDIR)/undo.o $(RL_LIBDIR)/nls.o \
|
||||||
$(RL_LIBDIR)/macro.o $(RL_LIBDIR)/input.o \
|
$(RL_LIBDIR)/macro.o $(RL_LIBDIR)/input.o \
|
||||||
$(RL_LIBDIR)/terminal.o $(RL_LIBDIR)/callback.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)/history.o $(RL_LIBDIR)/histexpand.o \
|
||||||
$(RL_LIBDIR)/histsearch.o $(RL_LIBDIR)/histfile.o
|
$(RL_LIBDIR)/histsearch.o $(RL_LIBDIR)/histfile.o
|
||||||
|
|
||||||
HIST_LIBSRC = $(LIBSRC)/readline
|
HIST_LIBSRC = $(LIBSRC)/readline
|
||||||
HIST_LIBDIR = $(dot)/$(LIBSUBDIR)/readline
|
HIST_LIBDIR = @HIST_LIBDIR@
|
||||||
HIST_ABSSRC = ${topdir}/$(HIST_LIBDIR)
|
HIST_ABSSRC = ${topdir}/$(HIST_LIBDIR)
|
||||||
|
|
||||||
HISTORY_LIB = @HISTORY_LIB@
|
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) \
|
LIBRARIES = $(READLINE_LIB) $(HISTORY_LIB) $(TERMCAP_LIB) $(GLOB_LIB) \
|
||||||
$(TILDE_LIB) $(MALLOC_LIB) $(SHLIB_LIB) $(LOCAL_LIBS)
|
$(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)
|
$(TILDE_DEP) $(MALLOC_DEP) $(SHLIB_DEP)
|
||||||
|
|
||||||
LIBRARY_LDFLAGS = $(READLINE_LDFLAGS) $(HISTORY_LDFLAGS) $(TILDE_LDFLAGS) \
|
LIBRARY_LDFLAGS = $(READLINE_LDFLAGS) $(HISTORY_LDFLAGS) $(GLOB_LDFLAGS) \
|
||||||
$(GLOB_LDFLAGS) $(MALLOC_LDFLAGS) $(SHLIB_LDFLAGS)
|
$(TILDE_LDFLAGS) $(MALLOC_LDFLAGS) $(SHLIB_LDFLAGS)
|
||||||
|
|
||||||
#
|
#
|
||||||
# The shell itself
|
# The shell itself
|
||||||
|
|
@ -411,8 +416,8 @@ strip: $(Program) .made
|
||||||
size $(Program)
|
size $(Program)
|
||||||
|
|
||||||
version.h: $(SOURCES) config.h Makefile
|
version.h: $(SOURCES) config.h Makefile
|
||||||
if $(SHELL) $(SUPPORT_SRC)mkversion.sh -b -s $(RELSTATUS) -d $(Version) -p $(PatchLevel) -o newversion.h; \
|
$(SHELL) $(SUPPORT_SRC)mkversion.sh -b -s $(RELSTATUS) -d $(Version) -p $(PatchLevel) -o newversion.h \
|
||||||
then mv newversion.h version.h; fi;
|
&& mv newversion.h version.h
|
||||||
|
|
||||||
# old rules
|
# old rules
|
||||||
GRAM_H = parser-built
|
GRAM_H = parser-built
|
||||||
|
|
@ -435,13 +440,13 @@ y.tab.c y.tab.h: parse.y
|
||||||
|
|
||||||
$(READLINE_LIBRARY): config.h $(READLINE_SOURCE)
|
$(READLINE_LIBRARY): config.h $(READLINE_SOURCE)
|
||||||
@echo making $@ in ${RL_LIBDIR}
|
@echo making $@ in ${RL_LIBDIR}
|
||||||
@(cd ${RL_LIBDIR} && \
|
@( { test "${RL_LIBDIR}" = "${libdir}" && exit 0; } || \
|
||||||
$(MAKE) $(MFLAGS) libreadline.a) || exit 1
|
cd ${RL_LIBDIR} && $(MAKE) $(MFLAGS) libreadline.a) || exit 1
|
||||||
|
|
||||||
$(HISTORY_LIBRARY): config.h $(HISTORY_SOURCE)
|
$(HISTORY_LIBRARY): config.h $(HISTORY_SOURCE)
|
||||||
@echo making $@ in ${HIST_LIBDIR}
|
@echo making $@ in ${HIST_LIBDIR}
|
||||||
@(cd ${HIST_LIBDIR} && \
|
@( { test "${HIST_LIBDIR}" = "${libdir}" && exit 0; } || \
|
||||||
$(MAKE) $(MFLAGS) libhistory.a) || exit 1
|
cd ${HIST_LIBDIR} && $(MAKE) $(MFLAGS) libhistory.a) || exit 1
|
||||||
|
|
||||||
$(GLOB_LIBRARY): config.h $(GLOB_SOURCE)
|
$(GLOB_LIBRARY): config.h $(GLOB_SOURCE)
|
||||||
@echo making $@ in ${GLOB_LIBDIR}
|
@echo making $@ in ${GLOB_LIBDIR}
|
||||||
|
|
@ -464,7 +469,7 @@ $(SHLIB_LIBRARY): config.h ${SHLIB_SOURCE}
|
||||||
$(MAKE) $(MFLAGS) ${SHLIB_LIBNAME}) || exit 1
|
$(MAKE) $(MFLAGS) ${SHLIB_LIBNAME}) || exit 1
|
||||||
|
|
||||||
mksignames: $(SUPPORT_SRC)mksignames.c
|
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
|
# make a list of signals for the local system -- this is done when we're
|
||||||
# *not* cross-compiling
|
# *not* cross-compiling
|
||||||
|
|
@ -502,15 +507,19 @@ Makefiles makefiles: config.status $(srcdir)/Makefile.in
|
||||||
|
|
||||||
config.h: stamp-h
|
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_FILES= CONFIG_HEADERS=config.h $(SHELL) ./config.status
|
||||||
|
|
||||||
config.status: $(srcdir)/configure
|
config.status: $(srcdir)/configure
|
||||||
$(SHELL) ./config.status --recheck
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
# comment out for distribution
|
# comment out for distribution
|
||||||
#$(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4
|
$(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4 $(srcdir)/config.h.in
|
||||||
# cd $(srcdir) && autoconf
|
cd $(srcdir) && autoconf
|
||||||
|
|
||||||
|
# for chet
|
||||||
|
reconfig: force
|
||||||
|
sh $(srcdir)/configure
|
||||||
|
|
||||||
#newversion: mkversion
|
#newversion: mkversion
|
||||||
# $(RM) .build
|
# $(RM) .build
|
||||||
|
|
@ -540,8 +549,8 @@ installdirs:
|
||||||
@${SHELL} $(SUPPORT_SRC)mkdirs $(infodir)
|
@${SHELL} $(SUPPORT_SRC)mkdirs $(infodir)
|
||||||
|
|
||||||
install: .made installdirs
|
install: .made installdirs
|
||||||
$(INSTALL_PROGRAM) $(Program) $(bindir)/$(Program)
|
$(INSTALL_PROGRAM) $(INSTALLMODE) $(Program) $(bindir)/$(Program)
|
||||||
$(INSTALL_PROGRAM) bashbug $(bindir)/bashbug
|
$(INSTALL_PROGRAM) $(INSTALLMODE) bashbug $(bindir)/bashbug
|
||||||
-( cd $(DOCDIR) ; $(MAKE) $(MFLAGS) \
|
-( cd $(DOCDIR) ; $(MAKE) $(MFLAGS) \
|
||||||
man1dir=$(man1dir) man1ext=$(man1ext) \
|
man1dir=$(man1dir) man1ext=$(man1ext) \
|
||||||
man3dir=$(man3dir) man3ext=$(man3ext) \
|
man3dir=$(man3dir) man3ext=$(man3ext) \
|
||||||
|
|
@ -572,6 +581,7 @@ clean: basic-clean
|
||||||
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
|
-(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
$(RM) $(CREATED_SUPPORT)
|
$(RM) $(CREATED_SUPPORT)
|
||||||
|
|
||||||
mostlyclean: basic-clean
|
mostlyclean: basic-clean
|
||||||
|
|
@ -583,6 +593,7 @@ mostlyclean: basic-clean
|
||||||
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
|
-(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
|
|
||||||
distclean: basic-clean
|
distclean: basic-clean
|
||||||
( cd $(DOCDIR) && $(MAKE) $(MFLAGS) $@ )
|
( cd $(DOCDIR) && $(MAKE) $(MFLAGS) $@ )
|
||||||
|
|
@ -593,6 +604,7 @@ distclean: basic-clean
|
||||||
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
|
-(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
$(RM) $(CREATED_CONFIGURE) tags TAGS
|
$(RM) $(CREATED_CONFIGURE) tags TAGS
|
||||||
$(RM) $(CREATED_SUPPORT) Makefile $(CREATED_MAKEFILES)
|
$(RM) $(CREATED_SUPPORT) Makefile $(CREATED_MAKEFILES)
|
||||||
|
|
||||||
|
|
@ -608,6 +620,7 @@ maintainer-clean: basic-clean
|
||||||
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
-(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
|
-(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
|
||||||
$(RM) $(CREATED_CONFIGURE) $(CREATED_MAKEFILES)
|
$(RM) $(CREATED_CONFIGURE) $(CREATED_MAKEFILES)
|
||||||
$(RM) $(CREATED_SUPPORT) Makefile
|
$(RM) $(CREATED_SUPPORT) Makefile
|
||||||
|
|
||||||
|
|
@ -643,22 +656,22 @@ sdepend: force
|
||||||
|
|
||||||
############################ DEPENDENCIES ###############################
|
############################ 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
|
# to be changed
|
||||||
shell.o: config.h.top
|
shell.o: config-top.h
|
||||||
input.o: config.h.top
|
input.o: config-top.h
|
||||||
y.tab.o: config.h.top
|
y.tab.o: config-top.h
|
||||||
jobs.o: config.h.top
|
jobs.o: config-top.h
|
||||||
nojobs.o: config.h.top
|
nojobs.o: config-top.h
|
||||||
execute_cmd.o: config.h.top
|
execute_cmd.o: config-top.h
|
||||||
variables.o: config.h.top
|
variables.o: config-top.h
|
||||||
builtins/command.o: config.h.top
|
builtins/command.o: config-top.h
|
||||||
builtins/common.o: config.h.top
|
builtins/common.o: config-top.h
|
||||||
builtins/break.o: config.h.top
|
builtins/break.o: config-top.h
|
||||||
builtins/echo.o: config.h.top
|
builtins/echo.o: config-top.h
|
||||||
builtins/evalstring.o: config.h.top
|
builtins/evalstring.o: config-top.h
|
||||||
builtins/exit.o: config.h.top
|
builtins/exit.o: config-top.h
|
||||||
builtins/kill.o: config.h.top
|
builtins/kill.o: config-top.h
|
||||||
|
|
||||||
# shell basics
|
# shell basics
|
||||||
copy_cmd.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
|
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
|
# library dependencies
|
||||||
|
|
||||||
bashline.o: $(RL_LIBSRC)/rlconf.h
|
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
|
bashline.o: $(RL_LIBSRC)/chardefs.h $(RL_LIBSRC)/readline.h
|
||||||
bracecomp.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/chardefs.h
|
bracecomp.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/chardefs.h
|
||||||
bracecomp.o: $(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 $(RL_LIBSRC)/readline.h
|
y.tab.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/chardefs.h
|
||||||
subst.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/chardefs.h $(RL_LIBSRC)/readline.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
|
shell.o: $(HIST_LIBSRC)/history.h $(HIST_LIBSRC)/rlstdc.h
|
||||||
subst.o: $(HIST_LIBSRC)/history.h
|
subst.o: $(HIST_LIBSRC)/history.h $(HIST_LIBSRC)/rlstdc.h
|
||||||
bashline.o: $(HIST_LIBSRC)/history.h
|
bashline.o: $(HIST_LIBSRC)/history.h $(HIST_LIBSRC)/rlstdc.h
|
||||||
bashhist.o: $(HIST_LIBSRC)/history.h
|
bashhist.o: $(HIST_LIBSRC)/history.h $(HIST_LIBSRC)/rlstdc.h
|
||||||
y.tab.o: $(HIST_LIBSRC)/history.h
|
y.tab.o: $(HIST_LIBSRC)/history.h $(HIST_LIBSRC)/rlstdc.h
|
||||||
|
|
||||||
execute_cmd.o: $(TILDE_LIBSRC)/tilde.h
|
execute_cmd.o: $(TILDE_LIBSRC)/tilde.h
|
||||||
general.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
|
# builtin library dependencies
|
||||||
builtins/bind.o: $(RL_LIBSRC)/chardefs.h $(RL_LIBSRC)/readline.h
|
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/bind.o: $(HIST_LIBSRC)/history.h $(RL_LIBSRC)/rlstdc.h
|
||||||
builtins/fc.o: $(HIST_LIBSRC)/history.h
|
builtins/fc.o: $(HIST_LIBSRC)/history.h $(RL_LIBSRC)/rlstdc.h
|
||||||
builtins/history.o: $(HIST_LIBSRC)/history.h
|
builtins/history.o: $(HIST_LIBSRC)/history.h $(RL_LIBSRC)/rlstdc.h
|
||||||
|
|
||||||
builtins/common.o: $(TILDE_LIBSRC)/tilde.h
|
builtins/common.o: $(TILDE_LIBSRC)/tilde.h
|
||||||
builtins/cd.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
|
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 release of bash-2.01.1. As always, the manual page (doc/bash.1) is
|
||||||
the place to look for complete descriptions.
|
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:
|
You will see many warnings of the form:
|
||||||
warning: unknown s_type: 98
|
warning: unknown s_type: 98
|
||||||
I have no idea what this means, but it doesn't seem to matter.
|
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
|
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,
|
Again SHell, a complete implementation of the POSIX.2 shell spec,
|
||||||
but also with interactive command line editing, job control on
|
but also with interactive command line editing, job control on
|
||||||
architectures that support it, csh-like features such as history
|
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
|
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
|
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
|
please send mail to bug-bash@prep.ai.mit.edu with the following
|
||||||
information:
|
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
|
* the machine and OS that it is running on (look at the file
|
||||||
`.made' in the bash build directory)
|
`.made' in the bash build directory)
|
||||||
* a list of the compilation flags or the contents of `config.h', if
|
* 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);
|
exit(fl != 1);
|
||||||
}
|
}
|
||||||
], bash_cv_dup2_broken=yes, bash_cv_dup2_broken=no,
|
], 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])
|
bash_cv_dup2_broken=no])
|
||||||
])
|
])
|
||||||
AC_MSG_RESULT($bash_cv_dup2_broken)
|
AC_MSG_RESULT($bash_cv_dup2_broken)
|
||||||
|
|
@ -129,7 +129,7 @@ main()
|
||||||
exit(ok ? 0 : 5);
|
exit(ok ? 0 : 5);
|
||||||
}
|
}
|
||||||
], bash_cv_pgrp_pipe=no,bash_cv_pgrp_pipe=yes,
|
], 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])
|
bash_cv_pgrp_pipe=no])
|
||||||
])
|
])
|
||||||
AC_MSG_RESULT($bash_cv_pgrp_pipe)
|
AC_MSG_RESULT($bash_cv_pgrp_pipe)
|
||||||
|
|
@ -187,7 +187,7 @@ main()
|
||||||
#endif
|
#endif
|
||||||
exit(1);
|
exit(1);
|
||||||
}], bash_cv_type_rlimit=quad_t, bash_cv_type_rlimit=long,
|
}], 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])])
|
bash_cv_type_rlimit=long])])
|
||||||
])
|
])
|
||||||
AC_MSG_RESULT($bash_cv_type_rlimit)
|
AC_MSG_RESULT($bash_cv_type_rlimit)
|
||||||
|
|
@ -211,7 +211,7 @@ AC_CACHE_VAL(bash_cv_decl_under_sys_siglist,
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif], [ char *msg = _sys_siglist[2]; ],
|
#endif], [ char *msg = _sys_siglist[2]; ],
|
||||||
bash_cv_decl_under_sys_siglist=yes, bash_cv_decl_under_sys_siglist=no,
|
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)
|
AC_MSG_RESULT($bash_cv_decl_under_sys_siglist)
|
||||||
if test $bash_cv_decl_under_sys_siglist = yes; then
|
if test $bash_cv_decl_under_sys_siglist = yes; then
|
||||||
AC_DEFINE(UNDER_SYS_SIGLIST_DECLARED)
|
AC_DEFINE(UNDER_SYS_SIGLIST_DECLARED)
|
||||||
|
|
@ -237,7 +237,7 @@ char *msg = (char *)_sys_siglist[2];
|
||||||
exit(msg == 0);
|
exit(msg == 0);
|
||||||
}],
|
}],
|
||||||
bash_cv_under_sys_siglist=yes, bash_cv_under_sys_siglist=no,
|
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])])
|
bash_cv_under_sys_siglist=no])])
|
||||||
AC_MSG_RESULT($bash_cv_under_sys_siglist)
|
AC_MSG_RESULT($bash_cv_under_sys_siglist)
|
||||||
if test $bash_cv_under_sys_siglist = yes; then
|
if test $bash_cv_under_sys_siglist = yes; then
|
||||||
|
|
@ -264,7 +264,7 @@ char *msg = sys_siglist[2];
|
||||||
exit(msg == 0);
|
exit(msg == 0);
|
||||||
}],
|
}],
|
||||||
bash_cv_sys_siglist=yes, bash_cv_sys_siglist=no,
|
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])])
|
bash_cv_sys_siglist=no])])
|
||||||
AC_MSG_RESULT($bash_cv_sys_siglist)
|
AC_MSG_RESULT($bash_cv_sys_siglist)
|
||||||
if test $bash_cv_sys_siglist = yes; then
|
if test $bash_cv_sys_siglist = yes; then
|
||||||
|
|
@ -325,7 +325,7 @@ dir = opendir("/tmp/not_a_directory");
|
||||||
unlink("/tmp/not_a_directory");
|
unlink("/tmp/not_a_directory");
|
||||||
exit (dir == 0);
|
exit (dir == 0);
|
||||||
}], bash_cv_opendir_not_robust=yes,bash_cv_opendir_not_robust=no,
|
}], 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]
|
bash_cv_opendir_not_robust=no]
|
||||||
)])
|
)])
|
||||||
AC_MSG_RESULT($bash_cv_opendir_not_robust)
|
AC_MSG_RESULT($bash_cv_opendir_not_robust)
|
||||||
|
|
@ -356,109 +356,47 @@ fi
|
||||||
|
|
||||||
AC_DEFUN(BASH_TYPE_INT32_T,
|
AC_DEFUN(BASH_TYPE_INT32_T,
|
||||||
[
|
[
|
||||||
if test "X$bash_cv_type_int32_t" = "X"; then
|
if test "$ac_cv_sizeof_int" = 4; then
|
||||||
_bash_needmsg=yes
|
AC_CHECK_TYPE(int32_t, int)
|
||||||
|
elif test "$ac_cv_sizeof_long" = 4; then
|
||||||
|
AC_CHECK_TYPE(int32_t, long)
|
||||||
else
|
else
|
||||||
AC_MSG_CHECKING(which builtin C type is 32 bits wide)
|
AC_CHECK_TYPE(int32_t, int)
|
||||||
_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)
|
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN(BASH_TYPE_U_INT32_T,
|
AC_DEFUN(BASH_TYPE_U_INT32_T,
|
||||||
[
|
[
|
||||||
if test "X$bash_cv_type_u_int32_t" = "X"; then
|
if test "$ac_cv_sizeof_int" = 4; then
|
||||||
_bash_needmsg=yes
|
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
|
else
|
||||||
AC_MSG_CHECKING(which unsigned builtin C type is 32 bits wide)
|
AC_CHECK_TYPE(u_int32_t, unsigned int)
|
||||||
_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)
|
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN(BASH_TYPE_PTRDIFF_T,
|
AC_DEFUN(BASH_TYPE_PTRDIFF_T,
|
||||||
[
|
[
|
||||||
if test "X$bash_cv_type_ptrdiff_t" = "X"; then
|
if test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_char_p"; then
|
||||||
_bash_needmsg=yes
|
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
|
else
|
||||||
AC_MSG_CHECKING(which builtin C type is correct for ptrdiff_t)
|
AC_CHECK_TYPE(ptrdiff_t, int)
|
||||||
_bash_needmsg=
|
|
||||||
fi
|
fi
|
||||||
AC_CACHE_VAL(bash_cv_type_ptrdiff_t,
|
])
|
||||||
[AC_TRY_RUN([
|
|
||||||
main()
|
AC_DEFUN(BASH_TYPE_BITS64_T,
|
||||||
{
|
[
|
||||||
#if SIZEOF_CHAR_P == SIZEOF_INT
|
if test "$ac_sv_sizeof_char_p" = 8; then
|
||||||
exit (0);
|
AC_CHECK_TYPE(bits64_t, char *)
|
||||||
#else
|
elif test "$ac_cv_sizeof_double" = 8; then
|
||||||
# if SIZEOF_CHAR_P == SIZEOF_LONG
|
AC_CHECK_TYPE(bits64_t, double)
|
||||||
exit (1);
|
elif test "$ac_cv_sizeof_long" = 8; then
|
||||||
# else
|
AC_CHECK_TYPE(bits64_t, long)
|
||||||
# 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)
|
|
||||||
else
|
else
|
||||||
AC_DEFINE(ptrdiff_t, long)
|
AC_CHECK_TYPE(bits64_t, double)
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
@ -548,7 +486,7 @@ s = getenv("ABCDE");
|
||||||
exit(s == 0); /* force optimizer to leave getenv in */
|
exit(s == 0); /* force optimizer to leave getenv in */
|
||||||
}
|
}
|
||||||
], bash_cv_getenv_redef=yes, bash_cv_getenv_redef=no,
|
], 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]
|
bash_cv_getenv_redef=yes]
|
||||||
)])
|
)])
|
||||||
AC_MSG_RESULT($bash_cv_getenv_redef)
|
AC_MSG_RESULT($bash_cv_getenv_redef)
|
||||||
|
|
@ -574,7 +512,7 @@ pf = (_bashfunc) printf;
|
||||||
exit(pf == 0);
|
exit(pf == 0);
|
||||||
}
|
}
|
||||||
], bash_cv_printf_declared=yes, bash_cv_printf_declared=no,
|
], 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]
|
bash_cv_printf_declared=yes]
|
||||||
)])
|
)])
|
||||||
AC_MSG_RESULT($bash_cv_printf_declared)
|
AC_MSG_RESULT($bash_cv_printf_declared)
|
||||||
|
|
@ -593,7 +531,7 @@ long maxfds = ulimit(4, 0L);
|
||||||
exit (maxfds == -1L);
|
exit (maxfds == -1L);
|
||||||
}
|
}
|
||||||
], bash_cv_ulimit_maxfds=yes, bash_cv_ulimit_maxfds=no,
|
], 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]
|
bash_cv_ulimit_maxfds=no]
|
||||||
)])
|
)])
|
||||||
AC_MSG_RESULT($bash_cv_ulimit_maxfds)
|
AC_MSG_RESULT($bash_cv_ulimit_maxfds)
|
||||||
|
|
@ -690,7 +628,7 @@ main()
|
||||||
exit (popen_called);
|
exit (popen_called);
|
||||||
}
|
}
|
||||||
], bash_cv_getcwd_calls_popen=no, bash_cv_getcwd_calls_popen=yes,
|
], 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]
|
bash_cv_getcwd_calls_popen=no]
|
||||||
)])
|
)])
|
||||||
AC_MSG_RESULT($bash_cv_getcwd_calls_popen)
|
AC_MSG_RESULT($bash_cv_getcwd_calls_popen)
|
||||||
|
|
@ -814,7 +752,7 @@ main()
|
||||||
exit(nsigint != 2);
|
exit(nsigint != 2);
|
||||||
}
|
}
|
||||||
], bash_cv_must_reinstall_sighandlers=no, bash_cv_must_reinstall_sighandlers=yes,
|
], 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]
|
bash_cv_must_reinstall_sighandlers=no]
|
||||||
)])
|
)])
|
||||||
AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers)
|
AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers)
|
||||||
|
|
@ -883,7 +821,7 @@ exit(1);
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}], bash_cv_job_control_missing=present, bash_cv_job_control_missing=missing,
|
}], 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]
|
bash_cv_job_control_missing=missing]
|
||||||
)])
|
)])
|
||||||
AC_MSG_RESULT($bash_cv_job_control_missing)
|
AC_MSG_RESULT($bash_cv_job_control_missing)
|
||||||
|
|
@ -928,7 +866,7 @@ close(fd);
|
||||||
unlink ("/tmp/sh-np-autoconf");
|
unlink ("/tmp/sh-np-autoconf");
|
||||||
exit(0);
|
exit(0);
|
||||||
}], bash_cv_sys_named_pipes=present, bash_cv_sys_named_pipes=missing,
|
}], 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]
|
bash_cv_sys_named_pipes=missing]
|
||||||
)])
|
)])
|
||||||
AC_MSG_RESULT($bash_cv_sys_named_pipes)
|
AC_MSG_RESULT($bash_cv_sys_named_pipes)
|
||||||
|
|
@ -979,7 +917,7 @@ siglongjmp(xx, 10);
|
||||||
exit(1);
|
exit(1);
|
||||||
#endif
|
#endif
|
||||||
}], bash_cv_func_sigsetjmp=present, bash_cv_func_sigsetjmp=missing,
|
}], 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]
|
bash_cv_func_sigsetjmp=missing]
|
||||||
)])
|
)])
|
||||||
AC_MSG_RESULT($bash_cv_func_sigsetjmp)
|
AC_MSG_RESULT($bash_cv_func_sigsetjmp)
|
||||||
|
|
@ -1246,7 +1184,7 @@ char *v[];
|
||||||
exit (r1 > 0 && r2 > 0);
|
exit (r1 > 0 && r2 > 0);
|
||||||
}
|
}
|
||||||
], bash_cv_func_strcoll_broken=yes, bash_cv_func_strcoll_broken=no,
|
], 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]
|
bash_cv_func_strcoll_broken=no]
|
||||||
)])
|
)])
|
||||||
AC_MSG_RESULT($bash_cv_func_strcoll_broken)
|
AC_MSG_RESULT($bash_cv_func_strcoll_broken)
|
||||||
|
|
@ -1336,9 +1274,28 @@ main ()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
], bash_cv_sys_restartable_syscalls=yes, bash_cv_sys_restartable_syscalls=no,
|
], 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
|
if test $bash_cv_sys_restartable_syscalls = yes; then
|
||||||
AC_DEFINE(HAVE_RESTARTABLE_SYSCALLS)
|
AC_DEFINE(HAVE_RESTARTABLE_SYSCALLS)
|
||||||
fi
|
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 the filename was supplied, then create it if necessary. */
|
||||||
if (stat (filename, &buf) == -1 && errno == ENOENT)
|
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)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
builtin_error ("%s: cannot create: %s", filename, strerror (errno));
|
builtin_error ("%s: cannot create: %s", filename, strerror (errno));
|
||||||
|
|
@ -324,7 +324,7 @@ maybe_save_shell_history ()
|
||||||
if (stat (hf, &buf) == -1)
|
if (stat (hf, &buf) == -1)
|
||||||
{
|
{
|
||||||
int file;
|
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)
|
if (file != -1)
|
||||||
close (file);
|
close (file);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
91
bashline.c
91
bashline.c
|
|
@ -239,50 +239,50 @@ initialize_readline ()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (BRACE_COMPLETION)
|
#if defined (BRACE_COMPLETION)
|
||||||
rl_add_defun ("complete-into-braces", bash_brace_completion, -1);
|
rl_add_defun ("complete-into-braces", (Function *)bash_brace_completion, -1);
|
||||||
rl_bind_key_in_map ('{', bash_brace_completion, emacs_meta_keymap);
|
rl_bind_key_in_map ('{', (Function *)bash_brace_completion, emacs_meta_keymap);
|
||||||
#endif /* BRACE_COMPLETION */
|
#endif /* BRACE_COMPLETION */
|
||||||
|
|
||||||
#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
|
#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
|
||||||
rl_add_defun ("complete-filename", bash_complete_filename, -1);
|
rl_add_defun ("complete-filename", (Function *)bash_complete_filename, -1);
|
||||||
rl_bind_key_in_map ('/', bash_complete_filename, emacs_meta_keymap);
|
rl_bind_key_in_map ('/', (Function *)bash_complete_filename, emacs_meta_keymap);
|
||||||
rl_add_defun ("possible-filename-completions",
|
rl_add_defun ("possible-filename-completions",
|
||||||
bash_possible_filename_completions, -1);
|
(Function *)bash_possible_filename_completions, -1);
|
||||||
rl_bind_key_in_map ('/', bash_possible_filename_completions, emacs_ctlx_keymap);
|
rl_bind_key_in_map ('/', (Function *)bash_possible_filename_completions, emacs_ctlx_keymap);
|
||||||
|
|
||||||
rl_add_defun ("complete-username", bash_complete_username, -1);
|
rl_add_defun ("complete-username", (Function *)bash_complete_username, -1);
|
||||||
rl_bind_key_in_map ('~', bash_complete_username, emacs_meta_keymap);
|
rl_bind_key_in_map ('~', (Function *)bash_complete_username, emacs_meta_keymap);
|
||||||
rl_add_defun ("possible-username-completions",
|
rl_add_defun ("possible-username-completions",
|
||||||
bash_possible_username_completions, -1);
|
(Function *)bash_possible_username_completions, -1);
|
||||||
rl_bind_key_in_map ('~', bash_possible_username_completions, emacs_ctlx_keymap);
|
rl_bind_key_in_map ('~', (Function *)bash_possible_username_completions, emacs_ctlx_keymap);
|
||||||
|
|
||||||
rl_add_defun ("complete-hostname", bash_complete_hostname, -1);
|
rl_add_defun ("complete-hostname", (Function *)bash_complete_hostname, -1);
|
||||||
rl_bind_key_in_map ('@', bash_complete_hostname, emacs_meta_keymap);
|
rl_bind_key_in_map ('@', (Function *)bash_complete_hostname, emacs_meta_keymap);
|
||||||
rl_add_defun ("possible-hostname-completions",
|
rl_add_defun ("possible-hostname-completions",
|
||||||
bash_possible_hostname_completions, -1);
|
(Function *)bash_possible_hostname_completions, -1);
|
||||||
rl_bind_key_in_map ('@', bash_possible_hostname_completions, emacs_ctlx_keymap);
|
rl_bind_key_in_map ('@', (Function *)bash_possible_hostname_completions, emacs_ctlx_keymap);
|
||||||
|
|
||||||
rl_add_defun ("complete-variable", bash_complete_variable, -1);
|
rl_add_defun ("complete-variable", (Function *)bash_complete_variable, -1);
|
||||||
rl_bind_key_in_map ('$', bash_complete_variable, emacs_meta_keymap);
|
rl_bind_key_in_map ('$', (Function *)bash_complete_variable, emacs_meta_keymap);
|
||||||
rl_add_defun ("possible-variable-completions",
|
rl_add_defun ("possible-variable-completions",
|
||||||
bash_possible_variable_completions, -1);
|
(Function *)bash_possible_variable_completions, -1);
|
||||||
rl_bind_key_in_map ('$', bash_possible_variable_completions, emacs_ctlx_keymap);
|
rl_bind_key_in_map ('$', (Function *)bash_possible_variable_completions, emacs_ctlx_keymap);
|
||||||
|
|
||||||
rl_add_defun ("complete-command", bash_complete_command, -1);
|
rl_add_defun ("complete-command", (Function *)bash_complete_command, -1);
|
||||||
rl_bind_key_in_map ('!', bash_complete_command, emacs_meta_keymap);
|
rl_bind_key_in_map ('!', (Function *)bash_complete_command, emacs_meta_keymap);
|
||||||
rl_add_defun ("possible-command-completions",
|
rl_add_defun ("possible-command-completions",
|
||||||
bash_possible_command_completions, -1);
|
(Function *)bash_possible_command_completions, -1);
|
||||||
rl_bind_key_in_map ('!', bash_possible_command_completions, emacs_ctlx_keymap);
|
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-expand-word", (Function *)bash_glob_expand_word, -1);
|
||||||
rl_add_defun ("glob-list-expansions", bash_glob_list_expansions, -1);
|
rl_add_defun ("glob-list-expansions", (Function *)bash_glob_list_expansions, -1);
|
||||||
rl_bind_key_in_map ('*', bash_glob_expand_word, emacs_ctlx_keymap);
|
rl_bind_key_in_map ('*', (Function *)bash_glob_expand_word, emacs_ctlx_keymap);
|
||||||
rl_bind_key_in_map ('g', bash_glob_list_expansions, emacs_ctlx_keymap);
|
rl_bind_key_in_map ('g', (Function *)bash_glob_list_expansions, emacs_ctlx_keymap);
|
||||||
|
|
||||||
#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
|
#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
|
||||||
|
|
||||||
rl_add_defun ("dynamic-complete-history", dynamic_complete_history, -1);
|
rl_add_defun ("dynamic-complete-history", (Function *)dynamic_complete_history, -1);
|
||||||
rl_bind_key_in_map (TAB, dynamic_complete_history, emacs_meta_keymap);
|
rl_bind_key_in_map (TAB, (Function *)dynamic_complete_history, emacs_meta_keymap);
|
||||||
|
|
||||||
/* Tell the completer that we want a crack first. */
|
/* Tell the completer that we want a crack first. */
|
||||||
rl_attempted_completion_function = (CPPFunction *)attempt_shell_completion;
|
rl_attempted_completion_function = (CPPFunction *)attempt_shell_completion;
|
||||||
|
|
@ -295,9 +295,9 @@ initialize_readline ()
|
||||||
rl_ignore_some_completions_function = (Function *)filename_completion_ignore;
|
rl_ignore_some_completions_function = (Function *)filename_completion_ignore;
|
||||||
|
|
||||||
#if defined (VI_MODE)
|
#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)
|
# 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
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -561,7 +561,7 @@ static void
|
||||||
set_saved_history ()
|
set_saved_history ()
|
||||||
{
|
{
|
||||||
if (saved_history_line_to_use >= 0)
|
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;
|
saved_history_line_to_use = -1;
|
||||||
rl_startup_hook = old_rl_startup_hook;
|
rl_startup_hook = old_rl_startup_hook;
|
||||||
}
|
}
|
||||||
|
|
@ -573,7 +573,7 @@ operate_and_get_next (count, c)
|
||||||
int where;
|
int where;
|
||||||
|
|
||||||
/* Accept the current line. */
|
/* Accept the current line. */
|
||||||
rl_newline ();
|
rl_newline (1, c);
|
||||||
|
|
||||||
/* Find the current line, and find the next line to use. */
|
/* Find the current line, and find the next line to use. */
|
||||||
where = where_history ();
|
where = where_history ();
|
||||||
|
|
@ -602,7 +602,7 @@ vi_edit_and_execute_command (count, c)
|
||||||
char *command;
|
char *command;
|
||||||
|
|
||||||
/* Accept the current line. */
|
/* Accept the current line. */
|
||||||
rl_newline ();
|
rl_newline (1, c);
|
||||||
|
|
||||||
if (rl_explicit_arg)
|
if (rl_explicit_arg)
|
||||||
{
|
{
|
||||||
|
|
@ -1258,7 +1258,7 @@ set_up_new_line (new_line)
|
||||||
{
|
{
|
||||||
rl_point = old_point;
|
rl_point = old_point;
|
||||||
if (!whitespace (rl_line_buffer[rl_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;
|
rl_point = old_point;
|
||||||
if (!whitespace (rl_line_buffer[rl_point]))
|
if (!whitespace (rl_line_buffer[rl_point]))
|
||||||
rl_forward_word (1);
|
rl_forward_word (1, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -1553,10 +1553,24 @@ name_is_acceptable (name)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static int
|
||||||
|
ignore_dot_names (name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
return (name[0] != '.');
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
filename_completion_ignore (names)
|
filename_completion_ignore (names)
|
||||||
char **names;
|
char **names;
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
|
if (glob_dot_filenames == 0)
|
||||||
|
_ignore_completion_names (names, ignore_dot_names);
|
||||||
|
#endif
|
||||||
|
|
||||||
setup_ignore_patterns (&fignore);
|
setup_ignore_patterns (&fignore);
|
||||||
|
|
||||||
if (fignore.num_ignores == 0)
|
if (fignore.num_ignores == 0)
|
||||||
|
|
@ -1597,14 +1611,15 @@ static int
|
||||||
bash_directory_completion_hook (dirname)
|
bash_directory_completion_hook (dirname)
|
||||||
char **dirname;
|
char **dirname;
|
||||||
{
|
{
|
||||||
char *local_dirname, *t;
|
char *local_dirname, *new_dirname, *t;
|
||||||
int return_value = 0;
|
int return_value = 0;
|
||||||
WORD_LIST *wl;
|
WORD_LIST *wl;
|
||||||
|
|
||||||
local_dirname = *dirname;
|
local_dirname = *dirname;
|
||||||
|
new_dirname = savestring (local_dirname);
|
||||||
if (strchr (local_dirname, '$') || strchr (local_dirname, '`'))
|
if (strchr (local_dirname, '$') || strchr (local_dirname, '`'))
|
||||||
{
|
{
|
||||||
wl = expand_string (local_dirname, 0);
|
wl = expand_string (new_dirname, 0);
|
||||||
if (wl)
|
if (wl)
|
||||||
{
|
{
|
||||||
*dirname = string_list (wl);
|
*dirname = string_list (wl);
|
||||||
|
|
@ -1612,11 +1627,13 @@ bash_directory_completion_hook (dirname)
|
||||||
actually expanded something. */
|
actually expanded something. */
|
||||||
return_value = STREQ (local_dirname, *dirname) == 0;
|
return_value = STREQ (local_dirname, *dirname) == 0;
|
||||||
free (local_dirname);
|
free (local_dirname);
|
||||||
|
free (new_dirname);
|
||||||
dispose_words (wl);
|
dispose_words (wl);
|
||||||
local_dirname = *dirname;
|
local_dirname = *dirname;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
free (new_dirname);
|
||||||
free (local_dirname);
|
free (local_dirname);
|
||||||
*dirname = xmalloc (1);
|
*dirname = xmalloc (1);
|
||||||
**dirname = '\0';
|
**dirname = '\0';
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
# This Makefile for building libbuiltins.a is in -*- text -*- for Emacs.
|
# This Makefile for building libbuiltins.a is in -*- text -*- for Emacs.
|
||||||
#
|
#
|
||||||
SHELL = /bin/sh
|
SHELL = @MAKE_SHELL@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
CC = @CC@
|
CC = @CC@
|
||||||
CC_FOR_BUILD = @CC_FOR_BUILD@
|
CC_FOR_BUILD = @CC_FOR_BUILD@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
|
ARFLAGS = @ARFLAGS@
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
CP = cp
|
CP = cp
|
||||||
|
|
||||||
|
|
@ -24,7 +25,7 @@ LDFLAGS = @LDFLAGS@ $(LOCAL_LDFLAGS) $(CFLAGS)
|
||||||
LOCAL_LDFLAGS = @LOCAL_LDFLAGS@
|
LOCAL_LDFLAGS = @LOCAL_LDFLAGS@
|
||||||
LIBS = @LIBS@
|
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) \
|
CCFLAGS = ${PROFILE_FLAGS} $(DEFS) $(LOCAL_DEFS) $(SYSTEM_FLAGS) $(CPPFLAGS) \
|
||||||
${INCLUDES} $(LOCAL_CFLAGS) $(CFLAGS)
|
${INCLUDES} $(LOCAL_CFLAGS) $(CFLAGS)
|
||||||
|
|
@ -87,7 +88,7 @@ all: $(MKBUILTINS) libbuiltins.a
|
||||||
|
|
||||||
libbuiltins.a: $(MKBUILTINS) $(OFILES) builtins.o
|
libbuiltins.a: $(MKBUILTINS) $(OFILES) builtins.o
|
||||||
$(RM) $@
|
$(RM) $@
|
||||||
$(AR) cr $@ $(OFILES)
|
$(AR) $(ARFLAGS) $@ $(OFILES)
|
||||||
-$(RANLIB) $@
|
-$(RANLIB) $@
|
||||||
|
|
||||||
builtext.h builtins.c: $(MKBUILTINS) $(DEFSRC)
|
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
|
@-if test -f builtext.h; then mv -f builtext.h old-builtext.h; fi
|
||||||
./$(MKBUILTINS) -externfile builtext.h -structfile builtins.c \
|
./$(MKBUILTINS) -externfile builtext.h -structfile builtins.c \
|
||||||
-noproduction $(DIRECTDEFINE) $(DEFSRC)
|
-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; \
|
mv old-builtext.h builtext.h; \
|
||||||
else \
|
else \
|
||||||
$(RM) old-builtext.h; \
|
$(RM) old-builtext.h; \
|
||||||
fi
|
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; \
|
mv old-builtins.c builtins.c; \
|
||||||
else \
|
else \
|
||||||
$(RM) old-builtins.c; \
|
$(RM) old-builtins.c; \
|
||||||
|
|
@ -112,7 +113,7 @@ mkbuiltins.o: mkbuiltins.c
|
||||||
$(CC_FOR_BUILD) -c $(CCFLAGS) $<
|
$(CC_FOR_BUILD) -c $(CCFLAGS) $<
|
||||||
|
|
||||||
mkbuiltins: mkbuiltins.o
|
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
|
# rules for deficient makes, like SunOS
|
||||||
mkbuiltins.o: mkbuiltins.c
|
mkbuiltins.o: mkbuiltins.c
|
||||||
|
|
@ -126,7 +127,7 @@ evalfile.o: evalfile.c
|
||||||
ulimit.o: pipesize.h
|
ulimit.o: pipesize.h
|
||||||
|
|
||||||
pipesize.h: psize.aux
|
pipesize.h: psize.aux
|
||||||
$(SHELL) $(srcdir)/psize.sh > pipesize.h
|
$(SHELL) $(srcdir)/psize.sh > $@
|
||||||
|
|
||||||
psize.aux: psize.c
|
psize.aux: psize.c
|
||||||
$(CC_FOR_BUILD) $(CCFLAGS) -o $@ $(srcdir)/psize.c
|
$(CC_FOR_BUILD) $(CCFLAGS) -o $@ $(srcdir)/psize.c
|
||||||
|
|
@ -139,7 +140,7 @@ builtins.texi: $(MKBUILTINS)
|
||||||
./$(MKBUILTINS) -documentonly $(DEFSRC)
|
./$(MKBUILTINS) -documentonly $(DEFSRC)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) $(OFILES) $(CREATED_FILES) $(MKBUILTINS) libbuiltins.a
|
$(RM) $(OFILES) $(CREATED_FILES) $(MKBUILTINS) mkbuiltins.o libbuiltins.a
|
||||||
|
|
||||||
mostlyclean:
|
mostlyclean:
|
||||||
$(RM) $(OFILES) libbuiltins.a
|
$(RM) $(OFILES) libbuiltins.a
|
||||||
|
|
|
||||||
|
|
@ -140,22 +140,20 @@ bindpwd (no_symlinks)
|
||||||
else
|
else
|
||||||
dirname = get_working_directory ("cd");
|
dirname = get_working_directory ("cd");
|
||||||
|
|
||||||
bind_variable ("OLDPWD", get_string_value ("PWD"));
|
|
||||||
|
|
||||||
old_anm = array_needs_making;
|
old_anm = array_needs_making;
|
||||||
tvar = bind_variable ("PWD", dirname);
|
pwdvar = get_string_value ("PWD");
|
||||||
/* This is an efficiency hack. If PWD is exported, we will need to
|
|
||||||
remake the exported environment every time we change directories.
|
tvar = bind_variable ("OLDPWD", pwdvar);
|
||||||
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. */
|
|
||||||
if (old_anm == 0 && array_needs_making && exported_p (tvar))
|
if (old_anm == 0 && array_needs_making && exported_p (tvar))
|
||||||
{
|
{
|
||||||
pwdvar = xmalloc (STRLEN (dirname) + 5); /* 5 = "PWD" + '=' + '\0' */
|
update_export_env_inplace ("OLDPWD=", 7, pwdvar);
|
||||||
strcpy (pwdvar, "PWD=");
|
array_needs_making = 0;
|
||||||
if (dirname)
|
}
|
||||||
strcpy (pwdvar + 4, dirname);
|
|
||||||
add_or_supercede_exported_var (pwdvar, 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;
|
array_needs_making = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -243,7 +241,7 @@ cd_builtin (list)
|
||||||
{
|
{
|
||||||
/* Find directory in $CDPATH. */
|
/* Find directory in $CDPATH. */
|
||||||
path_index = 0;
|
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 is 1 if the path element is non-empty */
|
||||||
opt = path[0] != '\0';
|
opt = path[0] != '\0';
|
||||||
|
|
|
||||||
|
|
@ -26,17 +26,17 @@ $FUNCTION enable_builtin
|
||||||
$SHORT_DOC enable [-pnds] [-a] [-f filename] [name ...]
|
$SHORT_DOC enable [-pnds] [-a] [-f filename] [name ...]
|
||||||
Enable and disable builtin shell commands. This allows
|
Enable and disable builtin shell commands. This allows
|
||||||
you to use a disk command which has the same name as a shell
|
you to use a disk command which has the same name as a shell
|
||||||
builtin. If -n is used, the NAMEs become disabled; otherwise
|
builtin without specifying a full pathname. If -n is used, the
|
||||||
NAMEs are enabled. For example, to use the `test' found on your
|
NAMEs become disabled; otherwise NAMEs are enabled. For example,
|
||||||
path instead of the shell builtin version, type `enable -n test'.
|
to use the `test' found in $PATH instead of the shell builtin
|
||||||
On systems supporting dynamic loading, the -f option may be used
|
version, type `enable -n test'. On systems supporting dynamic
|
||||||
to load new builtins from the shared object FILENAME. The -d
|
loading, the -f option may be used to load new builtins from the
|
||||||
option will delete a builtin previously loaded with -f. If no
|
shared object FILENAME. The -d option will delete a builtin
|
||||||
non-option names are given, or the -p option is supplied, a list
|
previously loaded with -f. If no non-option names are given, or
|
||||||
of builtins is printed. The -a option means to print every builtin
|
the -p option is supplied, a list of builtins is printed. The
|
||||||
with an indication of whether or not it is enabled. The -s option
|
-a option means to print every builtin with an indication of whether
|
||||||
restricts the output to the Posix.2 `special' builtins. The -n
|
or not it is enabled. The -s option restricts the output to the POSIX.2
|
||||||
option displays a list of all disabled builtins.
|
`special' builtins. The -n option displays a list of all disabled builtins.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -391,6 +391,20 @@ delete_builtin (b)
|
||||||
shell_builtins = new_shell_builtins;
|
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
|
static int
|
||||||
dyn_unload_builtin (name)
|
dyn_unload_builtin (name)
|
||||||
char *name;
|
char *name;
|
||||||
|
|
@ -398,6 +412,7 @@ dyn_unload_builtin (name)
|
||||||
struct builtin *b;
|
struct builtin *b;
|
||||||
void *handle;
|
void *handle;
|
||||||
int ref, i;
|
int ref, i;
|
||||||
|
char *uerror;
|
||||||
|
|
||||||
b = builtin_address_internal (name, 1);
|
b = builtin_address_internal (name, 1);
|
||||||
if (b == 0)
|
if (b == 0)
|
||||||
|
|
@ -420,7 +435,7 @@ dyn_unload_builtin (name)
|
||||||
|
|
||||||
/* Don't remove the shared object unless the reference count of builtins
|
/* Don't remove the shared object unless the reference count of builtins
|
||||||
using it drops to zero. */
|
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 ());
|
builtin_error ("cannot delete %s: %s", name, dlerror ());
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,8 @@
|
||||||
extern int errno;
|
extern int errno;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define IS_BUILTIN(s) (builtin_address_internal(s, 0) != (struct builtin *)NULL)
|
||||||
|
|
||||||
extern void run_trap_cleanup ();
|
extern void run_trap_cleanup ();
|
||||||
|
|
||||||
extern int interactive, interactive_shell;
|
extern int interactive, interactive_shell;
|
||||||
|
|
@ -181,7 +183,7 @@ parse_and_execute (string, from_file, flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
programming_error ("parse_and_execute: bad jump: code %d", code);
|
command_error ("parse_and_execute", CMDERR_BADJUMP, code, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -206,9 +208,20 @@ parse_and_execute (string, from_file, flags)
|
||||||
global_command = (COMMAND *)NULL;
|
global_command = (COMMAND *)NULL;
|
||||||
|
|
||||||
#if defined (ONESHOT)
|
#if defined (ONESHOT)
|
||||||
if (startup_state == 2 && *bash_input.location.string == '\0' &&
|
/*
|
||||||
command->type == cm_simple && !command->redirects &&
|
* IF
|
||||||
!command->value.Simple->redirects &&
|
* 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_TIME_PIPELINE) == 0))
|
||||||
{
|
{
|
||||||
command->flags |= CMD_NO_FORK;
|
command->flags |= CMD_NO_FORK;
|
||||||
|
|
|
||||||
|
|
@ -26,13 +26,13 @@ $FUNCTION fc_builtin
|
||||||
$DEPENDS_ON HISTORY
|
$DEPENDS_ON HISTORY
|
||||||
$SHORT_DOC fc [-e ename] [-nlr] [first] [last] or fc -s [pat=rep] [cmd]
|
$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
|
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, which means the most recent command beginning with that
|
||||||
string.
|
string.
|
||||||
|
|
||||||
-e ENAME selects which editor to use. Default is FCEDIT, then EDITOR,
|
-e ENAME selects which editor to use. Default is FCEDIT, then EDITOR,
|
||||||
then the editor which corresponds to the current readline editing
|
then vi.
|
||||||
mode, then vi.
|
|
||||||
|
|
||||||
-l means list lines instead of editing.
|
-l means list lines instead of editing.
|
||||||
-n means no line numbers listed.
|
-n means no line numbers listed.
|
||||||
|
|
@ -156,7 +156,7 @@ fc_builtin (list)
|
||||||
register int i;
|
register int i;
|
||||||
register char *sep;
|
register char *sep;
|
||||||
int numbering, reverse, listing, execute;
|
int numbering, reverse, listing, execute;
|
||||||
int histbeg, histend, last_hist, retval, first, opt;
|
int histbeg, histend, last_hist, retval, opt;
|
||||||
FILE *stream;
|
FILE *stream;
|
||||||
REPL *rlist, *rl;
|
REPL *rlist, *rl;
|
||||||
char *ename, *command, *newcom, *line;
|
char *ename, *command, *newcom, *line;
|
||||||
|
|
@ -372,64 +372,11 @@ fc_builtin (list)
|
||||||
return (EXECUTION_FAILURE);
|
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
|
/* 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.,
|
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
|
if this is called by vi_edit_and_execute_command) may have already
|
||||||
called bash_history_disable. */
|
called bash_history_disable. */
|
||||||
remember_on_history = 1;
|
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
|
/* Turn on the `v' flag while fc_execute_file runs so the commands
|
||||||
will be echoed as they are read by the parser. */
|
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;
|
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
|
#ifdef TEST
|
||||||
|
|
||||||
/* Compile with -DTEST to make an executable for use in testing
|
/* 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++)
|
for (i = 0; i < 10 && dollar_vars[i]; i++)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
sh_getopt_restore_state (dollar_vars);
|
||||||
ret = sh_getopt (i, dollar_vars, optstr);
|
ret = sh_getopt (i, dollar_vars, optstr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -198,6 +200,7 @@ dogetopts (argc, argv)
|
||||||
for (words = rest_of_args; words; words = words->next, i++)
|
for (words = rest_of_args; words; words = words->next, i++)
|
||||||
v[i] = words->word->word;
|
v[i] = words->word->word;
|
||||||
v[i] = (char *)NULL;
|
v[i] = (char *)NULL;
|
||||||
|
sh_getopt_restore_state (v);
|
||||||
ret = sh_getopt (i, v, optstr);
|
ret = sh_getopt (i, v, optstr);
|
||||||
free (v);
|
free (v);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -130,6 +130,10 @@ char *assignment_builtins[] =
|
||||||
static int is_special_builtin ();
|
static int is_special_builtin ();
|
||||||
static int is_assignment_builtin ();
|
static int is_assignment_builtin ();
|
||||||
|
|
||||||
|
#if !defined (HAVE_RENAME)
|
||||||
|
static int rename ();
|
||||||
|
#endif
|
||||||
|
|
||||||
void extract_info ();
|
void extract_info ();
|
||||||
|
|
||||||
void file_error ();
|
void file_error ();
|
||||||
|
|
@ -265,8 +269,7 @@ main (argc, argv)
|
||||||
{
|
{
|
||||||
write_longdocs (structfile, saved_builtins);
|
write_longdocs (structfile, saved_builtins);
|
||||||
fclose (structfile);
|
fclose (structfile);
|
||||||
link (temp_struct_filename, struct_filename);
|
rename (temp_struct_filename, struct_filename);
|
||||||
unlink (temp_struct_filename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (externfile)
|
if (externfile)
|
||||||
|
|
@ -457,6 +460,10 @@ extract_info (filename, structfile, externfile)
|
||||||
if ((nr = read (fd, buffer, file_size)) < 0)
|
if ((nr = read (fd, buffer, file_size)) < 0)
|
||||||
file_error (filename);
|
file_error (filename);
|
||||||
|
|
||||||
|
/* This is needed on WIN32, and does not hurt on Unix. */
|
||||||
|
if (nr < file_size)
|
||||||
|
file_size = nr;
|
||||||
|
|
||||||
close (fd);
|
close (fd);
|
||||||
|
|
||||||
if (nr == 0)
|
if (nr == 0)
|
||||||
|
|
@ -1395,3 +1402,16 @@ is_assignment_builtin (name)
|
||||||
{
|
{
|
||||||
return (_find_in_table (name, assignment_builtins));
|
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)
|
printf_builtin (list)
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
{
|
{
|
||||||
int ch, end, fieldwidth, precision, foundmod;
|
int ch, end, fieldwidth, precision, foundmod, fmtlen;
|
||||||
char convch, nextch, *format, *fmt, *start;
|
char convch, nextch, *format, *fmt, *start;
|
||||||
|
|
||||||
retval = EXECUTION_SUCCESS;
|
retval = EXECUTION_SUCCESS;
|
||||||
|
|
@ -125,12 +125,12 @@ printf_builtin (list)
|
||||||
if (list->word->word == 0 || list->word->word[0] == '\0')
|
if (list->word->word == 0 || list->word->word[0] == '\0')
|
||||||
return (EXECUTION_SUCCESS);
|
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;
|
garglist = list->next;
|
||||||
|
|
||||||
/* If the format string is empty after preprocessing, return immediately. */
|
/* 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);
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
||||||
/* Basic algorithm is to scan the format string for conversion
|
/* 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
|
format strings are reused as necessary to use up the provided
|
||||||
arguments, arguments of zero/null string are provided to use
|
arguments, arguments of zero/null string are provided to use
|
||||||
up the format string. */
|
up the format string. */
|
||||||
|
#define FMTIND (fmt - format)
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
/* find next format specification */
|
/* find next format specification */
|
||||||
for (fmt = format; *fmt; fmt++)
|
for (fmt = format; FMTIND < fmtlen; fmt++)
|
||||||
{
|
{
|
||||||
precision = fieldwidth = foundmod = 0;
|
precision = fieldwidth = foundmod = 0;
|
||||||
|
|
||||||
|
|
@ -179,11 +180,6 @@ printf_builtin (list)
|
||||||
/* skip to conversion char */
|
/* skip to conversion char */
|
||||||
for (; *fmt && strchr(SKIP2, *fmt); ++fmt)
|
for (; *fmt && strchr(SKIP2, *fmt); ++fmt)
|
||||||
;
|
;
|
||||||
if (*fmt == 0)
|
|
||||||
{
|
|
||||||
builtin_error ("`%s': missing format character", start);
|
|
||||||
PRETURN (EXECUTION_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* skip possible format modifiers */
|
/* skip possible format modifiers */
|
||||||
if (*fmt == 'l' || *fmt == 'L' || *fmt == 'h')
|
if (*fmt == 'l' || *fmt == 'L' || *fmt == 'h')
|
||||||
|
|
@ -192,6 +188,12 @@ printf_builtin (list)
|
||||||
foundmod = 1;
|
foundmod = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (*fmt == 0)
|
||||||
|
{
|
||||||
|
builtin_error ("`%s': missing format character", start);
|
||||||
|
PRETURN (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
convch = *fmt;
|
convch = *fmt;
|
||||||
nextch = fmt[1];
|
nextch = fmt[1];
|
||||||
fmt[1] = '\0';
|
fmt[1] = '\0';
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,10 @@ $END
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "builtext.h"
|
#include "builtext.h"
|
||||||
|
|
||||||
|
#ifdef LOADABLE_BUILTIN
|
||||||
|
# include "builtins.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined (errno)
|
#if !defined (errno)
|
||||||
extern int errno;
|
extern int errno;
|
||||||
#endif /* !errno */
|
#endif /* !errno */
|
||||||
|
|
@ -642,4 +646,98 @@ get_directory_stack ()
|
||||||
free (d);
|
free (d);
|
||||||
return ret; /* was (REVERSE_LIST (ret, (WORD_LIST *)); */
|
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 */
|
#endif /* PUSHD_AND_POPD */
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,7 @@ read_builtin (list)
|
||||||
c = rlbuf[rlind++];
|
c = rlbuf[rlind++];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (((retval = read (0, &c, 1)) < 0) && errno == EINTR)
|
while (((retval = read (0, &c, 1)) < 0) && errno == EINTR)
|
||||||
|
|
@ -199,6 +200,10 @@ read_builtin (list)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined (READLINE)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (i + 2 >= size)
|
if (i + 2 >= size)
|
||||||
input_string = xrealloc (input_string, size += 128);
|
input_string = xrealloc (input_string, size += 128);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ $END
|
||||||
|
|
||||||
$BUILTIN { ... }
|
$BUILTIN { ... }
|
||||||
$DOCNAME grouping_braces
|
$DOCNAME grouping_braces
|
||||||
$SHORT_DOC { COMMANDS }
|
$SHORT_DOC { COMMANDS ; }
|
||||||
Run a set of commands in a group. This is one way to redirect an
|
Run a set of commands in a group. This is one way to redirect an
|
||||||
entire set of commands.
|
entire set of commands.
|
||||||
$END
|
$END
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ $SHORT_DOC set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
|
||||||
noclobber same as -C
|
noclobber same as -C
|
||||||
noexec same as -n
|
noexec same as -n
|
||||||
noglob same as -f
|
noglob same as -f
|
||||||
notify save as -b
|
notify same as -b
|
||||||
nounset same as -u
|
nounset same as -u
|
||||||
onecmd same as -t
|
onecmd same as -t
|
||||||
physical same as -P
|
physical same as -P
|
||||||
|
|
|
||||||
|
|
@ -79,10 +79,19 @@ extern int hist_verify, history_reediting, perform_hostname_completion;
|
||||||
extern void enable_hostname_completion ();
|
extern void enable_hostname_completion ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined (RESTRICTED_SHELL)
|
||||||
|
extern int restricted_shell;
|
||||||
|
extern char *shell_name;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void set_shellopts ();
|
extern void set_shellopts ();
|
||||||
|
|
||||||
static int set_interactive_comments ();
|
static int set_interactive_comments ();
|
||||||
|
|
||||||
|
#if defined (RESTRICTED_SHELL)
|
||||||
|
static int set_restricted_shell ();
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
char *name;
|
char *name;
|
||||||
int *value;
|
int *value;
|
||||||
|
|
@ -120,6 +129,9 @@ static struct {
|
||||||
{ "nocaseglob", &glob_ignore_case, (Function *)NULL },
|
{ "nocaseglob", &glob_ignore_case, (Function *)NULL },
|
||||||
{ "nullglob", &allow_null_glob_expansion, (Function *)NULL },
|
{ "nullglob", &allow_null_glob_expansion, (Function *)NULL },
|
||||||
{ "promptvars", &promptvars, (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 },
|
{ "shift_verbose", &print_shift_error, (Function *)NULL },
|
||||||
{ "sourcepath", &source_uses_path, (Function *)NULL },
|
{ "sourcepath", &source_uses_path, (Function *)NULL },
|
||||||
{ (char *)0, (int *)0, (Function *)NULL }
|
{ (char *)0, (int *)0, (Function *)NULL }
|
||||||
|
|
@ -262,7 +274,7 @@ toggle_shopts (mode, list, quiet)
|
||||||
return (rval);
|
return (rval);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static void
|
||||||
print_shopt (name, val, flags)
|
print_shopt (name, val, flags)
|
||||||
char *name;
|
char *name;
|
||||||
int val, flags;
|
int val, flags;
|
||||||
|
|
@ -400,3 +412,20 @@ set_interactive_comments (mode)
|
||||||
set_shellopts ();
|
set_shellopts ();
|
||||||
return (0);
|
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 (list == 0)
|
||||||
{
|
{
|
||||||
if (this_command_name[0] == '[' && !this_command_name[1])
|
if (this_command_name[0] == '[' && !this_command_name[1])
|
||||||
builtin_error ("missing `]'");
|
{
|
||||||
|
builtin_error ("missing `]'");
|
||||||
|
return (EX_BADUSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ $END
|
||||||
#endif /* ALIAS */
|
#endif /* ALIAS */
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "bashgetopt.h"
|
||||||
|
|
||||||
extern int find_reserved_word ();
|
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
|
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
|
execve, or if it is a builtin command, or an alias. Possible flag
|
||||||
arguments:
|
arguments:
|
||||||
-type Returns the "type" of the object, one of
|
-t Returns the "type" of the object, one of
|
||||||
`alias', `keyword', `function', `builtin',
|
`alias', `keyword', `function', `builtin',
|
||||||
or `file'.
|
or `file'.
|
||||||
|
|
||||||
-path Returns the pathname of the file if -type is
|
-p Returns the pathname of the file if -type is
|
||||||
a file.
|
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,
|
be a filename in the path, alias, function,
|
||||||
or builtin.
|
or builtin.
|
||||||
Order of evaluation:
|
Order of evaluation:
|
||||||
|
|
@ -86,12 +87,14 @@ extern int find_reserved_word ();
|
||||||
builtin
|
builtin
|
||||||
file
|
file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
type_builtin (list)
|
type_builtin (list)
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
{
|
{
|
||||||
int path_only, type_only, all, verbose;
|
int path_only, type_only, all, verbose;
|
||||||
int successful_finds;
|
int successful_finds, opt;
|
||||||
|
WORD_LIST *prev, *this;
|
||||||
|
|
||||||
if (list == 0)
|
if (list == 0)
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
@ -99,32 +102,69 @@ type_builtin (list)
|
||||||
path_only = type_only = all = 0;
|
path_only = type_only = all = 0;
|
||||||
successful_finds = 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;
|
type_only = 1;
|
||||||
path_only = 0;
|
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;
|
path_only = 1;
|
||||||
type_only = 0;
|
type_only = 0;
|
||||||
}
|
}
|
||||||
else if (flag[0] == 'a' && (!flag[1] || strcmp (flag + 1, "ll") == 0))
|
else if (STREQ (flag, "all") || STREQ (flag, "-all"))
|
||||||
{
|
all = 1;
|
||||||
all = 1;
|
|
||||||
}
|
|
||||||
else
|
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 ();
|
builtin_usage ();
|
||||||
return (EX_USAGE);
|
return (EX_USAGE);
|
||||||
}
|
}
|
||||||
list = list->next;
|
|
||||||
}
|
}
|
||||||
|
list = loptend;
|
||||||
|
|
||||||
if (type_only)
|
if (type_only)
|
||||||
verbose = 1;
|
verbose = 1;
|
||||||
|
|
@ -150,10 +190,7 @@ type_builtin (list)
|
||||||
|
|
||||||
fflush (stdout);
|
fflush (stdout);
|
||||||
|
|
||||||
if (successful_finds != 0)
|
return ((successful_finds != 0) ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
|
||||||
return (EXECUTION_SUCCESS);
|
|
||||||
else
|
|
||||||
return (EXECUTION_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -202,7 +239,7 @@ describe_command (command, verbose, all)
|
||||||
|
|
||||||
found = 1;
|
found = 1;
|
||||||
|
|
||||||
if (!all)
|
if (all == 0)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
#endif /* ALIAS */
|
#endif /* ALIAS */
|
||||||
|
|
@ -220,7 +257,7 @@ describe_command (command, verbose, all)
|
||||||
|
|
||||||
found = 1;
|
found = 1;
|
||||||
|
|
||||||
if (!all)
|
if (all == 0)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -251,7 +288,7 @@ describe_command (command, verbose, all)
|
||||||
|
|
||||||
found = 1;
|
found = 1;
|
||||||
|
|
||||||
if (!all)
|
if (all == 0)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -267,7 +304,7 @@ describe_command (command, verbose, all)
|
||||||
|
|
||||||
found = 1;
|
found = 1;
|
||||||
|
|
||||||
if (!all)
|
if (all == 0)
|
||||||
return (1);
|
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. */
|
whether the file is present in our hash table. */
|
||||||
if (!all)
|
if (all == 0)
|
||||||
{
|
{
|
||||||
if ((full_path = find_hashed_filename (command)) != (char *)NULL)
|
if ((full_path = find_hashed_filename (command)) != (char *)NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -314,7 +351,7 @@ describe_command (command, verbose, all)
|
||||||
/* Now search through $PATH. */
|
/* Now search through $PATH. */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (!all)
|
if (all == 0)
|
||||||
full_path = find_user_command (command);
|
full_path = find_user_command (command);
|
||||||
else
|
else
|
||||||
full_path =
|
full_path =
|
||||||
|
|
@ -337,7 +374,7 @@ describe_command (command, verbose, all)
|
||||||
free (full_path);
|
free (full_path);
|
||||||
full_path = (char *)NULL;
|
full_path = (char *)NULL;
|
||||||
|
|
||||||
if (!all)
|
if (all == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,24 +154,20 @@ extern int errno;
|
||||||
# define RLIM_INFINITY 0x7fffffff
|
# define RLIM_INFINITY 0x7fffffff
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined (RLIM_INVALID)
|
|
||||||
# define RLIM_INVALID (RLIMTYPE)-1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define LIMIT_HARD 0x01
|
#define LIMIT_HARD 0x01
|
||||||
#define LIMIT_SOFT 0x02
|
#define LIMIT_SOFT 0x02
|
||||||
|
|
||||||
static int ulimit_internal ();
|
static int ulimit_internal __P((int, char *, int, int));
|
||||||
static void printone ();
|
static void printone __P((int, RLIMTYPE, int));
|
||||||
static void print_all_limits ();
|
static void print_all_limits __P((int));
|
||||||
|
|
||||||
static int get_limit ();
|
static int get_limit __P((int, int, RLIMTYPE *));
|
||||||
static int set_limit ();
|
static int set_limit __P((int, RLIMTYPE, int));
|
||||||
|
|
||||||
static RLIMTYPE filesize ();
|
static int filesize __P((RLIMTYPE *));
|
||||||
static RLIMTYPE pipesize ();
|
static int pipesize __P((RLIMTYPE *));
|
||||||
static RLIMTYPE getmaxuprc ();
|
static int getmaxuprc __P((int, RLIMTYPE *));
|
||||||
static RLIMTYPE getmaxvm ();
|
static int getmaxvm __P((int, RLIMTYPE *));
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int option; /* The ulimit option for this limit. */
|
int option; /* The ulimit option for this limit. */
|
||||||
|
|
@ -351,7 +347,6 @@ ulimit_internal (cmd, cmdarg, mode, multiple)
|
||||||
long block_factor;
|
long block_factor;
|
||||||
RLIMTYPE current_limit, real_limit, limit;
|
RLIMTYPE current_limit, real_limit, limit;
|
||||||
|
|
||||||
limit = RLIM_INVALID;
|
|
||||||
setting = cmdarg != 0;
|
setting = cmdarg != 0;
|
||||||
limind = _findlim (cmd);
|
limind = _findlim (cmd);
|
||||||
if (mode == 0)
|
if (mode == 0)
|
||||||
|
|
@ -412,26 +407,30 @@ get_limit (ind, mode, limptr)
|
||||||
switch (limits[ind].parameter)
|
switch (limits[ind].parameter)
|
||||||
{
|
{
|
||||||
case RLIMIT_FILESIZE:
|
case RLIMIT_FILESIZE:
|
||||||
value = filesize ();
|
if (filesize (&value) < 0)
|
||||||
|
return -1;
|
||||||
break;
|
break;
|
||||||
case RLIMIT_PIPESIZE:
|
case RLIMIT_PIPESIZE:
|
||||||
value = pipesize ();
|
if (pipesize (&value) < 0)
|
||||||
|
return -1;
|
||||||
break;
|
break;
|
||||||
case RLIMIT_OPENFILES:
|
case RLIMIT_OPENFILES:
|
||||||
value = (RLIMTYPE)getdtablesize ();
|
value = (RLIMTYPE)getdtablesize ();
|
||||||
break;
|
break;
|
||||||
case RLIMIT_VIRTMEM:
|
case RLIMIT_VIRTMEM:
|
||||||
value = getmaxvm (mode);
|
if (getmaxvm (mode, &value) < 0)
|
||||||
|
return -1;
|
||||||
break;
|
break;
|
||||||
case RLIMIT_MAXUPROC:
|
case RLIMIT_MAXUPROC:
|
||||||
value = getmaxuprc (mode);
|
if (getmaxuprc (mode, &value) < 0)
|
||||||
|
return -1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*limptr = value;
|
*limptr = value;
|
||||||
return ((value == RLIM_INVALID) ? -1 : 0);
|
return (0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -439,6 +438,11 @@ get_limit (ind, mode, limptr)
|
||||||
if (getrlimit (limits[ind].parameter, &limit) < 0)
|
if (getrlimit (limits[ind].parameter, &limit) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
value = (mode & LIMIT_SOFT) ? limit.rlim_cur : limit.rlim_max;
|
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;
|
*limptr = value;
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
|
|
@ -486,6 +490,10 @@ set_limit (ind, newlim, mode)
|
||||||
#if defined (HAVE_RESOURCE)
|
#if defined (HAVE_RESOURCE)
|
||||||
if (getrlimit (limits[ind].parameter, &limit) < 0)
|
if (getrlimit (limits[ind].parameter, &limit) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
# if defined (HPUX9)
|
||||||
|
if (limits[ind].parameter == RLIMIT_FILESIZE)
|
||||||
|
newlim /= 512; /* Ugh. */
|
||||||
|
# endif /* HPUX9 */
|
||||||
val = (current_user.euid != 0 && newlim == RLIM_INFINITY &&
|
val = (current_user.euid != 0 && newlim == RLIM_INFINITY &&
|
||||||
(limit.rlim_cur <= limit.rlim_max))
|
(limit.rlim_cur <= limit.rlim_max))
|
||||||
? limit.rlim_max : newlim;
|
? limit.rlim_max : newlim;
|
||||||
|
|
@ -502,72 +510,91 @@ set_limit (ind, newlim, mode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static RLIMTYPE
|
static int
|
||||||
getmaxvm (mode)
|
getmaxvm (mode, valuep)
|
||||||
int mode;
|
int mode;
|
||||||
|
RLIMTYPE *valuep;
|
||||||
{
|
{
|
||||||
#if defined (HAVE_RESOURCE)
|
#if defined (HAVE_RESOURCE)
|
||||||
struct rlimit rl;
|
struct rlimit rl;
|
||||||
RLIMTYPE maxdata, maxstack;
|
RLIMTYPE maxdata, maxstack;
|
||||||
|
|
||||||
if (getrlimit (RLIMIT_DATA, &rl) < 0)
|
if (getrlimit (RLIMIT_DATA, &rl) < 0)
|
||||||
return (RLIM_INVALID);
|
return -1;
|
||||||
else
|
else
|
||||||
maxdata = (mode & LIMIT_SOFT) ? rl.rlim_cur : rl.rlim_max;
|
maxdata = (mode & LIMIT_SOFT) ? rl.rlim_cur : rl.rlim_max;
|
||||||
|
|
||||||
if (getrlimit (RLIMIT_STACK, &rl) < 0)
|
if (getrlimit (RLIMIT_STACK, &rl) < 0)
|
||||||
return (RLIM_INVALID);
|
return -1;
|
||||||
else
|
else
|
||||||
maxstack = (mode & LIMIT_SOFT) ? rl.rlim_cur : rl.rlim_max;
|
maxstack = (mode & LIMIT_SOFT) ? rl.rlim_cur : rl.rlim_max;
|
||||||
|
|
||||||
/* Protect against overflow. */
|
/* Protect against overflow. */
|
||||||
return ((maxdata / 1024L) + (maxstack / 1024L));
|
*valuep = (maxdata / 1024L) + (maxstack / 1024L);
|
||||||
|
return 0;
|
||||||
#else
|
#else
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return RLIM_INVALID;
|
return -1;
|
||||||
#endif /* HAVE_RESOURCE */
|
#endif /* HAVE_RESOURCE */
|
||||||
}
|
}
|
||||||
|
|
||||||
static RLIMTYPE
|
static int
|
||||||
filesize()
|
filesize(valuep)
|
||||||
|
RLIMTYPE *valuep;
|
||||||
{
|
{
|
||||||
#if !defined (HAVE_RESOURCE)
|
#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
|
#else
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return RLIM_INVALID;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static RLIMTYPE
|
static int
|
||||||
pipesize ()
|
pipesize (valuep)
|
||||||
|
RLIMTYPE *valuep;
|
||||||
{
|
{
|
||||||
#if defined (PIPE_BUF)
|
#if defined (PIPE_BUF)
|
||||||
/* This is defined on Posix systems. */
|
/* This is defined on Posix systems. */
|
||||||
return ((RLIMTYPE) PIPE_BUF);
|
*valuep = (RLIMTYPE) PIPE_BUF;
|
||||||
|
return 0;
|
||||||
#else
|
#else
|
||||||
# if defined (PIPESIZE)
|
# if defined (PIPESIZE)
|
||||||
/* This is defined by running a program from the Makefile. */
|
/* This is defined by running a program from the Makefile. */
|
||||||
return ((RLIMTYPE) PIPESIZE);
|
*valuep = (RLIMTYPE) PIPESIZE;
|
||||||
|
return 0;
|
||||||
# else
|
# else
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return RLIM_INVALID;
|
return -1;
|
||||||
# endif /* PIPESIZE */
|
# endif /* PIPESIZE */
|
||||||
#endif /* PIPE_BUF */
|
#endif /* PIPE_BUF */
|
||||||
}
|
}
|
||||||
|
|
||||||
static RLIMTYPE
|
static int
|
||||||
getmaxuprc (mode)
|
getmaxuprc (mode, valuep)
|
||||||
int mode;
|
int mode;
|
||||||
|
RLIMTYPE *valuep;
|
||||||
{
|
{
|
||||||
# if defined (HAVE_SYSCONF) && defined (_SC_CHILD_MAX)
|
# 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 */
|
# else /* !HAVE_SYSCONF || !_SC_CHILD_MAX */
|
||||||
# if defined (MAXUPRC)
|
# if defined (MAXUPRC)
|
||||||
return ((RLIMTYPE)MAXUPRC);
|
*valuep = (RLIMTYPE) MAXUPRC;
|
||||||
|
return 0;
|
||||||
# else /* MAXUPRC */
|
# else /* MAXUPRC */
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return RLIM_INVALID;
|
return -1;
|
||||||
# endif /* !MAXUPRC */
|
# endif /* !MAXUPRC */
|
||||||
# endif /* !HAVE_SYSCONF || !_SC_CHILD_MAX */
|
# endif /* !HAVE_SYSCONF || !_SC_CHILD_MAX */
|
||||||
}
|
}
|
||||||
|
|
@ -585,8 +612,12 @@ print_all_limits (mode)
|
||||||
for (i = 0; limits[i].option > 0; i++)
|
for (i = 0; limits[i].option > 0; i++)
|
||||||
{
|
{
|
||||||
if (get_limit (i, mode, &value) < 0)
|
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);
|
printf (DESCFMT, limits[limind].description);
|
||||||
if (curlim == RLIM_INFINITY)
|
if (curlim == RLIM_INFINITY)
|
||||||
puts ("unlimited");
|
puts ("unlimited");
|
||||||
else if (curlim == RLIM_INVALID)
|
|
||||||
builtin_error ("cannot get limit: %s\n", strerror (errno));
|
|
||||||
else
|
else
|
||||||
print_rlimtype ((curlim / limits[limind].block_factor), 1);
|
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);
|
printf ("u=%s,g=%s,o=%s\n", ubits, gbits, obits);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the umask from a symbolic mode string similar to that accepted
|
int
|
||||||
by chmod. If the -S argument is given, then print the umask in a
|
parse_symbolic_mode (mode, initial_bits)
|
||||||
symbolic form. */
|
char *mode;
|
||||||
static int
|
int initial_bits;
|
||||||
symbolic_umask (list)
|
|
||||||
WORD_LIST *list;
|
|
||||||
{
|
{
|
||||||
int um, umc, c;
|
int who, op, perm, mask, bits, c;
|
||||||
int who, op, perm, mask;
|
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
/* Get the initial umask. Don't change it yet. */
|
for (s = mode, bits = initial_bits;;)
|
||||||
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 (;;)
|
|
||||||
{
|
{
|
||||||
who = op = perm = mask = 0;
|
who = op = perm = mask = 0;
|
||||||
|
|
||||||
|
|
@ -205,20 +191,20 @@ symbolic_umask (list)
|
||||||
{
|
{
|
||||||
switch (c = *s++)
|
switch (c = *s++)
|
||||||
{
|
{
|
||||||
case 'u':
|
case 'u':
|
||||||
who |= S_IRWXU;
|
who |= S_IRWXU;
|
||||||
continue;
|
continue;
|
||||||
case 'g':
|
case 'g':
|
||||||
who |= S_IRWXG;
|
who |= S_IRWXG;
|
||||||
continue;
|
continue;
|
||||||
case 'o':
|
case 'o':
|
||||||
who |= S_IRWXO;
|
who |= S_IRWXO;
|
||||||
continue;
|
continue;
|
||||||
case 'a':
|
case 'a':
|
||||||
who |= S_IRWXU | S_IRWXG | S_IRWXO;
|
who |= S_IRWXU | S_IRWXG | S_IRWXO;
|
||||||
continue;
|
continue;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -226,13 +212,13 @@ symbolic_umask (list)
|
||||||
op = *s++;
|
op = *s++;
|
||||||
switch (op)
|
switch (op)
|
||||||
{
|
{
|
||||||
case '+':
|
case '+':
|
||||||
case '-':
|
case '-':
|
||||||
case '=':
|
case '=':
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
builtin_error ("bad symbolic mode operator: %c", op);
|
builtin_error ("bad symbolic mode operator: %c", op);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse out the `perm' section of the symbolic mode clause. */
|
/* Parse out the `perm' section of the symbolic mode clause. */
|
||||||
|
|
@ -242,17 +228,15 @@ symbolic_umask (list)
|
||||||
|
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
case 'r':
|
case 'r':
|
||||||
perm |= S_IRUGO;
|
perm |= S_IRUGO;
|
||||||
break;
|
break;
|
||||||
|
case 'w':
|
||||||
case 'w':
|
perm |= S_IWUGO;
|
||||||
perm |= S_IWUGO;
|
break;
|
||||||
break;
|
case 'x':
|
||||||
|
perm |= S_IXUGO;
|
||||||
case 'x':
|
break;
|
||||||
perm |= S_IXUGO;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -265,32 +249,22 @@ symbolic_umask (list)
|
||||||
|
|
||||||
switch (op)
|
switch (op)
|
||||||
{
|
{
|
||||||
case '+':
|
case '+':
|
||||||
umc |= perm;
|
bits |= 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;
|
|
||||||
break;
|
break;
|
||||||
|
case '-':
|
||||||
|
bits &= ~perm;
|
||||||
|
break;
|
||||||
|
case '=':
|
||||||
|
bits &= ~who;
|
||||||
|
bits |= perm;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* No other values are possible. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (*s == '\0')
|
||||||
|
break;
|
||||||
else
|
else
|
||||||
s++; /* skip past ',' */
|
s++; /* skip past ',' */
|
||||||
}
|
}
|
||||||
|
|
@ -300,5 +274,28 @@ symbolic_umask (list)
|
||||||
return (-1);
|
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);
|
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_ASSIGNMENT 0x04 /* This word is a variable assignment. */
|
||||||
#define W_GLOBEXP 0x08 /* This word is the result of a glob expansion. */
|
#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_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 */
|
/* Possible values for subshell_environment */
|
||||||
#define SUBSHELL_ASYNC 0x01 /* subshell caused by `command &' */
|
#define SUBSHELL_ASYNC 0x01 /* subshell caused by `command &' */
|
||||||
|
|
@ -268,6 +269,14 @@ typedef struct group_com {
|
||||||
|
|
||||||
extern COMMAND *global_command;
|
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. */
|
/* Forward declarations of functions declared in copy_cmd.c. */
|
||||||
|
|
||||||
extern WORD_DESC *copy_word __P((WORD_DESC *));
|
extern WORD_DESC *copy_word __P((WORD_DESC *));
|
||||||
|
|
|
||||||
|
|
@ -65,3 +65,7 @@
|
||||||
#if defined (STRCOLL_BROKEN)
|
#if defined (STRCOLL_BROKEN)
|
||||||
# undef HAVE_STRCOLL
|
# undef HAVE_STRCOLL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined (PROMPT_STRING_DECODE)
|
||||||
|
# define PPROMPT "$ "
|
||||||
|
#endif
|
||||||
22
config.h.in
22
config.h.in
|
|
@ -122,9 +122,9 @@
|
||||||
#undef AFS
|
#undef AFS
|
||||||
|
|
||||||
/* End of configuration settings controllable by autoconf. */
|
/* 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. */
|
/* Beginning of autoconf additions. */
|
||||||
|
|
||||||
|
|
@ -187,6 +187,9 @@
|
||||||
/* The number of bytes in a pointer to char. */
|
/* The number of bytes in a pointer to char. */
|
||||||
#undef SIZEOF_CHAR_P
|
#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. */
|
/* Define to `long' if <sys/types.h> doesn't define. */
|
||||||
#undef off_t
|
#undef off_t
|
||||||
|
|
||||||
|
|
@ -208,6 +211,9 @@
|
||||||
/* Define to `int' if <sys/types.h> doesn't define. */
|
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||||
#undef ptrdiff_t
|
#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. */
|
/* Define to `unsigned' if <sys/types.h> doesn't define. */
|
||||||
#undef size_t
|
#undef size_t
|
||||||
|
|
||||||
|
|
@ -392,11 +398,18 @@
|
||||||
/* Define if you have the killpg function. */
|
/* Define if you have the killpg function. */
|
||||||
#undef HAVE_KILLPG
|
#undef HAVE_KILLPG
|
||||||
|
|
||||||
|
/* Define if you have the lstat function. */
|
||||||
#undef HAVE_LSTAT
|
#undef HAVE_LSTAT
|
||||||
|
|
||||||
/* Define if you have the putenv function. */
|
/* Define if you have the putenv function. */
|
||||||
#undef HAVE_PUTENV
|
#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. */
|
/* Define if you have the select function. */
|
||||||
#undef HAVE_SELECT
|
#undef HAVE_SELECT
|
||||||
|
|
||||||
|
|
@ -542,6 +555,9 @@
|
||||||
|
|
||||||
#undef HAVE_LIBSOCKET
|
#undef HAVE_LIBSOCKET
|
||||||
|
|
||||||
|
/* Are we running SVR5 (UnixWare 7)? */
|
||||||
|
#undef SVR5
|
||||||
|
|
||||||
/* Are we running SVR4.2? */
|
/* Are we running SVR4.2? */
|
||||||
#undef SVR4_2
|
#undef SVR4_2
|
||||||
|
|
||||||
|
|
@ -555,6 +571,6 @@
|
||||||
/* Do strcoll(3) and strcmp(3) give different results in the default locale? */
|
/* Do strcoll(3) and strcmp(3) give different results in the default locale? */
|
||||||
#undef STRCOLL_BROKEN
|
#undef STRCOLL_BROKEN
|
||||||
|
|
||||||
#include "config.h.bot"
|
#include "config-bot.h"
|
||||||
|
|
||||||
#endif /* _CONFIG_H_ */
|
#endif /* _CONFIG_H_ */
|
||||||
|
|
|
||||||
233
configure.in
233
configure.in
|
|
@ -1,12 +1,12 @@
|
||||||
dnl
|
dnl
|
||||||
dnl Configure script for bash-2.02
|
dnl Configure script for bash-2.03
|
||||||
dnl
|
dnl
|
||||||
dnl report bugs to chet@po.cwru.edu
|
dnl report bugs to chet@po.cwru.edu
|
||||||
dnl
|
dnl
|
||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
dnl checks for version info
|
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_INIT(shell.h)
|
||||||
AC_CONFIG_HEADER(config.h)
|
AC_CONFIG_HEADER(config.h)
|
||||||
|
|
@ -28,25 +28,28 @@ opt_purify=no
|
||||||
opt_purecov=no
|
opt_purecov=no
|
||||||
opt_afs=no
|
opt_afs=no
|
||||||
opt_curses=no
|
opt_curses=no
|
||||||
|
opt_with_installed_readline=no
|
||||||
|
|
||||||
dnl some systems should be configured without gnu malloc by default
|
dnl some systems should be configured without gnu malloc by default
|
||||||
dnl and some need a special compiler or loader
|
dnl and some need a special compiler or loader
|
||||||
dnl look in the NOTES file for more
|
dnl look in the NOTES file for more
|
||||||
case "${host_cpu}-${host_os}" in
|
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
|
*[Cc]ray*-*) opt_gnu_malloc=no ;; # Crays
|
||||||
*-osf1*) opt_gnu_malloc=no ;; # other osf/1 machines
|
*-osf1*) opt_gnu_malloc=no ;; # other osf/1 machines
|
||||||
sparc-svr4*) opt_gnu_malloc=no ;; # sparc SVR4, SVR4.2
|
sparc-svr4*) opt_gnu_malloc=no ;; # sparc SVR4, SVR4.2
|
||||||
sparc-netbsd*) opt_gnu_malloc=no ;; # needs 8-byte alignment
|
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
|
sparc-linux*) opt_gnu_malloc=no ;; # sparc running linux; requires ELF
|
||||||
#*-freebsd*) opt_gnu_malloc=no ;; # they claim it's better
|
#*-freebsd*) opt_gnu_malloc=no ;; # they claim it's better
|
||||||
*-aix*) opt_gnu_malloc=no ;; # AIX machines
|
*-aix*) opt_gnu_malloc=no ;; # AIX machines
|
||||||
*-nextstep*) opt_gnu_malloc=no ;; # NeXT machines running NeXTstep
|
*-nextstep*) opt_gnu_malloc=no ;; # NeXT machines running NeXTstep
|
||||||
|
*-rhapsody*) opt_gnu_malloc=no ;; # Apple Rhapsody
|
||||||
*-dgux*) opt_gnu_malloc=no ;; # DG/UX machines
|
*-dgux*) opt_gnu_malloc=no ;; # DG/UX machines
|
||||||
*-qnx*) opt_gnu_malloc=no ;; # QNX 4.2
|
*-qnx*) opt_gnu_malloc=no ;; # QNX 4.2
|
||||||
*-machten4) opt_gnu_malloc=no ;; # MachTen 4.x
|
*-machten4) opt_gnu_malloc=no ;; # MachTen 4.x
|
||||||
*-bsdi2.1|*-bsdi3.?) opt_gnu_malloc=no ; : ${CC:=shlicc2} ;; # for loadable builtins
|
*-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
|
*-cygwin32*) opt_gnu_malloc=no ;; # Cygnus's CYGWIN32 environment
|
||||||
esac
|
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(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(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(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(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)
|
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_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
|
if test $opt_alias = yes; then
|
||||||
AC_DEFINE(ALIAS)
|
AC_DEFINE(ALIAS)
|
||||||
fi
|
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
|
if test $opt_dirstack = yes; then
|
||||||
AC_DEFINE(PUSHD_AND_POPD)
|
AC_DEFINE(PUSHD_AND_POPD)
|
||||||
fi
|
fi
|
||||||
|
|
@ -234,10 +221,6 @@ AC_SUBST(TESTSCRIPT)
|
||||||
AC_SUBST(PURIFY)
|
AC_SUBST(PURIFY)
|
||||||
AC_SUBST(MALLOC_TARGET)
|
AC_SUBST(MALLOC_TARGET)
|
||||||
AC_SUBST(MALLOC_SRC)
|
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 Use GNU m4 macros to get the distribution and patchlevel information
|
||||||
dnl into configure without requiring the files to be distributed
|
dnl into configure without requiring the files to be distributed
|
||||||
|
|
@ -256,24 +239,37 @@ BASH_LARGE_FILE_SUPPORT
|
||||||
AC_ISC_POSIX
|
AC_ISC_POSIX
|
||||||
AC_MINIX
|
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 load up the cross-building cache file -- add more cases and cache
|
||||||
dnl files as necessary
|
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
|
if test "x$cross_compiling" = "xyes"; then
|
||||||
case "${host}" in
|
case "${host}" in
|
||||||
*-cygwin32*)
|
*-cygwin32*)
|
||||||
cross_cache=${srcdir}/cross-build/cygwin32.cache
|
cross_cache=${srcdir}/cross-build/cygwin32.cache
|
||||||
if test -r "${cross_cache}"; then
|
SIGNAMES_H='$(srcdir)/cross-build/win32sig.h'
|
||||||
echo "loading cross-build cache file ${cross_cache}"
|
|
||||||
. ${cross_cache}
|
|
||||||
fi
|
|
||||||
unset cross_cache
|
|
||||||
;;
|
;;
|
||||||
*) 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
|
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
|
fi
|
||||||
|
AC_SUBST(SIGNAMES_H)
|
||||||
|
|
||||||
if test -z "$CC_FOR_BUILD"; then
|
if test -z "$CC_FOR_BUILD"; then
|
||||||
if test "x$cross_compiling" = "xno"; then
|
if test "x$cross_compiling" = "xno"; then
|
||||||
|
|
@ -284,15 +280,7 @@ if test -z "$CC_FOR_BUILD"; then
|
||||||
fi
|
fi
|
||||||
AC_SUBST(CC_FOR_BUILD)
|
AC_SUBST(CC_FOR_BUILD)
|
||||||
|
|
||||||
dnl Set SIGNAMES_H based on whether or not we're cross-compiling
|
dnl END changes for cross-building
|
||||||
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 We want these before the checks, so the checks can modify their values.
|
dnl We want these before the checks, so the checks can modify their values.
|
||||||
test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1
|
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
|
dnl these must come after the test for cc/gcc
|
||||||
if test "$opt_profiling" = "yes"; then
|
if test "$opt_profiling" = "yes"; then
|
||||||
PROFILE_FLAGS=-pg
|
PROFILE_FLAGS=-pg
|
||||||
opt_static_link=yes
|
case "$host_os" in
|
||||||
|
solaris2*) ;;
|
||||||
|
*) opt_static_link=yes ;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$opt_static_link" = yes; then
|
if test "$opt_static_link" = yes; then
|
||||||
# if we're using gcc, add `-static' to LDFLAGS
|
# if we're using gcc, add `-static' to LDFLAGS
|
||||||
if test -n "$GCC" || test "$ac_cv_prog_gcc" = "yes"; then
|
if test -n "$GCC" || test "$ac_cv_prog_gcc" = "yes"; then
|
||||||
LDFLAGS="$LDFLAGS -static"
|
STATIC_LD="-static"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_SUBST(CFLAGS)
|
AC_SUBST(CFLAGS)
|
||||||
AC_SUBST(CPPFLAGS)
|
AC_SUBST(CPPFLAGS)
|
||||||
AC_SUBST(LDFLAGS)
|
AC_SUBST(LDFLAGS)
|
||||||
|
AC_SUBST(STATIC_LD)
|
||||||
|
|
||||||
AC_PROG_GCC_TRADITIONAL
|
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
|
dnl programs needed by the build and install process
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_CHECK_PROG(AR, ar, ar)
|
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_RANLIB
|
||||||
AC_PROG_YACC
|
AC_PROG_YACC
|
||||||
AC_PROG_MAKE_SET
|
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
|
dnl special checks for libc functions
|
||||||
AC_FUNC_ALLOCA
|
AC_FUNC_ALLOCA
|
||||||
AC_FUNC_GETPGRP
|
AC_FUNC_GETPGRP
|
||||||
|
|
@ -357,8 +430,8 @@ AC_CHECK_FUNC(mkfifo,AC_DEFINE(HAVE_MKFIFO),AC_DEFINE(MKFIFO_MISSING))
|
||||||
|
|
||||||
dnl checks for system calls
|
dnl checks for system calls
|
||||||
AC_CHECK_FUNCS(dup2 select getdtablesize getgroups gethostname \
|
AC_CHECK_FUNCS(dup2 select getdtablesize getgroups gethostname \
|
||||||
setdtablesize getpagesize killpg lstat getpeername \
|
setdtablesize getpagesize killpg lstat getpeername sbrk \
|
||||||
getrlimit getrusage gettimeofday waitpid tcgetpgrp)
|
getrlimit getrusage gettimeofday waitpid tcgetpgrp rename)
|
||||||
|
|
||||||
dnl checks for c library functions
|
dnl checks for c library functions
|
||||||
AC_CHECK_FUNCS(bcopy bzero confstr getcwd strcasecmp setenv putenv \
|
AC_CHECK_FUNCS(bcopy bzero confstr getcwd strcasecmp setenv putenv \
|
||||||
|
|
@ -418,23 +491,15 @@ AC_CHECK_TYPE(time_t, long)
|
||||||
|
|
||||||
AC_TYPE_SIGNAL
|
AC_TYPE_SIGNAL
|
||||||
|
|
||||||
AC_CHECK_SIZEOF(int)
|
AC_CHECK_SIZEOF(int, 4)
|
||||||
AC_CHECK_SIZEOF(long)
|
AC_CHECK_SIZEOF(long, 4)
|
||||||
AC_CHECK_SIZEOF(char *)
|
AC_CHECK_SIZEOF(char *, 4)
|
||||||
|
AC_CHECK_SIZEOF(double, 8)
|
||||||
|
|
||||||
AC_CHECK_TYPE(int32_t)
|
BASH_TYPE_INT32_T
|
||||||
if test "$ac_cv_type_int32_t" = "no"; then
|
BASH_TYPE_U_INT32_T
|
||||||
BASH_TYPE_INT32_T
|
BASH_TYPE_PTRDIFF_T
|
||||||
fi
|
BASH_TYPE_BITS64_T
|
||||||
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
|
|
||||||
|
|
||||||
dnl structures
|
dnl structures
|
||||||
AC_HEADER_STAT
|
AC_HEADER_STAT
|
||||||
|
|
@ -556,23 +621,33 @@ dnl libraries, and specify any additional local cc flags
|
||||||
dnl
|
dnl
|
||||||
dnl this should really go away someday
|
dnl this should really go away someday
|
||||||
|
|
||||||
case "$host_os" in
|
case "${host_os}" in
|
||||||
sysv4.2*) AC_DEFINE(SVR4_2)
|
sysv4.2*) AC_DEFINE(SVR4_2)
|
||||||
AC_DEFINE(SVR4) ;;
|
AC_DEFINE(SVR4) ;;
|
||||||
sysv4*) AC_DEFINE(SVR4) ;;
|
sysv4*) AC_DEFINE(SVR4) ;;
|
||||||
|
sysv5*) AC_DEFINE(SVR5) ;;
|
||||||
|
hpux9*) LOCAL_CFLAGS="-DHPUX9 -DHPUX" ;;
|
||||||
hpux*) LOCAL_CFLAGS=-DHPUX ;;
|
hpux*) LOCAL_CFLAGS=-DHPUX ;;
|
||||||
dgux*) LOCAL_CFLAGS=-D_DGUX_SOURCE; LOCAL_LIBS=-ldgc ;;
|
dgux*) LOCAL_CFLAGS=-D_DGUX_SOURCE; LOCAL_LIBS=-ldgc ;;
|
||||||
isc*) LOCAL_CFLAGS=-Disc386;;
|
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.2v4*) LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DNO_MEMSCRAMBLE -DPATH_MAX=1024" ;;
|
||||||
sco3.2*) LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
|
sco3.2*) LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
|
||||||
sunos4*) LOCAL_CFLAGS=-DSunOS4 ;;
|
sunos4*) LOCAL_CFLAGS=-DSunOS4 ;;
|
||||||
solaris2.5*) LOCAL_CFLAGS=-DSunOS5 ;;
|
solaris2.5*) LOCAL_CFLAGS=-DSunOS5 ;;
|
||||||
|
lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
|
||||||
linux*) LOCAL_LDFLAGS=-rdynamic ;; # allow dynamic loading
|
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" ;;
|
*qnx*) LOCAL_CFLAGS="-Dqnx -F -3s" LOCAL_LDFLAGS="-3s -lunix -lncurses" ;;
|
||||||
powerux) LOCAL_LIBS="-lgen" ;;
|
powerux*) LOCAL_LIBS="-lgen" ;;
|
||||||
cygwin32*) LOCAL_LIBS="-luser32" ;;
|
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
|
esac
|
||||||
|
|
||||||
case "$host_cpu" in
|
case "$host_cpu" in
|
||||||
|
|
@ -588,6 +663,24 @@ m88k-motorola-sysv3) LOCAL_CFLAGS=-DWAITPID_BROKEN ;;
|
||||||
mips-pyramid-sysv4) LOCAL_CFLAGS=-Xa ;;
|
mips-pyramid-sysv4) LOCAL_CFLAGS=-Xa ;;
|
||||||
esac
|
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
|
# try to create a directory tree if the source is elsewhere
|
||||||
# this should be packaged into a script accessible via ${srcdir}/support
|
# this should be packaged into a script accessible via ${srcdir}/support
|
||||||
case "$srcdir" in
|
case "$srcdir" in
|
||||||
|
|
@ -611,11 +704,13 @@ AC_SUBST(BUILD_DIR)
|
||||||
|
|
||||||
AC_SUBST(YACC)
|
AC_SUBST(YACC)
|
||||||
AC_SUBST(AR)
|
AC_SUBST(AR)
|
||||||
|
AC_SUBST(ARFLAGS)
|
||||||
|
|
||||||
AC_SUBST(BASHVERS)
|
AC_SUBST(BASHVERS)
|
||||||
AC_SUBST(BASHPATCH)
|
AC_SUBST(BASHPATCH)
|
||||||
|
|
||||||
AC_SUBST(host_cpu)
|
AC_SUBST(host_cpu)
|
||||||
|
AC_SUBST(host_vendor)
|
||||||
AC_SUBST(host_os)
|
AC_SUBST(host_os)
|
||||||
|
|
||||||
AC_SUBST(LOCAL_LIBS)
|
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_char_p=${ac_cv_sizeof_char_p='4'}
|
||||||
ac_cv_sizeof_int=${ac_cv_sizeof_int='4'}
|
ac_cv_sizeof_int=${ac_cv_sizeof_int='4'}
|
||||||
ac_cv_sizeof_long=${ac_cv_sizeof_long='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_dup2_broken=${bash_cv_dup2_broken='no'}
|
||||||
bash_cv_pgrp_pipe=${bash_cv_pgrp_pipe='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_int32_t=${bash_cv_type_int32_t='int'}
|
||||||
bash_cv_type_u_int32_t=${bash_cv_type_u_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
|
# 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:
|
default:
|
||||||
programming_error ("dispose_command: bad command type `%d'", command->type);
|
command_error ("dispose_command", CMDERR_BADTYPE, command->type, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
free (command);
|
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
|
This document contains a set of frequently-asked questions concerning
|
||||||
Bash, the GNU Bourne-Again Shell. Bash is a freely-available command
|
Bash, the GNU Bourne-Again Shell. Bash is a freely-available command
|
||||||
|
|
@ -20,87 +20,87 @@ Contents:
|
||||||
|
|
||||||
Section A: The Basics
|
Section A: The Basics
|
||||||
|
|
||||||
1) What is it?
|
A1) What is it?
|
||||||
2) What's the latest version?
|
A2) What's the latest version?
|
||||||
3) Where can I get it?
|
A3) Where can I get it?
|
||||||
4) On what machines will bash run?
|
A4) On what machines will bash run?
|
||||||
5) Will bash run on operating systems other than Unix?
|
A5) Will bash run on operating systems other than Unix?
|
||||||
6) How can I build bash with gcc?
|
A6) How can I build bash with gcc?
|
||||||
7) How can I make bash my login shell?
|
A7) 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
|
A8) I just changed my login shell to bash, and now I can't FTP into my
|
||||||
machine. Why not?
|
machine. Why not?
|
||||||
9) What's the `POSIX 1003.2 standard'?
|
A9) What's the `POSIX 1003.2 standard'?
|
||||||
10) What is the bash `posix mode'?
|
A10) What is the bash `posix mode'?
|
||||||
|
|
||||||
Section B: The latest version
|
Section B: The latest version
|
||||||
|
|
||||||
11) What's new in version 2.02?
|
B1) What's new in version 2.03?
|
||||||
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?
|
bash-1.14.7?
|
||||||
|
|
||||||
Section C: Differences from other Unix shells
|
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?
|
||||||
14) How does bash differ from the Korn shell, version ksh88?
|
C2) How does bash differ from the Korn shell, version ksh88?
|
||||||
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?
|
||||||
|
|
||||||
Section D: Why does bash do some things differently than other Unix shells?
|
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 command' says it will?
|
||||||
17) Why doesn't bash treat brace expansions exactly like csh?
|
D2) Why doesn't bash treat brace expansions exactly like csh?
|
||||||
18) Why doesn't bash have csh variable modifiers?
|
D3) Why doesn't bash have csh variable modifiers?
|
||||||
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?
|
||||||
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 `|&'?
|
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?
|
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
|
Section E: How can I get bash to do certain things, and why does bash do
|
||||||
things the way it does?
|
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?
|
||||||
23) Why does bash sometimes say `Broken pipe'?
|
E2) Why does bash sometimes say `Broken pipe'?
|
||||||
24) How can I get bash to read and display eight-bit characters?
|
E3) 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
|
E4) How do I write a function `x' to replace builtin command `x', but
|
||||||
still invoke the command from within the function?
|
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?
|
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?
|
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?
|
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
|
in arguments to `echo'. Bash doesn't interpret these characters. Why
|
||||||
not, and how can I make it understand them?
|
not, and how can I make it understand them?
|
||||||
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?
|
||||||
31) How can I make the bash `time' reserved word print timing output that
|
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?
|
looks like the output from my system's /usr/bin/time?
|
||||||
|
|
||||||
Section F: Things to watch out for on certain Unix versions
|
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'?
|
||||||
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?
|
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?
|
`~user' tilde expansion on a machine running NIS?
|
||||||
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 `@'?
|
||||||
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?
|
redirection before a subshell command?
|
||||||
|
|
||||||
Section G: Where do I go from here?
|
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?
|
advice?
|
||||||
38) What kind of bash documentation is there?
|
G2) What kind of bash documentation is there?
|
||||||
39) What's coming in future versions?
|
G3) What's coming in future versions?
|
||||||
40) What's on the bash `wish list'?
|
G4) What's on the bash `wish list'?
|
||||||
41) When will the next release appear?
|
G5) When will the next release appear?
|
||||||
|
|
||||||
----------
|
----------
|
||||||
Section A: The Basics
|
Section A: The Basics
|
||||||
|
|
||||||
1) What is it?
|
A1) What is it?
|
||||||
|
|
||||||
Bash is a Unix command interpreter (shell). It is an implementation of
|
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
|
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
|
Foundation. The current developer and maintainer is Chet Ramey
|
||||||
of Case Western Reserve University.
|
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
|
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.
|
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.gnu.org/pub/gnu/bash-2.03.tar.gz
|
||||||
ftp://ftp.cwru.edu/pub/bash/bash-2.02.tar.gz
|
ftp://ftp.cwru.edu/pub/bash/bash-2.03.tar.gz
|
||||||
|
|
||||||
Formatted versions of the documentation are available with the URLs:
|
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.gnu.org/pub/gnu/bash-doc-2.03.tar.gz
|
||||||
ftp://ftp.cwru.edu/pub/bash/bash-doc-2.02.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
|
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
|
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.
|
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
|
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
|
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
|
don't believe anyone has built bash-2.x on earlier Minix versions
|
||||||
yet.
|
yet.
|
||||||
|
|
@ -162,12 +162,12 @@ project. For more information about the project, look at the URL
|
||||||
|
|
||||||
http://www.cygnus.com/misc/gnu-win32
|
http://www.cygnus.com/misc/gnu-win32
|
||||||
|
|
||||||
Cygnus has ported bash-1.14.7, and their port is part of the current
|
Cygnus originally ported bash-1.14.7, and that port was part of their
|
||||||
gnu-win32 release. Cygnus has also done a port of bash-2.01 to the
|
early GNU-Win32 releases. 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
|
GNU-Win32 environment, and it is available as part of their current
|
||||||
release.
|
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.
|
GNU-WIN32.
|
||||||
|
|
||||||
The Cygnus port works only on Intel machines. There is a port of bash
|
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
|
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
|
system, a Unix subsystem for NT that replaces the Microsoft POSIX
|
||||||
subsystem. Check out http://www.interix.com for more information.
|
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
|
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
|
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
|
I haven't looked at either, but the second appears to be a binary-only
|
||||||
distribution. Beware.
|
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
|
Bash configures to use gcc by default if it is available. Read the
|
||||||
file INSTALL in the distribution for more information.
|
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
|
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
|
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
|
a login shell. Once you have this working, you can copy your initialization
|
||||||
code from ~/.profile to ~/.bash_profile.
|
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?
|
machine. Why not?
|
||||||
|
|
||||||
You must add the full pathname to bash to the file /etc/shells. As
|
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
|
Most versions of ftpd use this file to prohibit `special' users
|
||||||
such as `uucp' and `news' from using FTP.
|
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
|
POSIX is a name originally coined by Richard Stallman for a
|
||||||
family of open system standards based on UNIX. There are 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
|
standardized; emacs editing commands were left out due to
|
||||||
objections.
|
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
|
Although bash is an implementation of the POSIX.2 shell
|
||||||
specification, there are areas where the bash default behavior
|
specification, there are areas where the bash default behavior
|
||||||
|
|
@ -314,9 +324,29 @@ Reference Manual.
|
||||||
|
|
||||||
Section B: The latest version
|
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
|
a new version of malloc (based on the old GNU malloc code in previous
|
||||||
bash versions) that is more page-oriented, more conservative
|
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
|
lots of code now smaller and faster
|
||||||
test suite greatly expanded
|
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?
|
bash-1.14.7?
|
||||||
|
|
||||||
There are a few incompatibilities between version 1.14.7 and version 2.02.
|
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.02 distribution.
|
They are detailed in the file COMPAT in the bash-2.03 distribution.
|
||||||
|
|
||||||
Section C: Differences from other Unix shells
|
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
|
This is a non-comprehensive list of features that differentiate bash
|
||||||
from the SVR4.2 shell. The bash manual page explains these more
|
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);
|
bash allows multiple option arguments when invoked (e.g. -x -v);
|
||||||
sh allows only a single option argument (`sh -x -v' attempts
|
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.
|
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
|
sh exits a script if any builtin fails; bash exits only if one of
|
||||||
the POSIX.2 `special' builtins fails
|
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:
|
Things bash has or uses that ksh88 does not:
|
||||||
long invocation options
|
long invocation options
|
||||||
|
|
@ -541,9 +572,9 @@ Implementation differences:
|
||||||
bash has exported functions
|
bash has exported functions
|
||||||
bash command search finds functions before builtins
|
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
|
associative arrays
|
||||||
floating point arithmetic
|
floating point arithmetic
|
||||||
++, --, comma arithmetic operators
|
++, --, comma arithmetic operators
|
||||||
|
|
@ -564,7 +595,7 @@ New things in ksh-93 not in bash-2.02:
|
||||||
read -t/-d
|
read -t/-d
|
||||||
`.' can execute shell functions
|
`.' 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
|
?: arithmetic operator
|
||||||
expansions: ${!param}, ${param:offset[:len]}, ${param/pat[/str]}
|
expansions: ${!param}, ${param:offset[:len]}, ${param/pat[/str]}
|
||||||
compound array assignment
|
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?
|
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 command' says it will?
|
||||||
|
|
||||||
`which' is actually a csh script that assumes you're running csh.
|
On many systems, `which' is actually a csh script that assumes
|
||||||
It reads the csh startup files from your home directory and uses
|
you're running csh. In tcsh, `which' and its cousin `where'
|
||||||
those to determine which `command' will be invoked. Since bash
|
are builtins. On other Unix systems, `which' is a perl script
|
||||||
doesn't use any of those startup files, there's a good chance
|
that uses the PATH environment variable.
|
||||||
that your bash environment differs from your csh environment.
|
|
||||||
|
|
||||||
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
|
The only difference between bash and csh brace expansion is that
|
||||||
bash requires a brace expression to contain at least one unquoted
|
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.
|
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,
|
Posix has specified a more powerful, albeit somewhat more cryptic,
|
||||||
mechanism cribbed from ksh, and bash implements it.
|
mechanism cribbed from ksh, and bash implements it.
|
||||||
|
|
@ -663,7 +715,7 @@ Given
|
||||||
$b:e ${b##*.} xxx
|
$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.
|
Bash uses a different syntax to support aliases than csh does.
|
||||||
The details can be found in the documentation. We have provided
|
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, or as `cshtobash ~/.login' to convert your login
|
||||||
environment.
|
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 `|&'?
|
another, like csh does with `|&'?
|
||||||
|
|
||||||
Use
|
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
|
file descriptor 1 points to the pipe when it is duplicated onto file
|
||||||
descriptor 2.
|
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?
|
ksh features like autoloaded functions and the `whence' command?
|
||||||
|
|
||||||
There are features in ksh-88 that do not have direct bash equivalents.
|
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
|
Section E: How can I get bash to do certain things, and why does bash do
|
||||||
things the way it does?
|
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.
|
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.
|
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
|
If a sequence of commands appears in a pipeline, and one of the
|
||||||
reading commands finishes before the writer has finished, 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
|
will print `Broken pipe' to stderr when ps is killed by a
|
||||||
SIGPIPE.
|
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.
|
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
|
The `set' commands between the single quotes may also be placed
|
||||||
in ~/.inputrc.
|
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?
|
still invoke the command from within the function?
|
||||||
|
|
||||||
This is why the `command' and `builtin' builtins exist. The
|
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';
|
This could also be written using `command' instead of `builtin';
|
||||||
the version above is marginally more efficient.
|
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?
|
wrap lines at the wrong column?
|
||||||
|
|
||||||
Readline, the line editing library that bash uses, does not know
|
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,
|
Use the \[ escape to begin a sequence of non-printing characters,
|
||||||
and the \] escape to signal the end of such a sequence.
|
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?
|
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}
|
${!var}
|
||||||
|
|
||||||
|
|
@ -875,13 +931,13 @@ parameter:
|
||||||
|
|
||||||
The expansion of the quoted portions of this expression will be
|
The expansion of the quoted portions of this expression will be
|
||||||
deferred until `eval' runs, while the `$#' will be expanded
|
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 ${!#}
|
echo ${!#}
|
||||||
|
|
||||||
does the same thing.
|
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?
|
the output show up in $variable when the read command finishes?
|
||||||
|
|
||||||
This has to do with the parent-child relationship between Unix
|
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
|
This is the general approach -- in most cases you will not need to
|
||||||
set $IFS to a different value.
|
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
|
in arguments to `echo'. Bash doesn't interpret these characters. Why
|
||||||
not, and how can I make it understand them?
|
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
|
on. Be aware that this will cause some of the tests run when you
|
||||||
type `make tests' to fail.
|
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
|
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
|
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
|
within parentheses, which will force the loop into a subshell that
|
||||||
may be stopped (and subsequently restarted) as a single unit.
|
may be stopped (and subsequently restarted) as a single unit.
|
||||||
|
|
||||||
31) How can I make the bash `time' reserved word print timing output that
|
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?
|
looks like the output from my system's /usr/bin/time?
|
||||||
|
|
||||||
The bash command timing code looks for a variable `TIMEFORMAT' and
|
The bash command timing code looks for a variable `TIMEFORMAT' and
|
||||||
uses its value as a format string to decide how to display the
|
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
|
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
|
The problem is `cmdtool' and bash fighting over the input. When
|
||||||
scrolling is enabled in a cmdtool window, cmdtool puts the tty in
|
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
|
cmdtool. If this works, you can put the assignment to TERMCAP
|
||||||
in your bashrc file.
|
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?
|
completion chop off the first few characters of each filename?
|
||||||
|
|
||||||
This is the consequence of building bash on SunOS 5 and linking
|
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
|
put /usr/ccs/bin and /opt/SUNWspro/bin into your $PATH before
|
||||||
/usr/ucb.
|
/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?
|
`~user' tilde expansion on a machine running NIS?
|
||||||
|
|
||||||
This is a famous and long-standing bug in the SunOS YP (sorry, 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
|
run configure with the `--without-gnu-malloc' option to use
|
||||||
the C library malloc and avoid the problem.
|
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
|
The `@' character is the default `line kill' character in most
|
||||||
versions of System V, including SVR4.2. You can change this
|
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.
|
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?
|
redirection before a subshell command?
|
||||||
|
|
||||||
The actual command in question is something like
|
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
|
commands'. A subshell construct such as the above is one of the shell's
|
||||||
`compound commands'. A redirection may only follow a compound command.
|
`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
|
(unofficial) patch to parse.y that will modify the grammar to
|
||||||
support this construct. It will not apply with `patch'; you must
|
support this construct. It will not apply with `patch'; you must
|
||||||
modify parse.y by hand. Note that if you apply this, 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?
|
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?
|
advice?
|
||||||
|
|
||||||
Use the `bashbug' script to report bugs. It is built and
|
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
|
template for reporting a problem and automatically includes
|
||||||
information about your configuration and build environment.
|
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.
|
is a large mailing list gatewayed to the usenet newsgroup gnu.bash.bug.
|
||||||
|
|
||||||
Bug fixes, answers to questions, and announcements of new releases
|
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.
|
and problems also take place there.
|
||||||
|
|
||||||
To reach the bash maintainers directly, send mail to
|
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
|
First, look in the doc directory in the bash distribution. It should
|
||||||
contain at least the following files:
|
contain at least the following files:
|
||||||
|
|
||||||
bash.1 an extensive, thorough Unix-style manual page
|
bash.1 an extensive, thorough Unix-style manual page
|
||||||
builtins.1 a manual page covering just bash builtin commands
|
builtins.1 a manual page covering just bash builtin commands
|
||||||
bashref.texi a reference manual in GNU info format
|
bashref.texi a reference manual in GNU tex`info format
|
||||||
bash.html an HTML version of the manual page
|
bashref.info an info version of the reference manual
|
||||||
bashref.html an HTML version of the reference manual
|
|
||||||
FAQ this file
|
FAQ this file
|
||||||
article.ms text of an article written for The Linux Journal
|
article.ms text of an article written for The Linux Journal
|
||||||
readline.3 a man page describing readline
|
readline.3 a man page describing readline
|
||||||
|
|
||||||
Postscript files created from the above source are available in
|
Postscript, HTML, and ASCII files created from the above source are
|
||||||
the documentation distribution.
|
available in the documentation distribution.
|
||||||
|
|
||||||
There is additional documentation available for anonymous FTP from host
|
There is additional documentation available for anonymous FTP from host
|
||||||
ftp.cwru.edu in the `pub/bash' directory.
|
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
|
The ISBN number is 1-56592-347-2. Look for it in the same fine bookstores
|
||||||
or on the web.
|
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.
|
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)
|
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.
|
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
|
the ksh-93 ${!prefix*} and ${!prefix@} operators
|
||||||
arithmetic ++ and -- prefix and postfix operators
|
arithmetic ++ and -- prefix and postfix operators
|
||||||
date-stamped command history
|
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.
|
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
|
Permission is hereby granted, without written agreement and
|
||||||
without license or royalty fees, to use, copy, and distribute
|
without license or royalty fees, to use, copy, and distribute
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,7 @@ have access to all of the shell facilities.
|
||||||
|
|
||||||
Help
|
Help
|
||||||
|
|
||||||
Bash includes a built-in help factility.
|
Bash includes a built-in help facility.
|
||||||
|
|
||||||
Shell Optional Behavior
|
Shell Optional Behavior
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
# This Makefile is for the Bash/documentation directory -*- text -*-.
|
# This Makefile is for the Bash/documentation directory -*- text -*-.
|
||||||
#
|
#
|
||||||
|
SHELL = @MAKE_SHELL@
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
|
|
||||||
topdir = @top_srcdir@
|
topdir = @top_srcdir@
|
||||||
|
|
@ -84,11 +85,17 @@ RLUSER = $(RL_LIBDIR)/doc/rluser.texinfo
|
||||||
all: ps info dvi text html
|
all: ps info dvi text html
|
||||||
nodvi: ps info text html
|
nodvi: ps info text html
|
||||||
|
|
||||||
ps: bash.ps bashbug.ps readline.ps article.ps builtins.ps
|
PSFILES = bash.ps bashbug.ps readline.ps article.ps builtins.ps
|
||||||
dvi: bashref.dvi bashref.ps
|
DVIFILES = bashref.dvi bashref.ps
|
||||||
info: bashref.info
|
INFOFILES = bashref.info
|
||||||
text: bash.0 bashbug.0 builtins.0 readline.0
|
MAN0FILES = bash.0 bashbug.0 builtins.0 readline.0
|
||||||
html: bashref.html bash.html
|
HTMLFILES = bashref.html bash.html
|
||||||
|
|
||||||
|
ps: ${PSFILES}
|
||||||
|
dvi: ${DVIFILES}
|
||||||
|
info: ${INFOFILES}
|
||||||
|
text: ${MAN0FILES}
|
||||||
|
html: ${HTMLFILES}
|
||||||
|
|
||||||
bashref.dvi: $(srcdir)/bashref.texi $(HSUSER) $(RLUSER)
|
bashref.dvi: $(srcdir)/bashref.texi $(HSUSER) $(RLUSER)
|
||||||
TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/bashref.texi
|
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
|
$(MAKEINFO) --no-split -I$(TEXINPUTDIR) $(srcdir)/bashref.texi
|
||||||
|
|
||||||
bashref.html: bashref.texi $(HSUSER) $(RLUSER)
|
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)
|
bash.dvi: bash.texinfo $(HSUSER) $(RLUSER)
|
||||||
TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) bash.texinfo
|
TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) bash.texinfo
|
||||||
|
|
@ -125,7 +132,9 @@ article.ps: article.ms
|
||||||
$(MAN2HTML): ${topdir}/support/man2html.c
|
$(MAN2HTML): ${topdir}/support/man2html.c
|
||||||
-( cd ${BUILD_DIR}/support ; ${MAKE} ${MFLAGS} man2html)
|
-( 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
|
faq.version: FAQ.version FAQ
|
||||||
sh mkfaqvers FAQ.version > $@
|
sh mkfaqvers FAQ.version > $@
|
||||||
|
|
@ -143,15 +152,16 @@ faq.mail: FAQ FAQ.headers.mail faq.version
|
||||||
cat FAQ.headers.mail faq.version FAQ > $@
|
cat FAQ.headers.mail faq.version FAQ > $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps \
|
$(RM) *.aux *.bak *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps \
|
||||||
*.pgs *.bt *.bts *.rw *.rws *.fns *.kys *.tps *.vrs *.o \
|
*.pgs *.bt *.bts *.rw *.rws *.fns *.kys *.tps *.vrs *.o
|
||||||
core rluser.texinfo hsuser.texinfo
|
${RM} core *.core
|
||||||
|
|
||||||
distclean mostlyclean: clean
|
distclean mostlyclean: clean
|
||||||
$(RM) Makefile
|
$(RM) Makefile
|
||||||
|
|
||||||
maintainer-clean: clean
|
maintainer-clean: clean
|
||||||
$(RM) *.0 *.ps *.dvi *.info *.txt
|
${RM} ${PSFILES} ${DVIFILES} ${INFOFILES} ${MAN0FILES} ${HTMLFILES}
|
||||||
|
${RM} ${CREATED_FAQ}
|
||||||
$(RM) Makefile
|
$(RM) Makefile
|
||||||
|
|
||||||
installdirs:
|
installdirs:
|
||||||
|
|
@ -166,7 +176,7 @@ install: info installdirs
|
||||||
# uncomment the next line to install the readline man page
|
# uncomment the next line to install the readline man page
|
||||||
# -$(INSTALL_DATA) $(srcdir)/readline.3 $(man3dir)/readline.${man3ext}
|
# -$(INSTALL_DATA) $(srcdir)/readline.3 $(man3dir)/readline.${man3ext}
|
||||||
# uncomment the next line to install the builtins man page
|
# 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
|
-$(INSTALL_DATA) $(srcdir)/bashref.info $(infodir)/bash.info
|
||||||
# run install-info if it is present to update the info directory
|
# run install-info if it is present to update the info directory
|
||||||
if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
|
if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,12 @@
|
||||||
This directory contains the bash documentation.
|
This directory contains the bash documentation.
|
||||||
|
|
||||||
FAQ - a set of frequently-asked questions about Bash with answers
|
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
|
article.ms - an article I wrote about bash for The Linux Journal
|
||||||
bash.1 - the bash man page
|
bash.1 - the bash man page
|
||||||
builtins.1 - a man page that documents the builtins, extracted from bash.1
|
builtins.1 - a man page that documents the builtins, extracted from bash.1
|
||||||
features.texi - the `bash reference manual'
|
bashref.texi - the `bash reference manual'
|
||||||
features.info - the `bash reference manual' processed by `makeinfo'
|
bashref.info - the `bash reference manual' processed by `makeinfo'
|
||||||
readline.3 - the readline man page
|
readline.3 - the readline man page
|
||||||
|
|
||||||
The `.ps' files are postscript versions of the above. The `.html'
|
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
|
.\" Case Western Reserve University
|
||||||
.\" chet@ins.CWRU.Edu
|
.\" 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
|
.\" bash_builtins, strip all but Built-Ins section
|
||||||
.if \n(zZ=1 .ig zZ
|
.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 `@'
|
.\" There's some problem with having a `@'
|
||||||
.\" in a tagged paragraph with the BSD man macros.
|
.\" in a tagged paragraph with the BSD man macros.
|
||||||
|
|
@ -50,8 +50,8 @@ bash \- GNU Bourne-Again SHell
|
||||||
[options]
|
[options]
|
||||||
[file]
|
[file]
|
||||||
.SH COPYRIGHT
|
.SH COPYRIGHT
|
||||||
.if n Bash is Copyright (C) 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, 1991, 1993, 1995, 1996 by the Free Software Foundation, Inc.
|
.if t Bash is Copyright \(co 1989-1999 by the Free Software Foundation, Inc.
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B Bash
|
.B Bash
|
||||||
is an \fBsh\fR-compatible command language interpreter that
|
is an \fBsh\fR-compatible command language interpreter that
|
||||||
|
|
@ -260,7 +260,8 @@ section.
|
||||||
.PP
|
.PP
|
||||||
When
|
When
|
||||||
.B bash
|
.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
|
executes commands from the file \fI/etc/profile\fP, if that
|
||||||
file exists.
|
file exists.
|
||||||
After reading that file, it looks for \fI~/.bash_profile\fP,
|
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
|
.B sh
|
||||||
as closely as possible,
|
as closely as possible,
|
||||||
while conforming to the POSIX standard as well.
|
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
|
read and execute commands from
|
||||||
.I /etc/profile
|
.I /etc/profile
|
||||||
and
|
and
|
||||||
|
|
@ -338,7 +340,7 @@ files, the
|
||||||
option has no effect.
|
option has no effect.
|
||||||
A non-interactive shell invoked with the name
|
A non-interactive shell invoked with the name
|
||||||
.B sh
|
.B sh
|
||||||
does not attempt to read any startup files.
|
does not attempt to read any other startup files.
|
||||||
When invoked as
|
When invoked as
|
||||||
.BR sh ,
|
.BR sh ,
|
||||||
.B bash
|
.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
|
option may be used to force another file to be read, but
|
||||||
\fIrshd\fP does not generally invoke the shell with those options
|
\fIrshd\fP does not generally invoke the shell with those options
|
||||||
or allow them to be specified.
|
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
|
.SH DEFINITIONS
|
||||||
.PP
|
.PP
|
||||||
The following definitions are used throughout the rest of this
|
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
|
\fIexpression1\fP is sufficient to determine the return value of
|
||||||
the entire conditional expression.
|
the entire conditional expression.
|
||||||
.TP
|
.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
|
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
|
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
|
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
|
If the expansion of the items following \fBin\fP results in an empty
|
||||||
list, no commands are executed, and the return status is 0.
|
list, no commands are executed, and the return status is 0.
|
||||||
.TP
|
.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
|
The list of words following \fBin\fP is expanded, generating a list
|
||||||
of items. The set of expanded words is printed on the standard
|
of items. The set of expanded words is printed on the standard
|
||||||
error, each preceded by a number. If the \fBin\fP
|
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
|
The second form causes all matches of \fIpattern\fP to be
|
||||||
replaced with \fIstring\fP.
|
replaced with \fIstring\fP.
|
||||||
If \fIpattern\fP begins with \fB#\fP, it must match at the beginning
|
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
|
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
|
If \fIstring\fP is null, matches of \fIpattern\fP are deleted
|
||||||
and the \fB/\fP following \fIpattern\fP may be omitted.
|
and the \fB/\fP following \fIpattern\fP may be omitted.
|
||||||
If
|
If
|
||||||
|
|
@ -2985,6 +2995,9 @@ True if \fIfile\fP exists and is a regular file.
|
||||||
.B \-g \fIfile\fP
|
.B \-g \fIfile\fP
|
||||||
True if \fIfile\fP exists and is set-group-id.
|
True if \fIfile\fP exists and is set-group-id.
|
||||||
.TP
|
.TP
|
||||||
|
.B \-h \fIfile\fP
|
||||||
|
True if \fIfile\fP exists and is a symbolic link.
|
||||||
|
.TP
|
||||||
.B \-k \fIfile\fP
|
.B \-k \fIfile\fP
|
||||||
True if \fIfile\fP exists and its ``sticky'' bit is set.
|
True if \fIfile\fP exists and its ``sticky'' bit is set.
|
||||||
.TP
|
.TP
|
||||||
|
|
@ -4032,6 +4045,12 @@ regardless of what the terminal claims it can support. The name
|
||||||
.B meta\-flag
|
.B meta\-flag
|
||||||
is a synonym for this variable.
|
is a synonym for this variable.
|
||||||
.TP
|
.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)
|
.B keymap (emacs)
|
||||||
Set the current readline keymap. The set of valid keymap names is
|
Set the current readline keymap. The set of valid keymap names is
|
||||||
\fIemacs, emacs\-standard, emacs\-meta, emacs\-ctlx, vi,
|
\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.
|
the next entry from the history matching the string typed so far.
|
||||||
An incremental search requires only as many characters as needed to
|
An incremental search requires only as many characters as needed to
|
||||||
find the desired history entry.
|
find the desired history entry.
|
||||||
The Escape character is used to terminate an incremental search.
|
The characters present in the value of the \fIisearch-terminators\fP
|
||||||
Control-J will also terminate the search.
|
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
|
Control-G will abort an incremental search and restore the original
|
||||||
line.
|
line.
|
||||||
When the search is terminated, the history entry containing the
|
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,
|
Delete the character behind the cursor. When given a numeric argument,
|
||||||
save the deleted text on the kill ring.
|
save the deleted text on the kill ring.
|
||||||
.TP
|
.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)
|
.B quoted\-insert (C\-q, C\-v)
|
||||||
Add the next character typed to the line verbatim. This is
|
Add the next character typed to the line verbatim. This is
|
||||||
how to insert characters like \fBC\-q\fP, for example.
|
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
|
This command is intended to be bound to \fBTAB\fP, but is unbound
|
||||||
by default.
|
by default.
|
||||||
.TP
|
.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\-/)
|
.B complete\-filename (M\-/)
|
||||||
Attempt filename completion on the text before point.
|
Attempt filename completion on the text before point.
|
||||||
.TP
|
.TP
|
||||||
|
|
@ -4588,7 +4621,7 @@ Undo all changes made to this line. This is like executing the
|
||||||
.B undo
|
.B undo
|
||||||
command enough times to return the line to its initial state.
|
command enough times to return the line to its initial state.
|
||||||
.TP
|
.TP
|
||||||
.B tilde\-expand (M\-~)
|
.B tilde\-expand (M\-&)
|
||||||
Perform tilde expansion on the current word.
|
Perform tilde expansion on the current word.
|
||||||
.TP
|
.TP
|
||||||
.B set\-mark (C\-@, M\-<space>)
|
.B set\-mark (C\-@, M\-<space>)
|
||||||
|
|
@ -6210,13 +6243,17 @@ The characters in
|
||||||
.SM
|
.SM
|
||||||
.B IFS
|
.B IFS
|
||||||
are used to split the line into words.
|
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:
|
Options, if supplied, have the following meanings:
|
||||||
.RS
|
.RS
|
||||||
.PD 0
|
.PD 0
|
||||||
.TP
|
.TP
|
||||||
.B \-r
|
.B \-r
|
||||||
A backslash-newline pair is not ignored, and
|
Backslash does not act as an escape character.
|
||||||
the backslash is considered to be part of the line.
|
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
|
.TP
|
||||||
.B \-p
|
.B \-p
|
||||||
Display \fIprompt\fP, without a
|
Display \fIprompt\fP, without a
|
||||||
|
|
@ -6487,11 +6524,16 @@ Turn on
|
||||||
.I privileged
|
.I privileged
|
||||||
mode. In this mode, the
|
mode. In this mode, the
|
||||||
.B $ENV
|
.B $ENV
|
||||||
file is not processed, shell functions are not inherited from the
|
and
|
||||||
environment, and the variable
|
.B $BASH_ENV
|
||||||
The \fBSHELLOPTS\fP variable, if it appears in the environment, is ignored.
|
files are not processed, shell functions are not inherited from the
|
||||||
This is enabled automatically on startup if the effective user (group)
|
environment, and the \fBSHELLOPTS\fP variable, if it appears in the
|
||||||
id is not equal to the real user (group) id.
|
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
|
Turning this option off causes the effective user
|
||||||
and group ids to be set to the real user and group ids.
|
and group ids to be set to the real user and group ids.
|
||||||
.TP 8
|
.TP 8
|
||||||
|
|
@ -6794,6 +6836,15 @@ being expanded as described in
|
||||||
.B PROMPTING
|
.B PROMPTING
|
||||||
above. This option is enabled by default.
|
above. This option is enabled by default.
|
||||||
.TP 8
|
.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
|
.B shift_verbose
|
||||||
If set, the
|
If set, the
|
||||||
.B shift
|
.B shift
|
||||||
|
|
@ -7232,9 +7283,11 @@ with the exception that the following are disallowed or not performed:
|
||||||
changing directories with \fBcd\fP
|
changing directories with \fBcd\fP
|
||||||
.IP \(bu
|
.IP \(bu
|
||||||
setting or unsetting the values of
|
setting or unsetting the values of
|
||||||
.B SHELL
|
.BR SHELL ,
|
||||||
|
.BR PATH ,
|
||||||
|
.BR ENV ,
|
||||||
or
|
or
|
||||||
.B PATH
|
.B BASH_ENV
|
||||||
.IP \(bu
|
.IP \(bu
|
||||||
specifying command names containing
|
specifying command names containing
|
||||||
.B /
|
.B /
|
||||||
|
|
@ -7313,6 +7366,9 @@ The personal initialization file, executed for login shells
|
||||||
.FN ~/.bashrc
|
.FN ~/.bashrc
|
||||||
The individual per-interactive-shell startup file
|
The individual per-interactive-shell startup file
|
||||||
.TP
|
.TP
|
||||||
|
.FN ~/.bash_logout
|
||||||
|
The individual login shell cleanup file, executed when a login shell exits
|
||||||
|
.TP
|
||||||
.FN ~/.inputrc
|
.FN ~/.inputrc
|
||||||
Individual \fIreadline\fP initialization file
|
Individual \fIreadline\fP initialization file
|
||||||
.PD
|
.PD
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
.TH BASHBUG 1 "1995 August 10" GNU
|
.TH BASHBUG 1 "1998 July 30" GNU
|
||||||
.SH NAME
|
.SH NAME
|
||||||
bashbug \- report a bug in bash
|
bashbug \- report a bug in bash
|
||||||
.SH SYNOPSIS
|
.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
|
on a temporary copy of the bug report format outline. The user must
|
||||||
fill in the appropriate fields and exit the editor.
|
fill in the appropriate fields and exit the editor.
|
||||||
.B bashbug
|
.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
|
\fIaddress\fP. If the report cannot be mailed, it is saved in the
|
||||||
file \fIdead.bashbug\fP in the invoking user's home directory.
|
file \fIdead.bashbug\fP in the invoking user's home directory.
|
||||||
.PP
|
.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
|
This text is a brief description of the features that are present in
|
||||||
the Bash shell.
|
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',
|
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
|
Permission is granted to make and distribute verbatim copies of
|
||||||
this manual provided the copyright notice and this permission notice
|
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
|
This text is a brief description of the features that are present in
|
||||||
the Bash shell.
|
the Bash shell.
|
||||||
|
|
||||||
This is Edition 2.2, last updated 1 April 1998, of `The GNU Bash
|
This is Edition 2.3, last updated 20 January 1999, of `The GNU Bash
|
||||||
Reference Manual', for `Bash', Version 2.02.
|
Reference Manual', for `Bash', Version 2.03.
|
||||||
|
|
||||||
Copyright (C) 1991, 1993, 1996 Free Software Foundation, Inc.
|
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,
|
against its value is replaced with STRING. In the first form,
|
||||||
only the first match is replaced. The second form causes all
|
only the first match is replaced. The second form causes all
|
||||||
matches of PATTERN to be replaced with STRING. If PATTERN begins
|
matches of PATTERN to be replaced with STRING. If PATTERN begins
|
||||||
with `#', it must match at the beginning of STRING. If PATTERN
|
with `#', it must match at the beginning of the expanded value of
|
||||||
begins with `%', it must match at the end of STRING. If STRING is
|
PARAMETER. If PATTERN begins with `%', it must match at the end
|
||||||
null, matches of PATTERN are deleted and the `/' following PATTERN
|
of the expanded value of PARAMETER. If STRING is null, matches of
|
||||||
may be omitted. If PARAMETER is `@' or `*', the substitution
|
PATTERN are deleted and the `/' following PATTERN may be omitted.
|
||||||
operation is applied to each positional parameter in turn, and the
|
If PARAMETER is `@' or `*', the substitution operation is applied
|
||||||
expansion is the resultant list. If PARAMETER is an array
|
to each positional parameter in turn, and the expansion is the
|
||||||
variable subscripted with `@' or `*', the substitution operation
|
resultant list. If PARAMETER is an array variable subscripted
|
||||||
is applied to each member of the array in turn, and the expansion
|
with `@' or `*', the substitution operation is applied to each
|
||||||
is the resultant list.
|
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
|
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.
|
The return status is zero.
|
||||||
|
|
||||||
`.'
|
`.'
|
||||||
. FILENAME
|
. FILENAME [ARGUMENTS]
|
||||||
Read and execute commands from the FILENAME argument in the
|
Read and execute commands from the FILENAME argument in the
|
||||||
current shell context. If FILENAME does not contain a slash, the
|
current shell context. If FILENAME does not contain a slash, the
|
||||||
`$PATH' variable is used to find FILENAME. The current directory
|
`$PATH' variable is used to find FILENAME. The current directory
|
||||||
is searched if FILENAME is not found in `$PATH'. The return
|
is searched if FILENAME is not found in `$PATH'. If any ARGUMENTS
|
||||||
status is the exit status of the last command executed, or zero if
|
are supplied, they become the positional parameters when FILENAME
|
||||||
no commands are executed. If FILENAME is not found, or cannot be
|
is executed. Otherwise the positional parameters are unchanged.
|
||||||
read, the return status is non-zero.
|
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'
|
||||||
break [N]
|
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
|
are expanded in file names as described above under Tilde Expansion
|
||||||
(*note Tilde Expansion::.).
|
(*note Tilde Expansion::.).
|
||||||
|
|
||||||
When Bash is invoked as an interactive login shell, it first reads
|
When Bash is invoked as an interactive login shell, or as a
|
||||||
and executes commands from the file `/etc/profile', if that file exists.
|
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',
|
After reading that file, it looks for `~/.bash_profile',
|
||||||
`~/.bash_login', and `~/.profile', in that order, and reads and
|
`~/.bash_login', and `~/.profile', in that order, and reads and
|
||||||
executes commands from the first one that exists and is readable. The
|
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
|
behavior of historical versions of `sh' as closely as possible, while
|
||||||
conforming to the POSIX standard as well.
|
conforming to the 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
|
||||||
and execute commands from `/etc/profile' and `~/.profile', in that
|
shell with the `--login' option, it first attempts to read and execute
|
||||||
order. The `--noprofile' option may be used to inhibit this behavior.
|
commands from `/etc/profile' and `~/.profile', in that order. The
|
||||||
When invoked as an interactive shell with the name `sh', Bash looks for
|
`--noprofile' option may be used to inhibit this behavior. When
|
||||||
the variable `ENV', expands its value if it is defined, and uses the
|
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
|
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
|
shell invoked as `sh' does not attempt to read and execute commands
|
||||||
from any other startup files, the `--rcfile' option has no effect. A
|
from any other startup files, the `--rcfile' option has no effect. A
|
||||||
non-interactive shell invoked with the name `sh' does not attempt to
|
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
|
When invoked as `sh', Bash enters POSIX mode after the startup files
|
||||||
are read.
|
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
|
generally invoke the shell with those options or allow them to be
|
||||||
specified.
|
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
|
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
|
assigned to the last NAME. If there are fewer words read from the
|
||||||
standard input than names, the remaining names are assigned empty
|
standard input than names, the remaining names are assigned empty
|
||||||
values. The characters in the value of the `IFS' variable are
|
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
|
line read is assigned to the variable `REPLY'. The return code is
|
||||||
zero, unless end-of-file is encountered. Options, if supplied,
|
zero, unless end-of-file is encountered. Options, if supplied,
|
||||||
have the following meanings:
|
have the following meanings:
|
||||||
|
|
||||||
`-r'
|
`-r'
|
||||||
If this option is given, a backslash-newline pair is not
|
If this option is given, backslash does not act as an escape
|
||||||
ignored, and the backslash is considered to be part of the
|
character. The backslash is considered to be part of the
|
||||||
line.
|
line. In particular, a backslash-newline pair may not be
|
||||||
|
used as a line continuation.
|
||||||
|
|
||||||
`-p PROMPT'
|
`-p PROMPT'
|
||||||
Display PROMPT, without a trailing newline, before attempting
|
Display PROMPT, without a trailing newline, before attempting
|
||||||
|
|
@ -3287,6 +3303,13 @@ been extended in Bash.
|
||||||
expansion after being expanded (*note Printing a Prompt::.).
|
expansion after being expanded (*note Printing a Prompt::.).
|
||||||
This option is enabled by default.
|
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'
|
`shift_verbose'
|
||||||
If this is set, the `shift' builtin prints an error message
|
If this is set, the `shift' builtin prints an error message
|
||||||
when the shift count exceeds the number of positional
|
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
|
Turn on privileged mode. In this mode, the `$BASH_ENV' and
|
||||||
`$ENV' files are not processed, shell functions are not
|
`$ENV' files are not processed, shell functions are not
|
||||||
inherited from the environment, and the `SHELLOPTS' variable,
|
inherited from the environment, and the `SHELLOPTS' variable,
|
||||||
if it appears in the environment, is ignored. This is
|
if it appears in the environment, is ignored. If the shell
|
||||||
enabled automatically on startup if the effective user
|
is started with the effective user (group) id not equal to the
|
||||||
(group) id is not equal to the real user (group) id. Turning
|
real user (group) id, and the `-p' option is not supplied,
|
||||||
this option off causes the effective user and group ids to be
|
these actions are taken and the effective user id is set to
|
||||||
set to the real user and group ids.
|
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'
|
`-t'
|
||||||
Exit after reading and executing one command.
|
Exit after reading and executing one command.
|
||||||
|
|
@ -3640,6 +3666,9 @@ checked.
|
||||||
`-g FILE'
|
`-g FILE'
|
||||||
True if FILE exists and its set-group-id bit is set.
|
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'
|
`-k FILE'
|
||||||
True if FILE exists and its "sticky" bit is set.
|
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:
|
with the exception that the following are disallowed:
|
||||||
* Changing directories with the `cd' builtin.
|
* 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.
|
* 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,
|
search string. As each character of the search string is typed,
|
||||||
Readline displays the next entry from the history matching the string
|
Readline displays the next entry from the history matching the string
|
||||||
typed so far. An incremental search requires only as many characters
|
typed so far. An incremental search requires only as many characters
|
||||||
as needed to find the desired history entry. The <ESC> character is
|
as needed to find the desired history entry. The characters present in
|
||||||
used to terminate an incremental search. <C-j> will also terminate the
|
the value of the ISEARCH-TERMINATORS variable are used to terminate an
|
||||||
search. <C-g> will abort an incremental search and restore the
|
incremental search. If that variable has not been assigned a value,
|
||||||
original line. When the search is terminated, the history entry
|
the <ESC> and <C-J> characters will terminate an incremental search.
|
||||||
containing the search string becomes the current line. To find other
|
<C-g> will abort an incremental search and restore the original line.
|
||||||
matching entries in the history list, type <C-s> or <C-r> as
|
When the search is terminated, the history entry containing the search
|
||||||
appropriate. This will search backward or forward in the history for
|
string becomes the current line. To find other matching entries in the
|
||||||
the next entry matching the search string typed so far. Any other key
|
history list, type <C-s> or <C-r> as appropriate. This will search
|
||||||
sequence bound to a Readline command will terminate the search and
|
backward or forward in the history for the next entry matching the
|
||||||
execute that command. For instance, a <RET> will terminate the search
|
search string typed so far. Any other key sequence bound to a Readline
|
||||||
and accept the line, thereby executing the command from the history
|
command will terminate the search and execute that command. For
|
||||||
list.
|
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
|
Non-incremental searches read the entire search string before
|
||||||
starting to search for matching history lines. The search string may be
|
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
|
longer than the width of the screen, instead of wrapping onto
|
||||||
a new screen line. By default, this variable is set to `off'.
|
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'
|
`keymap'
|
||||||
Sets Readline's idea of the current keymap for key binding
|
Sets Readline's idea of the current keymap for key binding
|
||||||
commands. Acceptable `keymap' names are `emacs',
|
commands. Acceptable `keymap' names are `emacs',
|
||||||
|
|
@ -5489,13 +5534,6 @@ Variable Settings
|
||||||
asterisk (`*') at the start of history lines which have been
|
asterisk (`*') at the start of history lines which have been
|
||||||
modified. This variable is `off' by default.
|
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'
|
`output-meta'
|
||||||
If set to `on', Readline will display characters with the
|
If set to `on', Readline will display characters with the
|
||||||
eighth bit set directly rather than as a meta-prefixed escape
|
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
|
Delete the character behind the cursor. A numeric argument means
|
||||||
to kill the characters instead of deleting them.
|
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)'
|
`quoted-insert (C-q, C-v)'
|
||||||
Add the next character typed to the line verbatim. This is how to
|
Add the next character typed to the line verbatim. This is how to
|
||||||
insert key sequences like <C-q>, for example.
|
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
|
This command is intended to be bound to `TAB', but is unbound by
|
||||||
default.
|
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-/)'
|
`complete-filename (M-/)'
|
||||||
Attempt filename completion on the text before point.
|
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 all changes made to this line. This is like executing the
|
||||||
`undo' command enough times to get back to the beginning.
|
`undo' command enough times to get back to the beginning.
|
||||||
|
|
||||||
`tilde-expand (M-~)'
|
`tilde-expand (M-&)'
|
||||||
Perform tilde expansion on the current word.
|
Perform tilde expansion on the current word.
|
||||||
|
|
||||||
`set-mark (C-@)'
|
`set-mark (C-@)'
|
||||||
|
|
@ -6562,6 +6611,11 @@ that the Bash `configure' recognizes.
|
||||||
for which this should be turned off, and `configure' disables this
|
for which this should be turned off, and `configure' disables this
|
||||||
option automatically for a number of systems.
|
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'
|
`--with-purify'
|
||||||
Define this to use the Purify memory allocation checker from Pure
|
Define this to use the Purify memory allocation checker from Pure
|
||||||
Software.
|
Software.
|
||||||
|
|
@ -6857,6 +6911,7 @@ Parameter and Variable Index
|
||||||
* IGNOREEOF: Bash Variables.
|
* IGNOREEOF: Bash Variables.
|
||||||
* input-meta: Readline Init File Syntax.
|
* input-meta: Readline Init File Syntax.
|
||||||
* INPUTRC: Bash Variables.
|
* INPUTRC: Bash Variables.
|
||||||
|
* isearch-terminators: Readline Init File Syntax.
|
||||||
* keymap: Readline Init File Syntax.
|
* keymap: Readline Init File Syntax.
|
||||||
* LANG: Bash Variables.
|
* LANG: Bash Variables.
|
||||||
* LC_ALL: Bash Variables.
|
* LC_ALL: Bash Variables.
|
||||||
|
|
@ -6923,6 +6978,7 @@ Function Index
|
||||||
* copy-forward-word (): Commands For Killing.
|
* copy-forward-word (): Commands For Killing.
|
||||||
* copy-region-as-kill (): Commands For Killing.
|
* copy-region-as-kill (): Commands For Killing.
|
||||||
* delete-char (C-d): Commands For Text.
|
* delete-char (C-d): Commands For Text.
|
||||||
|
* delete-char-or-list (): Commands For Completion.
|
||||||
* delete-horizontal-space (): Commands For Killing.
|
* delete-horizontal-space (): Commands For Killing.
|
||||||
* digit-argument (M-0, M-1, ... M--): Numeric Arguments.
|
* digit-argument (M-0, M-1, ... M--): Numeric Arguments.
|
||||||
* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands.
|
* 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-history (M->): Commands For History.
|
||||||
* end-of-line (C-e): Commands For Moving.
|
* end-of-line (C-e): Commands For Moving.
|
||||||
* exchange-point-and-mark (C-x C-x): Miscellaneous Commands.
|
* 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-char (C-f): Commands For Moving.
|
||||||
* forward-search-history (C-s): Commands For History.
|
* forward-search-history (C-s): Commands For History.
|
||||||
* forward-word (M-f): Commands For Moving.
|
* forward-word (M-f): Commands For Moving.
|
||||||
|
|
@ -6960,7 +7017,6 @@ Function Index
|
||||||
* self-insert (a, b, A, 1, !, ...): Commands For Text.
|
* self-insert (a, b, A, 1, !, ...): Commands For Text.
|
||||||
* set-mark (C-@): Miscellaneous Commands.
|
* set-mark (C-@): Miscellaneous Commands.
|
||||||
* start-kbd-macro (C-x (): Keyboard Macros.
|
* start-kbd-macro (C-x (): Keyboard Macros.
|
||||||
* tilde-expand (M-~): Miscellaneous Commands.
|
|
||||||
* transpose-chars (C-t): Commands For Text.
|
* transpose-chars (C-t): Commands For Text.
|
||||||
* transpose-words (M-t): Commands For Text.
|
* transpose-words (M-t): Commands For Text.
|
||||||
* undo (C-_, C-x C-u): Miscellaneous Commands.
|
* undo (C-_, C-x C-u): Miscellaneous Commands.
|
||||||
|
|
@ -7092,120 +7148,120 @@ Concept Index
|
||||||
|
|
||||||
|
|
||||||
Tag Table:
|
Tag Table:
|
||||||
Node: Top1197
|
Node: Top1187
|
||||||
Node: Introduction3153
|
Node: Introduction3146
|
||||||
Node: What is Bash?3378
|
Node: What is Bash?3371
|
||||||
Node: What is a shell?4472
|
Node: What is a shell?4465
|
||||||
Node: Definitions6494
|
Node: Definitions6487
|
||||||
Node: Basic Shell Features9155
|
Node: Basic Shell Features9148
|
||||||
Node: Shell Syntax10378
|
Node: Shell Syntax10371
|
||||||
Node: Shell Operation10667
|
Node: Shell Operation10660
|
||||||
Node: Quoting11961
|
Node: Quoting11954
|
||||||
Node: Escape Character12986
|
Node: Escape Character12979
|
||||||
Node: Single Quotes13458
|
Node: Single Quotes13451
|
||||||
Node: Double Quotes13787
|
Node: Double Quotes13780
|
||||||
Node: ANSI-C Quoting14685
|
Node: ANSI-C Quoting14678
|
||||||
Node: Locale Translation15554
|
Node: Locale Translation15547
|
||||||
Node: Comments15975
|
Node: Comments15968
|
||||||
Node: Shell Commands16589
|
Node: Shell Commands16582
|
||||||
Node: Simple Commands17100
|
Node: Simple Commands17093
|
||||||
Node: Pipelines17659
|
Node: Pipelines17652
|
||||||
Node: Lists19186
|
Node: Lists19179
|
||||||
Node: Looping Constructs20641
|
Node: Looping Constructs20634
|
||||||
Node: Conditional Constructs22246
|
Node: Conditional Constructs22239
|
||||||
Node: Command Grouping28184
|
Node: Command Grouping28177
|
||||||
Node: Shell Functions29561
|
Node: Shell Functions29554
|
||||||
Node: Shell Parameters31525
|
Node: Shell Parameters31518
|
||||||
Node: Positional Parameters32851
|
Node: Positional Parameters32844
|
||||||
Node: Special Parameters33600
|
Node: Special Parameters33593
|
||||||
Node: Shell Expansions36221
|
Node: Shell Expansions36214
|
||||||
Node: Brace Expansion38144
|
Node: Brace Expansion38137
|
||||||
Node: Tilde Expansion39705
|
Node: Tilde Expansion39698
|
||||||
Node: Shell Parameter Expansion42037
|
Node: Shell Parameter Expansion42030
|
||||||
Node: Command Substitution48379
|
Node: Command Substitution48426
|
||||||
Node: Arithmetic Expansion49653
|
Node: Arithmetic Expansion49700
|
||||||
Node: Process Substitution50498
|
Node: Process Substitution50545
|
||||||
Node: Word Splitting51392
|
Node: Word Splitting51439
|
||||||
Node: Filename Expansion52844
|
Node: Filename Expansion52891
|
||||||
Node: Pattern Matching54808
|
Node: Pattern Matching54855
|
||||||
Node: Quote Removal57197
|
Node: Quote Removal57244
|
||||||
Node: Redirections57483
|
Node: Redirections57530
|
||||||
Node: Executing Commands63553
|
Node: Executing Commands63600
|
||||||
Node: Simple Command Expansion64220
|
Node: Simple Command Expansion64267
|
||||||
Node: Command Search and Execution66143
|
Node: Command Search and Execution66190
|
||||||
Node: Command Execution Environment68146
|
Node: Command Execution Environment68193
|
||||||
Node: Environment70600
|
Node: Environment70647
|
||||||
Node: Exit Status72257
|
Node: Exit Status72304
|
||||||
Node: Signals73454
|
Node: Signals73501
|
||||||
Node: Shell Scripts75349
|
Node: Shell Scripts75396
|
||||||
Node: Bourne Shell Features77385
|
Node: Bourne Shell Features77432
|
||||||
Node: Bourne Shell Builtins78115
|
Node: Bourne Shell Builtins78162
|
||||||
Node: Bourne Shell Variables92056
|
Node: Bourne Shell Variables92273
|
||||||
Node: Other Bourne Shell Features93761
|
Node: Other Bourne Shell Features93978
|
||||||
Node: Major Differences From The Bourne Shell94504
|
Node: Major Differences From The Bourne Shell94721
|
||||||
Node: Bash Features106693
|
Node: Bash Features106910
|
||||||
Node: Invoking Bash107796
|
Node: Invoking Bash108013
|
||||||
Node: Bash Startup Files111981
|
Node: Bash Startup Files112198
|
||||||
Node: Is This Shell Interactive?115540
|
Node: Is This Shell Interactive?116342
|
||||||
Node: Bash Builtins116511
|
Node: Bash Builtins117313
|
||||||
Node: The Set Builtin137351
|
Node: The Set Builtin138717
|
||||||
Node: Bash Conditional Expressions143960
|
Node: Bash Conditional Expressions145533
|
||||||
Node: Bash Variables147033
|
Node: Bash Variables148666
|
||||||
Node: Shell Arithmetic159463
|
Node: Shell Arithmetic161096
|
||||||
Node: Aliases161511
|
Node: Aliases163144
|
||||||
Node: Alias Builtins164086
|
Node: Alias Builtins165719
|
||||||
Node: Arrays164702
|
Node: Arrays166335
|
||||||
Node: The Directory Stack167723
|
Node: The Directory Stack169356
|
||||||
Node: Printing a Prompt171073
|
Node: Printing a Prompt172706
|
||||||
Node: The Restricted Shell172736
|
Node: The Restricted Shell174369
|
||||||
Node: Bash POSIX Mode174072
|
Node: Bash POSIX Mode175730
|
||||||
Node: Job Control178233
|
Node: Job Control179891
|
||||||
Node: Job Control Basics178699
|
Node: Job Control Basics180357
|
||||||
Node: Job Control Builtins182898
|
Node: Job Control Builtins184556
|
||||||
Node: Job Control Variables187190
|
Node: Job Control Variables188848
|
||||||
Node: Using History Interactively188340
|
Node: Using History Interactively189998
|
||||||
Node: Bash History Facilities189019
|
Node: Bash History Facilities190677
|
||||||
Node: Bash History Builtins191360
|
Node: Bash History Builtins193018
|
||||||
Node: History Interaction194728
|
Node: History Interaction196386
|
||||||
Node: Event Designators197280
|
Node: Event Designators198938
|
||||||
Node: Word Designators198207
|
Node: Word Designators199865
|
||||||
Node: Modifiers199456
|
Node: Modifiers201114
|
||||||
Node: Command Line Editing200773
|
Node: Command Line Editing202431
|
||||||
Node: Introduction and Notation201433
|
Node: Introduction and Notation203091
|
||||||
Node: Readline Interaction202471
|
Node: Readline Interaction204129
|
||||||
Node: Readline Bare Essentials203663
|
Node: Readline Bare Essentials205321
|
||||||
Node: Readline Movement Commands205203
|
Node: Readline Movement Commands206861
|
||||||
Node: Readline Killing Commands206168
|
Node: Readline Killing Commands207826
|
||||||
Node: Readline Arguments207883
|
Node: Readline Arguments209541
|
||||||
Node: Searching208857
|
Node: Searching210515
|
||||||
Node: Readline Init File210475
|
Node: Readline Init File212263
|
||||||
Node: Readline Init File Syntax211514
|
Node: Readline Init File Syntax213302
|
||||||
Node: Conditional Init Constructs220379
|
Node: Conditional Init Constructs222508
|
||||||
Node: Sample Init File222817
|
Node: Sample Init File224946
|
||||||
Node: Bindable Readline Commands225986
|
Node: Bindable Readline Commands228115
|
||||||
Node: Commands For Moving226736
|
Node: Commands For Moving228865
|
||||||
Node: Commands For History227583
|
Node: Commands For History229712
|
||||||
Node: Commands For Text230412
|
Node: Commands For Text232541
|
||||||
Node: Commands For Killing232146
|
Node: Commands For Killing234508
|
||||||
Node: Numeric Arguments234295
|
Node: Numeric Arguments236657
|
||||||
Node: Commands For Completion235421
|
Node: Commands For Completion237783
|
||||||
Node: Keyboard Macros238991
|
Node: Keyboard Macros241615
|
||||||
Node: Miscellaneous Commands239549
|
Node: Miscellaneous Commands242173
|
||||||
Node: Readline vi Mode243869
|
Node: Readline vi Mode246493
|
||||||
Node: Installing Bash244747
|
Node: Installing Bash247371
|
||||||
Node: Basic Installation245824
|
Node: Basic Installation248448
|
||||||
Node: Compilers and Options248734
|
Node: Compilers and Options251358
|
||||||
Node: Compiling For Multiple Architectures249468
|
Node: Compiling For Multiple Architectures252092
|
||||||
Node: Installation Names251125
|
Node: Installation Names253749
|
||||||
Node: Specifying the System Type251850
|
Node: Specifying the System Type254474
|
||||||
Node: Sharing Defaults252554
|
Node: Sharing Defaults255178
|
||||||
Node: Operation Controls253219
|
Node: Operation Controls255843
|
||||||
Node: Optional Features254124
|
Node: Optional Features256748
|
||||||
Node: Reporting Bugs260319
|
Node: Reporting Bugs263158
|
||||||
Node: Builtin Index261390
|
Node: Builtin Index264229
|
||||||
Node: Reserved Word Index264793
|
Node: Reserved Word Index267632
|
||||||
Node: Variable Index266251
|
Node: Variable Index269090
|
||||||
Node: Function Index271456
|
Node: Function Index274363
|
||||||
Node: Concept Index275885
|
Node: Concept Index278853
|
||||||
|
|
||||||
End Tag Table
|
End Tag Table
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,13 @@
|
||||||
@c %**end of header
|
@c %**end of header
|
||||||
|
|
||||||
@ignore
|
@ignore
|
||||||
last change: Wed Mar 25 11:36:48 EST 1998
|
Last Change: Wed Jan 20 16:46:26 EST 1999
|
||||||
@end ignore
|
@end ignore
|
||||||
|
|
||||||
@set EDITION 2.2
|
@set EDITION 2.3
|
||||||
@set VERSION 2.02
|
@set VERSION 2.03
|
||||||
@set UPDATED 1 April 1998
|
@set UPDATED 20 January 1999
|
||||||
@set UPDATE-MONTH April 1998
|
@set UPDATE-MONTH January 1999
|
||||||
|
|
||||||
@iftex
|
@iftex
|
||||||
@finalout
|
@finalout
|
||||||
|
|
@ -36,7 +36,7 @@ This is Edition @value{EDITION}, last updated @value{UPDATED},
|
||||||
of @cite{The GNU Bash Reference Manual},
|
of @cite{The GNU Bash Reference Manual},
|
||||||
for @code{Bash}, Version @value{VERSION}.
|
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
|
Permission is granted to make and distribute verbatim copies of
|
||||||
this manual provided the copyright notice and this permission notice
|
this manual provided the copyright notice and this permission notice
|
||||||
|
|
@ -64,13 +64,13 @@ by the Free Software Foundation.
|
||||||
@titlepage
|
@titlepage
|
||||||
@title Bash Reference Manual
|
@title Bash Reference Manual
|
||||||
@subtitle Reference Documentation for Bash
|
@subtitle Reference Documentation for Bash
|
||||||
@subtitle Edition @value{EDITION}, for @code{bash} Version @value{VERSION}.
|
@subtitle Edition @value{EDITION}, for @code{Bash} Version @value{VERSION}.
|
||||||
@subtitle @value{UPDATED}
|
@subtitle @value{UPDATE-MONTH}
|
||||||
@author Chet Ramey, Case Western Reserve University
|
@author Chet Ramey, Case Western Reserve University
|
||||||
@author Brian Fox, Free Software Foundation
|
@author Brian Fox, Free Software Foundation
|
||||||
@page
|
@page
|
||||||
@vskip 0pt plus 1filll
|
@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
|
Permission is granted to make and distribute verbatim copies of
|
||||||
this manual provided the copyright notice and this permission notice
|
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
|
The second form causes all matches of @var{pattern} to be
|
||||||
replaced with @var{string}.
|
replaced with @var{string}.
|
||||||
If @var{pattern} begins with @samp{#}, it must match at the beginning
|
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
|
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
|
If @var{string} is null, matches of @var{pattern} are deleted
|
||||||
and the @code{/} following @var{pattern} may be omitted.
|
and the @code{/} following @var{pattern} may be omitted.
|
||||||
If @var{parameter} is @samp{@@} or @samp{*},
|
If @var{parameter} is @samp{@@} or @samp{*},
|
||||||
|
|
@ -2285,13 +2285,16 @@ The return status is zero.
|
||||||
@item .
|
@item .
|
||||||
@btindex .
|
@btindex .
|
||||||
@example
|
@example
|
||||||
. @var{filename}
|
. @var{filename} [@var{arguments}]
|
||||||
@end example
|
@end example
|
||||||
Read and execute commands from the @var{filename} argument in the
|
Read and execute commands from the @var{filename} argument in the
|
||||||
current shell context. If @var{filename} does not contain a slash,
|
current shell context. If @var{filename} does not contain a slash,
|
||||||
the @code{$PATH} variable is used to find
|
the @code{$PATH} variable is used to find
|
||||||
@var{filename}. The current directory is searched if @var{filename}
|
@var{filename}. The current directory is searched if @var{filename}
|
||||||
is not found in @code{$PATH}.
|
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
|
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
|
zero if no commands are executed. If @var{filename} is not found, or
|
||||||
cannot be read, the return status is non-zero.
|
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
|
Tildes are expanded in file names as described above under
|
||||||
Tilde Expansion (@pxref{Tilde Expansion}).
|
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.
|
executes commands from the file @file{/etc/profile}, if that file exists.
|
||||||
After reading that file, it looks for @file{~/.bash_profile},
|
After reading that file, it looks for @file{~/.bash_profile},
|
||||||
@file{~/.bash_login}, and @file{~/.profile}, in that order, and reads
|
@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
|
startup behavior of historical versions of @code{sh} as closely as
|
||||||
possible, while conforming to the @sc{POSIX} standard as well.
|
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
|
and execute commands from @file{/etc/profile} and @file{~/.profile}, in
|
||||||
that order.
|
that order.
|
||||||
The @samp{--noprofile} option may be used to inhibit this behavior.
|
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
|
commands from any other startup files, the @samp{--rcfile} option has
|
||||||
no effect.
|
no effect.
|
||||||
A non-interactive shell invoked with the name @code{sh} does not attempt
|
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
|
When invoked as @code{sh}, Bash enters @sc{POSIX} mode after
|
||||||
the startup files are read.
|
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
|
@code{rshd} does not generally invoke the shell with those options or
|
||||||
allow them to be specified.
|
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?
|
@node Is This Shell Interactive?
|
||||||
@section Is This Shell Interactive?
|
@section Is This Shell Interactive?
|
||||||
@cindex interactive shell
|
@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 remaining names are assigned empty values.
|
||||||
The characters in the value of the @code{IFS} variable
|
The characters in the value of the @code{IFS} variable
|
||||||
are used to split the line into words.
|
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
|
If no names are supplied, the line read is assigned to the
|
||||||
variable @code{REPLY}.
|
variable @code{REPLY}.
|
||||||
The return code is zero, unless end-of-file is encountered.
|
The return code is zero, unless end-of-file is encountered.
|
||||||
|
|
@ -3683,8 +3698,10 @@ Options, if supplied, have the following meanings:
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
@item -r
|
@item -r
|
||||||
If this option is given, a backslash-newline pair is not ignored, and
|
If this option is given, backslash does not act as an escape
|
||||||
the backslash is considered to be part of the line.
|
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}
|
@item -p @var{prompt}
|
||||||
Display @var{prompt}, without a
|
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}).
|
being expanded (@pxref{Printing a Prompt}).
|
||||||
This option is enabled by default.
|
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
|
@item shift_verbose
|
||||||
If this is set, the @code{shift}
|
If this is set, the @code{shift}
|
||||||
builtin prints an error message when the shift count exceeds the
|
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,
|
processed, shell functions are not inherited from the environment,
|
||||||
and the @code{SHELLOPTS} variable, if it appears in the environment,
|
and the @code{SHELLOPTS} variable, if it appears in the environment,
|
||||||
is ignored.
|
is ignored.
|
||||||
This is enabled automatically
|
If the shell is started with the effective user (group) id not equal to the
|
||||||
on startup if the effective user (group) id is not equal to the real
|
real user (group) id, and the @code{-p} option is not supplied, these actions
|
||||||
user (group) id. Turning this option off causes the effective user
|
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.
|
and group ids to be set to the real user and group ids.
|
||||||
|
|
||||||
@item -t
|
@item -t
|
||||||
|
|
@ -4235,6 +4262,9 @@ True if @var{file} exists and is a regular file.
|
||||||
@item -g @var{file}
|
@item -g @var{file}
|
||||||
True if @var{file} exists and its set-group-id bit is set.
|
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}
|
@item -k @var{file}
|
||||||
True if @var{file} exists and its "sticky" bit is set.
|
True if @var{file} exists and its "sticky" bit is set.
|
||||||
|
|
||||||
|
|
@ -5101,8 +5131,8 @@ with the exception that the following are disallowed:
|
||||||
@item
|
@item
|
||||||
Changing directories with the @code{cd} builtin.
|
Changing directories with the @code{cd} builtin.
|
||||||
@item
|
@item
|
||||||
Setting or unsetting the values of the @code{SHELL} or @code{PATH}
|
Setting or unsetting the values of the @code{SHELL}, @code{PATH},
|
||||||
variables.
|
@code{ENV}, or @code{BASH_ENV} variables.
|
||||||
@item
|
@item
|
||||||
Specifying command names containing slashes.
|
Specifying command names containing slashes.
|
||||||
@item
|
@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
|
which this should be turned off, and @code{configure} disables this
|
||||||
option automatically for a number of systems.
|
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
|
@item --with-purify
|
||||||
Define this to use the Purify memory allocation checker from Pure
|
Define this to use the Purify memory allocation checker from Pure
|
||||||
Software.
|
Software.
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@
|
||||||
.\" Case Western Reserve University
|
.\" Case Western Reserve University
|
||||||
.\" chet@ins.CWRU.Edu
|
.\" 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,
|
.\" File Name macro. This used to be `.PN', for Path Name,
|
||||||
.\" but Sun doesn't seem to like that very much.
|
.\" but Sun doesn't seem to like that very much.
|
||||||
|
|
@ -22,6 +22,7 @@ readline \- get a line from a user with editing
|
||||||
.LP
|
.LP
|
||||||
.nf
|
.nf
|
||||||
.ft B
|
.ft B
|
||||||
|
#include <stdio.h>
|
||||||
#include <readline.h>
|
#include <readline.h>
|
||||||
#include <history.h>
|
#include <history.h>
|
||||||
.ft
|
.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
|
scrolling the input horizontally on a single screen line when it
|
||||||
becomes longer than the screen width rather than wrapping to a new line.
|
becomes longer than the screen width rather than wrapping to a new line.
|
||||||
.TP
|
.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)
|
.B keymap (emacs)
|
||||||
Set the current readline keymap. The set of legal keymap names is
|
Set the current readline keymap. The set of legal keymap names is
|
||||||
\fIemacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
|
\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
|
If set to \fBOn\fP, history lines that have been modified are displayed
|
||||||
with a preceding asterisk (\fB*\fP).
|
with a preceding asterisk (\fB*\fP).
|
||||||
.TP
|
.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)
|
.B output\-meta (Off)
|
||||||
If set to \fBOn\fP, readline will display characters with the
|
If set to \fBOn\fP, readline will display characters with the
|
||||||
eighth bit set directly rather than as a meta-prefixed escape
|
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.
|
the next entry from the history matching the string typed so far.
|
||||||
An incremental search requires only as many characters as needed to
|
An incremental search requires only as many characters as needed to
|
||||||
find the desired history entry.
|
find the desired history entry.
|
||||||
The Escape character is used to terminate an incremental search.
|
The characters present in the value of the \fIisearch-terminators\fP
|
||||||
Control-J will also terminate the search.
|
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
|
Control-G will abort an incremental search and restore the original
|
||||||
line.
|
line.
|
||||||
When the search is terminated, the history entry containing the
|
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,
|
Delete the character behind the cursor. When given a numeric argument,
|
||||||
save the deleted text on the kill ring.
|
save the deleted text on the kill ring.
|
||||||
.TP
|
.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)
|
.B quoted\-insert (C\-q, C\-v)
|
||||||
Add the next character that you type to the line verbatim. This is
|
Add the next character that you type to the line verbatim. This is
|
||||||
how to insert characters like \fBC\-q\fP, for example.
|
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.
|
through the list.
|
||||||
This command is intended to be bound to \fBTAB\fP, but is unbound
|
This command is intended to be bound to \fBTAB\fP, but is unbound
|
||||||
by default.
|
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
|
.PD
|
||||||
.SS Keyboard Macros
|
.SS Keyboard Macros
|
||||||
.PP
|
.PP
|
||||||
|
|
@ -847,7 +870,7 @@ Undo all changes made to this line. This is like executing the
|
||||||
.B undo
|
.B undo
|
||||||
command enough times to return the line to its initial state.
|
command enough times to return the line to its initial state.
|
||||||
.TP
|
.TP
|
||||||
.B tilde\-expand (M\-~)
|
.B tilde\-expand (M\-&)
|
||||||
Perform tilde expansion on the current word.
|
Perform tilde expansion on the current word.
|
||||||
.TP
|
.TP
|
||||||
.B set\-mark (C\-@, M-<space>)
|
.B set\-mark (C\-@, M-<space>)
|
||||||
|
|
|
||||||
29
error.c
29
error.c
|
|
@ -496,3 +496,32 @@ trace (format, va_alist)
|
||||||
#endif /* 0 */
|
#endif /* 0 */
|
||||||
|
|
||||||
#endif /* USE_VARARGS */
|
#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. */
|
/* Report an internal warning. */
|
||||||
extern void internal_warning __P((const char *, ...));
|
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_ */
|
#endif /* !_ERROR_H_ */
|
||||||
|
|
|
||||||
26
eval.c
26
eval.c
|
|
@ -41,6 +41,10 @@
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "execute_cmd.h"
|
#include "execute_cmd.h"
|
||||||
|
|
||||||
|
#if defined (HISTORY)
|
||||||
|
# include "bashhist.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
extern int yyparse ();
|
extern int yyparse ();
|
||||||
|
|
||||||
extern int EOF_reached;
|
extern int EOF_reached;
|
||||||
|
|
@ -105,7 +109,7 @@ reader_loop ()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
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)
|
alrm_catcher(i)
|
||||||
int 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);
|
jump_to_top_level (EXITPROG);
|
||||||
SIGRETURN (0);
|
SIGRETURN (0);
|
||||||
}
|
}
|
||||||
|
|
@ -269,6 +273,17 @@ parse_string_to_word_list (s, whom)
|
||||||
{
|
{
|
||||||
WORD_LIST *wl;
|
WORD_LIST *wl;
|
||||||
COMMAND *saved_global;
|
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);
|
push_stream (1);
|
||||||
|
|
||||||
|
|
@ -293,5 +308,12 @@ parse_string_to_word_list (s, whom)
|
||||||
|
|
||||||
pop_stream ();
|
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);
|
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 ()
|
hex2inet ()
|
||||||
{
|
{
|
||||||
local x1 x2 x3 x4
|
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
|
case "$1" in
|
||||||
0x*) h=${1#??} ;;
|
0x*) h=${1#??} ;;
|
||||||
|
|
@ -40,5 +51,10 @@ hex2inet ()
|
||||||
x3=$(( 0x${h:4:2} ))
|
x3=$(( 0x${h:4:2} ))
|
||||||
x4=$(( 0x${h:6: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()
|
lowercase()
|
||||||
{
|
{
|
||||||
for file; do
|
for file; do
|
||||||
filename=${file##*/}
|
filename=${file##*/}
|
||||||
case "$filename" in
|
case "$filename" in
|
||||||
*/*) dirname=${file%/*} ;;
|
*/*) dirname=${file%/*} ;;
|
||||||
*) dirname=.;;
|
*) dirname=.;;
|
||||||
esac
|
esac
|
||||||
nf=$(echo $filename | tr A-Z a-z)
|
nf=$(echo $filename | tr A-Z a-z)
|
||||||
newname="${dirname}/${nf}"
|
newname="${dirname}/${nf}"
|
||||||
if [ "$nf" != "$filename" ]; then
|
if [ "$nf" != "$filename" ]; then
|
||||||
mv "$file" "$newname"
|
mv "$file" "$newname"
|
||||||
echo "$0: $file -> $newname"
|
echo "lowercase: $file -> $newname"
|
||||||
else
|
else
|
||||||
echo "$0: $file not changed."
|
echo "lowercase: $file not changed."
|
||||||
fi
|
fi
|
||||||
done
|
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
|
# 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.
|
# Include some boilerplate Gnu makefile definitions.
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
|
|
@ -22,123 +20,148 @@ VPATH = .:@srcdir@
|
||||||
CC = @CC@
|
CC = @CC@
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
|
|
||||||
SHELL = /bin/sh
|
SHELL = @MAKE_SHELL@
|
||||||
|
|
||||||
# SunOS 4
|
host_os = @host_os@
|
||||||
#PICFLAG = -pic
|
host_cpu = @host_cpu@
|
||||||
# Some versions of gcc, esp. on NetBSD and FreeBSD
|
host_vendor = @host_vendor@
|
||||||
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
|
|
||||||
|
|
||||||
# SunOS 4, BSD/OS 2.1, BSD/OS 3.x, SVR4.2, SVR4, Linux, AIX 4.2, etc.
|
CFLAGS = @CFLAGS@
|
||||||
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
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# 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 \
|
INC = -I. -I.. -I$(topdir) -I$(topdir)/lib -I$(topdir)/builtins \
|
||||||
-I$(BUILD_DIR) -I$(BUILD_DIR)/lib -I$(BUILD_DIR)/builtins
|
-I$(BUILD_DIR) -I$(BUILD_DIR)/lib -I$(BUILD_DIR)/builtins
|
||||||
|
|
||||||
.c.o:
|
.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 \
|
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
|
OTHERPROG = necho getconf hello cat
|
||||||
|
|
||||||
all: $(ALLPROG)
|
all: $(SHOBJ_STATUS)
|
||||||
others: $(OTHERPROG)
|
|
||||||
|
|
||||||
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
|
sprintf: sprintf.o
|
||||||
$(LD) $(LDOPT) -o $@ sprintf.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ sprintf.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
print: print.o
|
print: print.o
|
||||||
$(LD) $(LDOPT) -o $@ print.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ print.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
necho: necho.o
|
necho: necho.o
|
||||||
$(LD) $(LDOPT) -o $@ necho.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ necho.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
getconf: getconf.o
|
getconf: getconf.o
|
||||||
$(LD) $(LDOPT) -o $@ getconf.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ getconf.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
hello: hello.o
|
hello: hello.o
|
||||||
$(LD) $(LDOPT) -o $@ hello.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ hello.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
truefalse: truefalse.o
|
truefalse: truefalse.o
|
||||||
$(LD) $(LDOPT) -o $@ truefalse.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ truefalse.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
sleep: sleep.o
|
sleep: sleep.o
|
||||||
$(LD) $(LDOPT) -o $@ sleep.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ sleep.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
pushd: pushd.o
|
|
||||||
$(LD) $(LDOPT) -o $@ pushd.o $(LDLIBS)
|
|
||||||
|
|
||||||
finfo: finfo.o
|
finfo: finfo.o
|
||||||
$(LD) $(LDOPT) -o $@ finfo.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ finfo.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
cat: cat.o
|
cat: cat.o
|
||||||
$(LD) $(LDOPT) -o $@ cat.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ cat.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
logname: logname.o
|
logname: logname.o
|
||||||
$(LD) $(LDOPT) -o $@ logname.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ logname.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
basename: basename.o
|
basename: basename.o
|
||||||
$(LD) $(LDOPT) -o $@ basename.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ basename.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
dirname: dirname.o
|
dirname: dirname.o
|
||||||
$(LD) $(LDOPT) -o $@ dirname.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ dirname.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
tty: tty.o
|
tty: tty.o
|
||||||
$(LD) $(LDOPT) -o $@ tty.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ tty.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
pathchk: pathchk.o
|
pathchk: pathchk.o
|
||||||
$(LD) $(LDOPT) -o $@ pathchk.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ pathchk.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
tee: tee.o
|
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
|
rmdir: rmdir.o
|
||||||
$(LD) $(LDOPT) -o $@ rmdir.o $(LDLIBS)
|
$(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ rmdir.o $(SHOBJ_LIBS)
|
||||||
|
|
||||||
head: head.o
|
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:
|
clean:
|
||||||
$(RM) $(ALLPROG) $(OTHERPROG) *.o
|
$(RM) $(ALLPROG) $(OTHERPROG) *.o
|
||||||
|
|
@ -146,12 +169,11 @@ clean:
|
||||||
mostlyclean: clean
|
mostlyclean: clean
|
||||||
|
|
||||||
distclean maintainer-clean: clean
|
distclean maintainer-clean: clean
|
||||||
$(RM) Makefile
|
$(RM) Makefile pushd.c
|
||||||
|
|
||||||
print.o: print.c
|
print.o: print.c
|
||||||
truefalse.o: truefalse.c
|
truefalse.o: truefalse.c
|
||||||
sleep.o: sleep.c
|
sleep.o: sleep.c
|
||||||
pushd.o: pushd.c
|
|
||||||
finfo.o: finfo.c
|
finfo.o: finfo.c
|
||||||
logname.o: logname.c
|
logname.o: logname.c
|
||||||
basename.o: basename.c
|
basename.o: basename.c
|
||||||
|
|
@ -166,4 +188,10 @@ necho.o: necho.c
|
||||||
getconf.o: getconf.c
|
getconf.o: getconf.c
|
||||||
hello.o: hello.c
|
hello.o: hello.c
|
||||||
cat.o: cat.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
|
All of the new builtins in ksh93 that bash didn't already have
|
||||||
are included here, as is the ksh `print' builtin.
|
are included here, as is the ksh `print' builtin.
|
||||||
|
|
||||||
Compile with cc and whatever pic options you need (look in the
|
The configure script in the top-level source directory uses the
|
||||||
Makefile for a few common settings)
|
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,
|
Loadable builtins are loaded into a running shell with
|
||||||
look in the Makefile)
|
|
||||||
|
|
||||||
then enable -f filename builtin-name
|
enable -f filename builtin-name
|
||||||
|
|
||||||
enable uses a simple reference-counting scheme to avoid unloading a
|
enable uses a simple reference-counting scheme to avoid unloading a
|
||||||
shared object that implements more than one loadable builtin before
|
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,
|
Many of the details needed by builtin writers are found in hello.c,
|
||||||
the canonical example. There is no real `builtin writers' programming
|
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] == '/')
|
if (string[slen] == '/')
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (slen >= 0)
|
if (slen < 0)
|
||||||
{
|
{
|
||||||
fputs (".\n", stdout);
|
fputs (".\n", stdout);
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
|
||||||
|
|
@ -196,6 +196,13 @@ int m;
|
||||||
obits[i++] = 'x';
|
obits[i++] = 'x';
|
||||||
obits[i] = '\0';
|
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);
|
printf ("u=%s,g=%s,o=%s", ubits, gbits, obits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -217,6 +224,10 @@ int mode;
|
||||||
printf("S_IFLNK ");
|
printf("S_IFLNK ");
|
||||||
if (S_ISSOCK(mode))
|
if (S_ISSOCK(mode))
|
||||||
printf("S_IFSOCK ");
|
printf("S_IFSOCK ");
|
||||||
|
#ifdef S_ISWHT
|
||||||
|
if (S_ISWHT(mode))
|
||||||
|
printf("S_ISWHT ");
|
||||||
|
#endif
|
||||||
perms(getperm(mode));
|
perms(getperm(mode));
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,19 +3,21 @@
|
||||||
|
|
||||||
/* See Makefile for compilation details. */
|
/* See Makefile for compilation details. */
|
||||||
|
|
||||||
#include "config.h"
|
#include <config.h>
|
||||||
|
|
||||||
#if defined (HAVE_UNISTD_H)
|
#if defined (HAVE_UNISTD_H)
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "builtins.h"
|
#include "builtins.h"
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
|
#include "bashgetopt.h"
|
||||||
|
|
||||||
/* A builtin `xxx' is normally implemented with an `xxx_builtin' function.
|
/* A builtin `xxx' is normally implemented with an `xxx_builtin' function.
|
||||||
If you're converting a command that uses the normal Unix argc/argv
|
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
|
the original `main' something like `xxx_main'. Look at cat.c for an
|
||||||
example.
|
example.
|
||||||
|
|
||||||
|
|
@ -41,7 +43,6 @@ hello_builtin (list)
|
||||||
which is printed by `help xxx'. It must end with a NULL. */
|
which is printed by `help xxx'. It must end with a NULL. */
|
||||||
char *hello_doc[] = {
|
char *hello_doc[] = {
|
||||||
"this is the long doc for the sample hello builtin",
|
"this is the long doc for the sample hello builtin",
|
||||||
"which is a bare-bones echo",
|
|
||||||
(char *)NULL
|
(char *)NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -53,7 +54,7 @@ struct builtin hello_struct = {
|
||||||
hello_builtin, /* function implementing the builtin */
|
hello_builtin, /* function implementing the builtin */
|
||||||
BUILTIN_ENABLED, /* initial flags for builtin */
|
BUILTIN_ENABLED, /* initial flags for builtin */
|
||||||
hello_doc, /* array of long documentation strings. */
|
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 */
|
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
|
(char *)NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct builtin echo_struct = {
|
struct builtin necho_struct = {
|
||||||
"echo",
|
"echo",
|
||||||
necho_builtin,
|
necho_builtin,
|
||||||
BUILTIN_ENABLED,
|
BUILTIN_ENABLED,
|
||||||
|
|
|
||||||
|
|
@ -170,8 +170,7 @@ portable_chars_only (path)
|
||||||
for (p = path; *p; ++p)
|
for (p = path; *p; ++p)
|
||||||
if (portable_chars[(const unsigned char) *p] == 0)
|
if (portable_chars[(const unsigned char) *p] == 0)
|
||||||
{
|
{
|
||||||
error (0, 0, "path `%s' contains nonportable character `%c'",
|
builtin_error ("path `%s' contains nonportable character `%c'", path, *p);
|
||||||
path, *p);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -212,7 +211,7 @@ dir_ok (path)
|
||||||
|
|
||||||
if (!S_ISDIR (stats.st_mode))
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -324,7 +323,7 @@ validate_path (path, portability)
|
||||||
name_max = _POSIX_NAME_MAX;
|
name_max = _POSIX_NAME_MAX;
|
||||||
if (length > 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);
|
start, length, name_max);
|
||||||
free (parent);
|
free (parent);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -350,7 +349,7 @@ validate_path (path, portability)
|
||||||
free (parent);
|
free (parent);
|
||||||
if (strlen (path) > path_max)
|
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);
|
path, strlen (path), path_max);
|
||||||
return 1;
|
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.
|
* An incredibly simplistic floating point converter.
|
||||||
*/
|
*/
|
||||||
|
static int multiplier[7] = { 1, 100000, 10000, 1000, 100, 10, 1 };
|
||||||
|
|
||||||
static int
|
static int
|
||||||
convert(s, sp, usp)
|
convert(s, sp, usp)
|
||||||
char *s;
|
char *s;
|
||||||
|
|
@ -95,18 +97,11 @@ long *sp, *usp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now convert to millionths */
|
/* Now convert to millionths */
|
||||||
if (n == 1)
|
usec *= multiplier[n];
|
||||||
usec *= 100000;
|
|
||||||
else if (n == 2)
|
if (n == 6 && p[6] && isdigit(p[6]) && p[6] >= '5')
|
||||||
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++; /* round up 1 */
|
usec++; /* round up 1 */
|
||||||
|
|
||||||
RETURN(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
|
#! /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 Ramey
|
||||||
# chet@po.cwru.edu
|
# chet@po.cwru.edu
|
||||||
|
|
@ -27,7 +27,11 @@ mkalias ()
|
||||||
}
|
}
|
||||||
EOF
|
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' \
|
$BASH /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \
|
||||||
-e 's/\$term/\$TERM/g' \
|
-e 's/\$term/\$TERM/g' \
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
#! /bin/bash
|
#! /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 Ramey
|
||||||
# chet@po.cwru.edu
|
# chet@po.cwru.edu
|
||||||
|
|
@ -27,7 +27,11 @@ mkalias ()
|
||||||
}
|
}
|
||||||
EOF
|
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' \
|
sh /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \
|
||||||
-e 's/\$term/\$TERM/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_pr(){ echo $* | tr ' ' '\012' | pr -5 -t -w75 -l$[ ( $# + 4 ) / 5 ]; }
|
||||||
ash_rm(){ echo " $1 " | sed -e "s/ $2 / /" -e 's/^ //' -e 's/ $//'; }
|
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
|
cd
|
||||||
LIM=.limbo # $HOME/$LIM contains "destroyed" objects
|
LIM=.limbo # $HOME/$LIM contains "destroyed" objects
|
||||||
mkdir $LIM >&- 2>&-
|
mkdir $LIM >&- 2>&-
|
||||||
|
|
@ -164,8 +169,7 @@ do room=`pwd`
|
||||||
prev=$room
|
prev=$room
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -n '-advsh> ' # prompt
|
read -e -p '-advsh> ' verb obj x # prompt is '-advsh> '
|
||||||
read verb obj x
|
|
||||||
if [ $? != 0 ]
|
if [ $? != 0 ]
|
||||||
then verb=quit # EOF
|
then verb=quit # EOF
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -737,6 +737,13 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
|
||||||
commands, this causes the last simple command in
|
commands, this causes the last simple command in
|
||||||
the function to be waited for twice. */
|
the function to be waited for twice. */
|
||||||
exec_result = wait_for (last_made_pid);
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
programming_error
|
command_error ("execute_command", CMDERR_BADTYPE, command->type, 0);
|
||||||
("execute_command: bad command type `%d'", command->type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (my_undo_list)
|
if (my_undo_list)
|
||||||
|
|
@ -905,7 +911,10 @@ difftimeval (d, t1, t2)
|
||||||
d->tv_usec += 1000000;
|
d->tv_usec += 1000000;
|
||||||
d->tv_sec -= 1;
|
d->tv_sec -= 1;
|
||||||
if (d->tv_sec < 0) /* ??? -- BSD/OS does this */
|
if (d->tv_sec < 0) /* ??? -- BSD/OS does this */
|
||||||
d->tv_sec = 0;
|
{
|
||||||
|
d->tv_sec = 0;
|
||||||
|
d->tv_usec = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
@ -916,7 +925,7 @@ addtimeval (d, t1, t2)
|
||||||
{
|
{
|
||||||
d->tv_sec = t1->tv_sec + t2->tv_sec;
|
d->tv_sec = t1->tv_sec + t2->tv_sec;
|
||||||
d->tv_usec = t1->tv_usec + t2->tv_usec;
|
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_usec -= 1000000;
|
||||||
d->tv_sec += 1;
|
d->tv_sec += 1;
|
||||||
|
|
@ -1472,7 +1481,7 @@ execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
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);
|
jump_to_top_level (DISCARD);
|
||||||
exec_result = EXECUTION_FAILURE;
|
exec_result = EXECUTION_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
@ -2062,7 +2071,7 @@ execute_arith_command (arith_command)
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
this_command_name = "((";
|
this_command_name = "(("; /* )) */
|
||||||
/* If we're in a function, update the line number information. */
|
/* If we're in a function, update the line number information. */
|
||||||
if (variable_context)
|
if (variable_context)
|
||||||
line_number = arith_command->line - function_line_number;
|
line_number = arith_command->line - function_line_number;
|
||||||
|
|
@ -2092,7 +2101,7 @@ static int
|
||||||
execute_cond_node (cond)
|
execute_cond_node (cond)
|
||||||
COND_COM *cond;
|
COND_COM *cond;
|
||||||
{
|
{
|
||||||
int result, invert, patmatch;
|
int result, invert, patmatch, flags;
|
||||||
char *arg1, *arg2, *print2;
|
char *arg1, *arg2, *print2;
|
||||||
|
|
||||||
invert = (cond->flags & CMD_INVERT_RETURN);
|
invert = (cond->flags & CMD_INVERT_RETURN);
|
||||||
|
|
@ -2124,8 +2133,9 @@ execute_cond_node (cond)
|
||||||
}
|
}
|
||||||
else if (cond->type == COND_BINARY)
|
else if (cond->type == COND_BINARY)
|
||||||
{
|
{
|
||||||
patmatch = (cond->op->word[1] == '=') && (cond->op->word[2] == '\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[0] == '=') ||
|
||||||
|
(cond->op->word[0] == '=' && cond->op->word[1] == '\0'));
|
||||||
|
|
||||||
arg1 = cond_expand_word (cond->left->op, 0);
|
arg1 = cond_expand_word (cond->left->op, 0);
|
||||||
if (arg1 == 0)
|
if (arg1 == 0)
|
||||||
|
|
@ -2147,7 +2157,7 @@ execute_cond_node (cond)
|
||||||
}
|
}
|
||||||
else
|
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);
|
jump_to_top_level (DISCARD);
|
||||||
result = EXECUTION_FAILURE;
|
result = EXECUTION_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
@ -2262,7 +2272,7 @@ fix_assignment_words (words)
|
||||||
|
|
||||||
for (w = words; w; w = w->next)
|
for (w = words; w; w = w->next)
|
||||||
if (w->word->flags & W_ASSIGNMENT)
|
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
|
/* 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;
|
WORD_LIST *words, *lastword;
|
||||||
char *command_line, *lastarg, *temp;
|
char *command_line, *lastarg, *temp;
|
||||||
int first_word_quoted, result, builtin_is_special, already_forked, dofork;
|
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;
|
Function *builtin;
|
||||||
SHELL_VAR *func;
|
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;
|
simple_command->words ? (simple_command->words->word->flags & W_QUOTED): 0;
|
||||||
|
|
||||||
old_last_command_subst_pid = last_command_subst_pid;
|
old_last_command_subst_pid = last_command_subst_pid;
|
||||||
|
old_last_async_pid = last_asynchronous_pid;
|
||||||
|
|
||||||
already_forked = dofork = 0;
|
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);
|
do_piping (pipe_in, pipe_out);
|
||||||
pipe_in = pipe_out = -1;
|
pipe_in = pipe_out = -1;
|
||||||
|
|
||||||
|
last_asynchronous_pid = old_last_async_pid;
|
||||||
subshell_environment = async ? SUBSHELL_ASYNC : SUBSHELL_FORK;
|
subshell_environment = async ? SUBSHELL_ASYNC : SUBSHELL_FORK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -2770,11 +2782,14 @@ execute_subshell_builtin_or_function (words, redirects, builtin, var,
|
||||||
struct fd_bitmap *fds_to_close;
|
struct fd_bitmap *fds_to_close;
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
int result, r;
|
int result, r, jobs_hack;
|
||||||
|
|
||||||
/* A subshell is neither a login shell nor interactive. */
|
/* A subshell is neither a login shell nor interactive. */
|
||||||
login_shell = interactive = 0;
|
login_shell = interactive = 0;
|
||||||
|
|
||||||
|
jobs_hack = (builtin == jobs_builtin) &&
|
||||||
|
((subshell_environment & SUBSHELL_ASYNC) == 0 || pipe_out != NO_PIPE);
|
||||||
|
|
||||||
subshell_environment = SUBSHELL_ASYNC;
|
subshell_environment = SUBSHELL_ASYNC;
|
||||||
|
|
||||||
maybe_make_export_env (); /* XXX - is this needed? */
|
maybe_make_export_env (); /* XXX - is this needed? */
|
||||||
|
|
@ -2785,8 +2800,7 @@ execute_subshell_builtin_or_function (words, redirects, builtin, var,
|
||||||
the shell itself. */
|
the shell itself. */
|
||||||
|
|
||||||
/* Allow the output of `jobs' to be piped. */
|
/* Allow the output of `jobs' to be piped. */
|
||||||
if (builtin == jobs_builtin && !async &&
|
if (jobs_hack)
|
||||||
(pipe_out != NO_PIPE || pipe_in != NO_PIPE))
|
|
||||||
kill_current_pipeline ();
|
kill_current_pipeline ();
|
||||||
else
|
else
|
||||||
without_job_control ();
|
without_job_control ();
|
||||||
|
|
@ -2898,6 +2912,10 @@ execute_builtin_or_function (words, builtin, var, redirects,
|
||||||
void
|
void
|
||||||
setup_async_signals ()
|
setup_async_signals ()
|
||||||
{
|
{
|
||||||
|
#if defined (__BEOS__)
|
||||||
|
set_signal_handler (SIGHUP, SIG_IGN); /* they want csh-like behavior */
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined (JOB_CONTROL)
|
#if defined (JOB_CONTROL)
|
||||||
if (job_control == 0)
|
if (job_control == 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,7 @@ extern void disable_priv_mode __P((void));
|
||||||
extern void unbind_args __P((void));
|
extern void unbind_args __P((void));
|
||||||
|
|
||||||
#if defined (RESTRICTED_SHELL)
|
#if defined (RESTRICTED_SHELL)
|
||||||
|
extern int shell_is_restricted __P((char *));
|
||||||
extern int maybe_make_restricted __P((char *));
|
extern int maybe_make_restricted __P((char *));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -116,6 +117,7 @@ extern char *getcwd __P((char *, size_t));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Declarations for functions defined in lib/sh/itos.c */
|
/* Declarations for functions defined in lib/sh/itos.c */
|
||||||
|
extern char *inttostr __P((int, char *, int));
|
||||||
extern char *itos __P((int));
|
extern char *itos __P((int));
|
||||||
|
|
||||||
/* Declarations for functions defined in lib/sh/oslib.c */
|
/* 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 `/',
|
disallows: changing directories, command or path names containing `/',
|
||||||
unsetting or resetting the values of $PATH and $SHELL, and any type of
|
unsetting or resetting the values of $PATH and $SHELL, and any type of
|
||||||
output redirection. */
|
output redirection. */
|
||||||
int restricted = 0;
|
int restricted = 0; /* currently restricted */
|
||||||
|
int restricted_shell = 0; /* shell was started in restricted mode. */
|
||||||
#endif /* RESTRICTED_SHELL */
|
#endif /* RESTRICTED_SHELL */
|
||||||
|
|
||||||
/* Non-zero means that this shell is running in `privileged' mode. This
|
/* 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)
|
#if defined (RESTRICTED_SHELL)
|
||||||
extern int restricted;
|
extern int restricted;
|
||||||
|
extern int restricted_shell;
|
||||||
#endif /* RESTRICTED_SHELL */
|
#endif /* RESTRICTED_SHELL */
|
||||||
|
|
||||||
extern int *find_flag __P((int));
|
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;
|
*sfp = (*sfp * 1000) / 1000000;
|
||||||
if (rest >= 500)
|
if (rest >= 500)
|
||||||
*sfp += 1;
|
*sfp += 1;
|
||||||
|
|
||||||
|
/* Sanity check */
|
||||||
|
if (*sfp >= 1000)
|
||||||
|
{
|
||||||
|
*sp += 1;
|
||||||
|
*sfp -= 1000;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print the contents of a struct timeval * in a standard way to stdio
|
/* 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;
|
*sfp = (*sfp * 1000) / clk_tck;
|
||||||
|
|
||||||
*sp = t / 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'
|
/* 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);
|
fcntl (fd, F_SETFL, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* There is a bug in the NeXT 2.1 rlogind that causes opens
|
/* There is a bug in the NeXT 2.1 rlogind that causes opens
|
||||||
of /dev/tty to fail. */
|
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
|
void
|
||||||
check_dev_tty ()
|
check_dev_tty ()
|
||||||
{
|
{
|
||||||
|
|
@ -620,11 +642,21 @@ canonicalize_pathname (path)
|
||||||
result[1] = '\0';
|
result[1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
/* If the result starts with `//', but the original path does not, we
|
||||||
/* Turn `//' into `/' -- XXX experimental */
|
can turn the // into /. */
|
||||||
if (result[0] == '/' && result[1] == '/' && result[2] == '\0')
|
if ((result[0] == '/' && result[1] == '/' && result[2] != '/') &&
|
||||||
result[1] = '\0';
|
(path[0] != '/' || path[1] != '/' || path[2] == '/'))
|
||||||
#endif
|
{
|
||||||
|
char *r2;
|
||||||
|
if (result[2] == '\0') /* short-circuit for bare `//' */
|
||||||
|
result[1] = '\0';
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r2 = savestring (result + 1);
|
||||||
|
free (result);
|
||||||
|
result = r2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
@ -742,7 +774,8 @@ full_pathname (file)
|
||||||
return ((char *)NULL);
|
return ((char *)NULL);
|
||||||
}
|
}
|
||||||
dlen = strlen (current_dir);
|
dlen = strlen (current_dir);
|
||||||
current_dir[dlen++] = '/';
|
if (current_dir[0] == '/' && dlen > 1)
|
||||||
|
current_dir[dlen++] = '/';
|
||||||
|
|
||||||
/* Turn /foo/./bar into /foo/bar. */
|
/* Turn /foo/./bar into /foo/bar. */
|
||||||
if (file[0] == '.' && file[1] == '/')
|
if (file[0] == '.' && file[1] == '/')
|
||||||
|
|
@ -1054,7 +1087,41 @@ get_group_list (ngp)
|
||||||
nbuf = itos ((int)group_array[i]);
|
nbuf = itos ((int)group_array[i]);
|
||||||
group_vector[i] = nbuf;
|
group_vector[i] = nbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ngp)
|
if (ngp)
|
||||||
*ngp = ngroups;
|
*ngp = ngroups;
|
||||||
return group_vector;
|
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 int group_member __P((gid_t));
|
||||||
extern char **get_group_list __P((int *));
|
extern char **get_group_list __P((int *));
|
||||||
|
extern int *get_group_array __P((int *));
|
||||||
|
|
||||||
#endif /* _GENERAL_H_ */
|
#endif /* _GENERAL_H_ */
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,9 @@ make_hash_table (buckets)
|
||||||
/* Return the location of the bucket which should contain the data
|
/* Return the location of the bucket which should contain the data
|
||||||
for STRING. TABLE is a pointer to a HASH_TABLE. */
|
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 ALL_ONES (~((unsigned long) 0))
|
||||||
#define BITS(h, n) ((unsigned long)(h) & ~(ALL_ONES << (n)))
|
#define BITS(h, n) ((unsigned long)(h) & ~(ALL_ONES << (n)))
|
||||||
|
|
||||||
|
|
|
||||||
156
jobs.c
156
jobs.c
|
|
@ -107,6 +107,10 @@
|
||||||
extern int errno;
|
extern int errno;
|
||||||
#endif /* !errno */
|
#endif /* !errno */
|
||||||
|
|
||||||
|
#if !defined (CHILD_MAX)
|
||||||
|
# define CHILD_MAX 32
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Take care of system dependencies that must be handled when waiting for
|
/* 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
|
children. The arguments to the WAITPID macro match those to the Posix.1
|
||||||
waitpid() function. */
|
waitpid() function. */
|
||||||
|
|
@ -543,12 +547,7 @@ cleanup_dead_jobs ()
|
||||||
BLOCK_CHILD (set, oset);
|
BLOCK_CHILD (set, oset);
|
||||||
|
|
||||||
for (i = 0; i < job_slots; i++)
|
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))
|
if (jobs[i] && DEADJOB (i) && IS_NOTIFIED (i))
|
||||||
#endif
|
|
||||||
delete_job (i, 0);
|
delete_job (i, 0);
|
||||||
|
|
||||||
UNBLOCK_CHILD (oset);
|
UNBLOCK_CHILD (oset);
|
||||||
|
|
@ -1150,9 +1149,9 @@ make_child (command, async_p)
|
||||||
{
|
{
|
||||||
/* In the child. Give this child the right process group, set the
|
/* In the child. Give this child the right process group, set the
|
||||||
signals to the default state for a new process. */
|
signals to the default state for a new process. */
|
||||||
pid_t mine;
|
pid_t mypid;
|
||||||
|
|
||||||
mine = getpid ();
|
mypid = getpid ();
|
||||||
#if defined (BUFFERED_INPUT)
|
#if defined (BUFFERED_INPUT)
|
||||||
/* Close default_buffered_input if it's > 0. We don't close it if it's
|
/* 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,
|
0 because that's the file descriptor used when redirecting input,
|
||||||
|
|
@ -1169,7 +1168,7 @@ make_child (command, async_p)
|
||||||
process group. */
|
process group. */
|
||||||
|
|
||||||
if (pipeline_pgrp == 0) /* This is the first child. */
|
if (pipeline_pgrp == 0) /* This is the first child. */
|
||||||
pipeline_pgrp = mine;
|
pipeline_pgrp = mypid;
|
||||||
|
|
||||||
/* Check for running command in backquotes. */
|
/* Check for running command in backquotes. */
|
||||||
if (pipeline_pgrp == shell_pgrp)
|
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
|
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
|
B.4.3.3, p. 237 also covers this, in the context of job control
|
||||||
shells. */
|
shells. */
|
||||||
if (setpgid (mine, pipeline_pgrp) < 0)
|
if (setpgid (mypid, pipeline_pgrp) < 0)
|
||||||
sys_error ("child setpgid (%d to %d)", mine, pipeline_pgrp);
|
sys_error ("child setpgid (%d to %d)", mypid, pipeline_pgrp);
|
||||||
#if defined (PGRP_PIPE)
|
#if defined (PGRP_PIPE)
|
||||||
if (pipeline_pgrp == mine)
|
if (pipeline_pgrp == mypid)
|
||||||
{
|
{
|
||||||
#endif
|
#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)
|
if (async_p == 0 && pipeline_pgrp != shell_pgrp)
|
||||||
give_terminal_to (pipeline_pgrp);
|
give_terminal_to (pipeline_pgrp);
|
||||||
|
|
||||||
|
|
@ -1471,16 +1476,13 @@ wait_for_single_pid (pid)
|
||||||
|
|
||||||
r = wait_for (pid);
|
r = wait_for (pid);
|
||||||
|
|
||||||
/* POSIX.2: if we just waited for $!, we can remove the job from the
|
/* POSIX.2: if we just waited for a job, we can remove it from the jobs
|
||||||
jobs table. */
|
table. */
|
||||||
if (pid == last_asynchronous_pid)
|
BLOCK_CHILD (set, oset);
|
||||||
{
|
job = find_job (pid);
|
||||||
BLOCK_CHILD (set, oset);
|
if (job != NO_JOB && jobs[job] && DEADJOB (job))
|
||||||
job = find_job (pid);
|
jobs[job]->flags |= J_NOTIFIED;
|
||||||
if (job != NO_JOB && jobs[job] && DEADJOB (job))
|
UNBLOCK_CHILD (oset);
|
||||||
jobs[job]->flags |= J_NOTIFIED;
|
|
||||||
UNBLOCK_CHILD (oset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
@ -1521,6 +1523,11 @@ wait_for_background_pids ()
|
||||||
break;
|
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. */
|
/* Make OLD_SIGINT_HANDLER the SIGINT signal handler. */
|
||||||
|
|
@ -1722,7 +1729,27 @@ wait_for (pid)
|
||||||
termination_state = process_exit_status (child->status);
|
termination_state = process_exit_status (child->status);
|
||||||
|
|
||||||
if (job == NO_JOB || IS_JOBCONTROL (job))
|
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
|
/* If the command did not exit cleanly, or the job is just
|
||||||
being stopped, then reset the tty state back to what it
|
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
|
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
|
message about the job's termination, and so delete_job really
|
||||||
clears the slot in the jobs table. */
|
clears the slot in the jobs table. */
|
||||||
#if 0
|
|
||||||
if (DEADJOB (job))
|
|
||||||
jobs[job]->flags |= J_NOTIFIED;
|
|
||||||
cleanup_dead_jobs ();
|
|
||||||
#else
|
|
||||||
notify_and_cleanup ();
|
notify_and_cleanup ();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1810,15 +1831,12 @@ wait_for_job (job)
|
||||||
pid = last_pid (job);
|
pid = last_pid (job);
|
||||||
r = wait_for (pid);
|
r = wait_for (pid);
|
||||||
|
|
||||||
/* POSIX.2: if we just waited for $!, we can remove the job from the
|
/* POSIX.2: we can remove the job from the jobs table if we just waited
|
||||||
jobs table. */
|
for it. */
|
||||||
if (pid == last_asynchronous_pid)
|
BLOCK_CHILD (set, oset);
|
||||||
{
|
if (job != NO_JOB && jobs[job] && DEADJOB (job))
|
||||||
BLOCK_CHILD (set, oset);
|
jobs[job]->flags |= J_NOTIFIED;
|
||||||
if (job != NO_JOB && jobs[job] && DEADJOB (job))
|
UNBLOCK_CHILD (oset);
|
||||||
jobs[job]->flags |= J_NOTIFIED;
|
|
||||||
UNBLOCK_CHILD (oset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
@ -1844,7 +1862,7 @@ notify_and_cleanup ()
|
||||||
void
|
void
|
||||||
reap_dead_jobs ()
|
reap_dead_jobs ()
|
||||||
{
|
{
|
||||||
mark_dead_jobs_as_notified ();
|
mark_dead_jobs_as_notified (0);
|
||||||
cleanup_dead_jobs ();
|
cleanup_dead_jobs ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2488,23 +2506,25 @@ notify_of_job_status ()
|
||||||
s = jobs[job]->pipe->status;
|
s = jobs[job]->pipe->status;
|
||||||
termsig = WTERMSIG (s);
|
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.
|
/* If job control is disabled, don't print the status messages.
|
||||||
Mark dead jobs as notified so that they get cleaned up. If
|
Mark dead jobs as notified so that they get cleaned up. If
|
||||||
startup_state == 2, we were started to run `-c command', so
|
startup_state == 2, we were started to run `-c command', so
|
||||||
don't print anything. If the shell is not interactive, don't
|
don't print anything. */
|
||||||
print anything unless the job was killed by a signal. */
|
if ((job_control == 0 && interactive_shell) || startup_state == 2)
|
||||||
if ((job_control == 0 && interactive_shell) || startup_state == 2 ||
|
|
||||||
(startup_state == 0 && WIFSIGNALED (s) == 0))
|
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
if (DEADJOB (job))
|
|
||||||
#else
|
|
||||||
/* POSIX.2 compatibility: if the shell is not interactive,
|
/* POSIX.2 compatibility: if the shell is not interactive,
|
||||||
hang onto the job corresponding to the last asynchronous
|
hang onto the job corresponding to the last asynchronous
|
||||||
pid until the user has been notified of its status or does
|
pid until the user has been notified of its status or does
|
||||||
a `wait'. */
|
a `wait'. */
|
||||||
if (DEADJOB (job) && (interactive_shell || (find_last_pid (job) != last_asynchronous_pid)))
|
if (DEADJOB (job) && (interactive_shell || (find_last_pid (job) != last_asynchronous_pid)))
|
||||||
#endif
|
|
||||||
jobs[job]->flags |= J_NOTIFIED;
|
jobs[job]->flags |= J_NOTIFIED;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -2516,9 +2536,7 @@ notify_of_job_status ()
|
||||||
{
|
{
|
||||||
case JDEAD:
|
case JDEAD:
|
||||||
if (interactive_shell == 0 && termsig && WIFSIGNALED (s) &&
|
if (interactive_shell == 0 && termsig && WIFSIGNALED (s) &&
|
||||||
#if 1
|
|
||||||
termsig != SIGINT &&
|
termsig != SIGINT &&
|
||||||
#endif
|
|
||||||
#if defined (DONT_REPORT_SIGPIPE)
|
#if defined (DONT_REPORT_SIGPIPE)
|
||||||
termsig != SIGPIPE &&
|
termsig != SIGPIPE &&
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -2943,24 +2961,48 @@ nohup_all_jobs (running_only)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mark all dead jobs as notified, so delete_job () cleans them out
|
/* 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
|
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;
|
sigset_t set, oset;
|
||||||
|
|
||||||
if (job_slots)
|
if (job_slots)
|
||||||
{
|
{
|
||||||
BLOCK_CHILD (set, oset);
|
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++)
|
for (i = 0; i < job_slots; i++)
|
||||||
#if 0
|
{
|
||||||
if (jobs[i] && DEADJOB (i))
|
if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i) != last_asynchronous_pid)))
|
||||||
#else
|
{
|
||||||
if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i) != last_asynchronous_pid)))
|
jobs[i]->flags |= J_NOTIFIED;
|
||||||
#endif
|
if (force == 0 && --ndead <= CHILD_MAX)
|
||||||
jobs[i]->flags |= J_NOTIFIED;
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UNBLOCK_CHILD (oset);
|
UNBLOCK_CHILD (oset);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,13 @@ INSTALL_DATA = @INSTALL_DATA@
|
||||||
CC = @CC@
|
CC = @CC@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
|
ARFLAGS = @ARFLAGS@
|
||||||
RM = rm
|
RM = rm
|
||||||
CP = cp
|
CP = cp
|
||||||
MV = mv
|
MV = mv
|
||||||
|
|
||||||
|
SHELL = @MAKE_SHELL@
|
||||||
|
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
LOCAL_CFLAGS = @LOCAL_CFLAGS@
|
LOCAL_CFLAGS = @LOCAL_CFLAGS@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
|
@ -66,7 +69,7 @@ all: $(LIBRARY_NAME)
|
||||||
|
|
||||||
$(LIBRARY_NAME): $(OBJECTS)
|
$(LIBRARY_NAME): $(OBJECTS)
|
||||||
$(RM) -f $@
|
$(RM) -f $@
|
||||||
$(AR) cr $@ $(OBJECTS)
|
$(AR) $(ARFLAGS) $@ $(OBJECTS)
|
||||||
-test -n "$(RANLIB)" && $(RANLIB) $@
|
-test -n "$(RANLIB)" && $(RANLIB) $@
|
||||||
|
|
||||||
what-tar:
|
what-tar:
|
||||||
|
|
|
||||||
|
|
@ -25,10 +25,17 @@
|
||||||
#include "collsyms.h"
|
#include "collsyms.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#if defined (HAVE_STRING_H)
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
#endif /* HAVE_STRING_H */
|
||||||
|
|
||||||
static int gmatch ();
|
static int gmatch ();
|
||||||
static char *brackmatch ();
|
static char *brackmatch ();
|
||||||
#ifdef EXTENDED_GLOB
|
#ifdef EXTENDED_GLOB
|
||||||
static int extmatch ();
|
static int extmatch ();
|
||||||
|
static char *patscan ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined (isascii)
|
#if !defined (isascii)
|
||||||
|
|
@ -155,11 +162,17 @@ gmatch (string, se, pattern, pe, flags)
|
||||||
sc = n < se ? *n : '\0';
|
sc = n < se ? *n : '\0';
|
||||||
|
|
||||||
#ifdef EXTENDED_GLOB
|
#ifdef EXTENDED_GLOB
|
||||||
|
/* extmatch () will handle recursively calling gmatch, so we can
|
||||||
|
just return what extmatch() returns. */
|
||||||
if ((flags & FNM_EXTMATCH) && *p == '(' &&
|
if ((flags & FNM_EXTMATCH) && *p == '(' &&
|
||||||
(c == '+' || c == '*' || c == '?' || c == '@' || c == '!')) /* ) */
|
(c == '+' || c == '*' || c == '?' || c == '@' || c == '!')) /* ) */
|
||||||
/* extmatch () will handle recursively calling gmatch, so we can
|
{
|
||||||
just return what extmatch() returns. */
|
int lflags;
|
||||||
return (extmatch (c, n, se, p, pe, flags));
|
/* 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
|
#endif
|
||||||
|
|
||||||
switch (c)
|
switch (c)
|
||||||
|
|
@ -226,7 +239,23 @@ gmatch (string, se, pattern, pe, flags)
|
||||||
#ifdef EXTENDED_GLOB
|
#ifdef EXTENDED_GLOB
|
||||||
/* Handle ******(patlist) */
|
/* Handle ******(patlist) */
|
||||||
if ((flags & FNM_EXTMATCH) && c == '*' && *p == '(') /*)*/
|
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
|
#endif
|
||||||
if (p == pe)
|
if (p == pe)
|
||||||
break;
|
break;
|
||||||
|
|
@ -245,11 +274,24 @@ gmatch (string, se, pattern, pe, flags)
|
||||||
c1 = (unsigned char)((flags & FNM_NOESCAPE) == 0 && c == '\\') ? *p : c;
|
c1 = (unsigned char)((flags & FNM_NOESCAPE) == 0 && c == '\\') ? *p : c;
|
||||||
c1 = FOLD (c1);
|
c1 = FOLD (c1);
|
||||||
for (--p; n < se; ++n)
|
for (--p; n < se; ++n)
|
||||||
/* Only call fnmatch if the first character indicates a
|
{
|
||||||
possible match. */
|
/* Only call fnmatch if the first character indicates a
|
||||||
if ((c == '[' || FOLD (*n) == c1) &&
|
possible match. We can check the first character if
|
||||||
gmatch (n, se, p, pe, flags & ~FNM_PERIOD) == 0)
|
we're not doing an extended glob match. */
|
||||||
return (0);
|
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;
|
return FNM_NOMATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,8 @@ Cambridge, MA 02139, USA. */
|
||||||
#ifndef _FNMATCH_H
|
#ifndef _FNMATCH_H
|
||||||
#define _FNMATCH_H 1
|
#define _FNMATCH_H 1
|
||||||
|
|
||||||
|
#include "stdc.h"
|
||||||
|
|
||||||
/* We #undef these before defining them because some losing systems
|
/* We #undef these before defining them because some losing systems
|
||||||
(HP-UX A.08.07 for example) define these in <unistd.h>. */
|
(HP-UX A.08.07 for example) define these in <unistd.h>. */
|
||||||
#undef FNM_PATHNAME
|
#undef FNM_PATHNAME
|
||||||
|
|
@ -41,6 +43,6 @@ Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
/* Match STRING against the filename pattern PATTERN,
|
/* Match STRING against the filename pattern PATTERN,
|
||||||
returning zero if it matches, FNM_NOMATCH if not. */
|
returning zero if it matches, FNM_NOMATCH if not. */
|
||||||
extern int fnmatch();
|
extern int fnmatch __P((char *, char *, int));
|
||||||
|
|
||||||
#endif /* _FNMATCH_H */
|
#endif /* _FNMATCH_H */
|
||||||
|
|
|
||||||
|
|
@ -75,9 +75,9 @@
|
||||||
# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
|
# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
|
||||||
#endif /* _POSIX_SOURCE */
|
#endif /* _POSIX_SOURCE */
|
||||||
|
|
||||||
#if !defined (HAVE_BCOPY)
|
#if !defined (HAVE_BCOPY) && !defined (bcopy)
|
||||||
# define bcopy(s, d, n) ((void) memcpy ((d), (s), (n)))
|
# define bcopy(s, d, n) ((void) memcpy ((d), (s), (n)))
|
||||||
#endif /* !HAVE_BCOPY */
|
#endif /* !HAVE_BCOPY && !bcopy */
|
||||||
|
|
||||||
#if defined (SHELL)
|
#if defined (SHELL)
|
||||||
# include "posixstat.h"
|
# include "posixstat.h"
|
||||||
|
|
@ -251,7 +251,7 @@ glob_vector (pat, dir)
|
||||||
register struct dirent *dp;
|
register struct dirent *dp;
|
||||||
struct globval *lastlink;
|
struct globval *lastlink;
|
||||||
register struct globval *nextlink;
|
register struct globval *nextlink;
|
||||||
register char *nextname;
|
register char *nextname, *npat;
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
int lose, skip;
|
int lose, skip;
|
||||||
register char **name_vector;
|
register char **name_vector;
|
||||||
|
|
@ -297,32 +297,32 @@ glob_vector (pat, dir)
|
||||||
|
|
||||||
dirlen = strlen (dir);
|
dirlen = strlen (dir);
|
||||||
nextname = (char *)malloc (dirlen + strlen (pat) + 2);
|
nextname = (char *)malloc (dirlen + strlen (pat) + 2);
|
||||||
if (nextname == 0)
|
npat = (char *)malloc (strlen (pat) + 1);
|
||||||
|
if (nextname == 0 || npat == 0)
|
||||||
lose = 1;
|
lose = 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
strcpy (npat, pat);
|
||||||
|
dequote_pathname (npat);
|
||||||
|
|
||||||
strcpy (nextname, dir);
|
strcpy (nextname, dir);
|
||||||
nextname[dirlen++] = '/';
|
nextname[dirlen++] = '/';
|
||||||
strcpy (nextname + dirlen, pat);
|
strcpy (nextname + dirlen, npat);
|
||||||
|
|
||||||
if (GLOB_TESTNAME (nextname) >= 0)
|
if (GLOB_TESTNAME (nextname) >= 0)
|
||||||
{
|
{
|
||||||
free (nextname);
|
free (nextname);
|
||||||
nextlink = (struct globval *)alloca (sizeof (struct globval));
|
nextlink = (struct globval *)alloca (sizeof (struct globval));
|
||||||
nextlink->next = (struct globval *)0;
|
nextlink->next = (struct globval *)0;
|
||||||
nextname = (char *) malloc (strlen (pat) + 1);
|
lastlink = nextlink;
|
||||||
if (nextname == 0)
|
nextlink->name = npat;
|
||||||
lose = 1;
|
count = 1;
|
||||||
else
|
|
||||||
{
|
|
||||||
lastlink = nextlink;
|
|
||||||
nextlink->name = nextname;
|
|
||||||
strcpy (nextname, pat);
|
|
||||||
count = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
free (nextname);
|
{
|
||||||
|
free (nextname);
|
||||||
|
free (npat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
skip = 1;
|
skip = 1;
|
||||||
|
|
@ -379,6 +379,16 @@ glob_vector (pat, dir)
|
||||||
if (REAL_DIR_ENTRY (dp) == 0)
|
if (REAL_DIR_ENTRY (dp) == 0)
|
||||||
continue;
|
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 a dot must be explicity matched, check to see if they do. */
|
||||||
if (noglob_dot_filenames && dp->d_name[0] == '.' && pat[0] != '.' &&
|
if (noglob_dot_filenames && dp->d_name[0] == '.' && pat[0] != '.' &&
|
||||||
(pat[0] != '\\' || pat[1] != '.'))
|
(pat[0] != '\\' || pat[1] != '.'))
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,13 @@ INSTALL_DATA = @INSTALL_DATA@
|
||||||
CC = @CC@
|
CC = @CC@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
|
ARFLAGS = @ARFLAGS@
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
CP = cp
|
CP = cp
|
||||||
MV = mv
|
MV = mv
|
||||||
|
|
||||||
|
SHELL = @MAKE_SHELL@
|
||||||
|
|
||||||
PROFILE_FLAGS =
|
PROFILE_FLAGS =
|
||||||
|
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
|
|
@ -63,32 +66,32 @@ all: malloc
|
||||||
|
|
||||||
malloc: ${MALLOC_OBJS}
|
malloc: ${MALLOC_OBJS}
|
||||||
${RM} libmalloc.a
|
${RM} libmalloc.a
|
||||||
${AR} cr libmalloc.a ${MALLOC_OBJS}
|
${AR} ${ARFLAGS} libmalloc.a ${MALLOC_OBJS}
|
||||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||||
|
|
||||||
nmalloc: ${NMALLOC_OBJS}
|
nmalloc: ${NMALLOC_OBJS}
|
||||||
${RM} libmalloc.a
|
${RM} libmalloc.a
|
||||||
${AR} cr libmalloc.a ${NMALLOC_OBJS}
|
${AR} ${ARFLAGS} libmalloc.a ${NMALLOC_OBJS}
|
||||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||||
|
|
||||||
nmalloc2: ${NMALLOC2_OBJS}
|
nmalloc2: ${NMALLOC2_OBJS}
|
||||||
${RM} libmalloc.a
|
${RM} libmalloc.a
|
||||||
${AR} cr libmalloc.a ${NMALLOC2_OBJS}
|
${AR} ${ARFLAGS} libmalloc.a ${NMALLOC2_OBJS}
|
||||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||||
|
|
||||||
gmalloc: ${GMALLOC_OBJS}
|
gmalloc: ${GMALLOC_OBJS}
|
||||||
${RM} libmalloc.a
|
${RM} libmalloc.a
|
||||||
${AR} cr libmalloc.a ${GMALLOC_OBJS}
|
${AR} ${ARFLAGS} libmalloc.a ${GMALLOC_OBJS}
|
||||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||||
|
|
||||||
ngmalloc: ${NGMALLOC_OBJS}
|
ngmalloc: ${NGMALLOC_OBJS}
|
||||||
${RM} libmalloc.a
|
${RM} libmalloc.a
|
||||||
${AR} cr libmalloc.a ${NGMALLOC_OBJS}
|
${AR} ${ARFLAGS} libmalloc.a ${NGMALLOC_OBJS}
|
||||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||||
|
|
||||||
stubmalloc: ${STUB_OBJS}
|
stubmalloc: ${STUB_OBJS}
|
||||||
${RM} libmalloc.a
|
${RM} libmalloc.a
|
||||||
${AR} cr libmalloc.a ${STUB_OBJS}
|
${AR} ${ARFLAGS} libmalloc.a ${STUB_OBJS}
|
||||||
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
-test -n "$(RANLIB)" && $(RANLIB) libmalloc.a
|
||||||
|
|
||||||
alloca.o: $(srcdir)/$(ALLOCA_SOURCE)
|
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
|
enough room in the block for the new size. Range checking is always
|
||||||
done. */
|
done. */
|
||||||
union mhead {
|
union mhead {
|
||||||
double mh_align;
|
bits64_t mh_align; /* 8 */
|
||||||
struct {
|
struct {
|
||||||
char mi_alloc; /* ISALLOC or ISFREE */ /* 1 */
|
char mi_alloc; /* ISALLOC or ISFREE */ /* 1 */
|
||||||
char mi_index; /* index in nextf[] */ /* 1 */
|
char mi_index; /* index in nextf[] */ /* 1 */
|
||||||
|
|
@ -200,8 +200,8 @@ union mhead {
|
||||||
|
|
||||||
/* Access free-list pointer of a block.
|
/* Access free-list pointer of a block.
|
||||||
It is stored at block + sizeof (char *).
|
It is stored at block + sizeof (char *).
|
||||||
This is not a field in the mhead structure
|
This is not a field in the minfo structure member of union mhead
|
||||||
because we want sizeof (struct mhead)
|
because we want sizeof (union mhead)
|
||||||
to describe the overhead for when the block is in use,
|
to describe the overhead for when the block is in use,
|
||||||
and we do not want the free-list pointer to count in that. */
|
and we do not want the free-list pointer to count in that. */
|
||||||
|
|
||||||
|
|
@ -490,6 +490,8 @@ morecore_done:
|
||||||
#else
|
#else
|
||||||
# if defined (HAVE_POSIX_SIGNALS)
|
# if defined (HAVE_POSIX_SIGNALS)
|
||||||
sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
|
sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
|
||||||
|
# else
|
||||||
|
; /* nothing to do, but need a null statement before the brace */
|
||||||
# endif
|
# endif
|
||||||
#endif /* HAVE_BSD_SIGNALS */
|
#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