Imported from ../bash-4.0-rc1.tar.gz.
This commit is contained in:
parent
f1be666c7d
commit
3185942a52
666 changed files with 188710 additions and 54674 deletions
3
AUTHORS
3
AUTHORS
|
|
@ -125,6 +125,7 @@ builtins/let.def Chet Ramey, Brian Fox
|
||||||
builtins/history.def Brian Fox, Chet Ramey
|
builtins/history.def Brian Fox, Chet Ramey
|
||||||
builtins/jobs.def Brian Fox, Chet Ramey
|
builtins/jobs.def Brian Fox, Chet Ramey
|
||||||
builtins/kill.def Brian Fox, Chet Ramey
|
builtins/kill.def Brian Fox, Chet Ramey
|
||||||
|
builtins/mapfile.def Rocky Bernstein
|
||||||
builtins/mkbuiltins.c Brian Fox, Chet Ramey
|
builtins/mkbuiltins.c Brian Fox, Chet Ramey
|
||||||
builtins/pushd.def Brian Fox, Chet Ramey
|
builtins/pushd.def Brian Fox, Chet Ramey
|
||||||
builtins/read.def Brian Fox, Chet Ramey
|
builtins/read.def Brian Fox, Chet Ramey
|
||||||
|
|
@ -456,3 +457,5 @@ lib/sh/zread.c Chet Ramey
|
||||||
lib/sh/zwrite.c Chet Ramey
|
lib/sh/zwrite.c Chet Ramey
|
||||||
|
|
||||||
tests/posix-ifs.sh Glenn Fowler
|
tests/posix-ifs.sh Glenn Fowler
|
||||||
|
|
||||||
|
support/checkbashisms Julian Gilbey, Debian Linux team
|
||||||
|
|
|
||||||
624
CHANGES
624
CHANGES
|
|
@ -1,3 +1,627 @@
|
||||||
|
This document details the changes between this version, bash-4.0-rc1,
|
||||||
|
and the previous version, bash-4.0-beta2.
|
||||||
|
|
||||||
|
1. Changes to Bash
|
||||||
|
|
||||||
|
a. Fixed a bug that caused parsing errors when a $()-style command
|
||||||
|
substitution was follwed immediately by a quoted newline.
|
||||||
|
|
||||||
|
b. Fixed a bug that caused extended shell globbing patterns beginning with
|
||||||
|
`*(' to not work when used with pattern substitution word expansions.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
This document details the changes between this version, bash-4.0-beta2,
|
||||||
|
and the previous version, bash-4.0-beta.
|
||||||
|
|
||||||
|
1. Changes to Bash
|
||||||
|
|
||||||
|
a. Fixed a bug that caused failed word expansions to set $? but not
|
||||||
|
PIPESTATUS.
|
||||||
|
|
||||||
|
b. Changed filename completion to quote the tilde in a filename with a
|
||||||
|
leading tilde that exists in the current directory.
|
||||||
|
|
||||||
|
c. Fixed a bug that caused a file descriptor leak when performing
|
||||||
|
redirections attached to a compound command.
|
||||||
|
|
||||||
|
d. Fixed a bug that caused expansions of $@ and $* to not exit the shell if
|
||||||
|
the -u option was enabled and there were no posititional parameters.
|
||||||
|
|
||||||
|
e. Fixed a bug that resulted in bash not terminating immediately if a
|
||||||
|
terminating signal was received while performing output.
|
||||||
|
|
||||||
|
f. Fixed a bug that caused the shell to crash after creating 256 process
|
||||||
|
substitutions during word completion.
|
||||||
|
|
||||||
|
2. Changes to Readline
|
||||||
|
|
||||||
|
a. Fixed a bug that caused redisplay errors when using prompts with invisible
|
||||||
|
characters and numeric arguments to a command in a multibyte locale.
|
||||||
|
|
||||||
|
b. Fixed a bug that caused redisplay errors when using prompts with invisible
|
||||||
|
characters spanning more than two physical screen lines.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
This document details the changes between this version, bash-4.0-beta,
|
||||||
|
and the previous version, bash-4.0-beta.
|
||||||
|
|
||||||
|
1. Changes to Bash
|
||||||
|
|
||||||
|
a. Fixed a typo that caused a variable to be used before initialization
|
||||||
|
while parsing Posix-style command substitutions.
|
||||||
|
|
||||||
|
b. Fixed a bug that caused stray ^? when the expansion of a parameter used
|
||||||
|
as part of a pattern removal expansion is empty, but part of a non-
|
||||||
|
empty string.
|
||||||
|
|
||||||
|
c. Fixed a bug that could cause strings not converted to numbers by strtol
|
||||||
|
to be treated as if the conversion had been successful.
|
||||||
|
|
||||||
|
d. The `return' builtin now accepts no options and requires a `--' before
|
||||||
|
a negative return value, as Posix requires.
|
||||||
|
|
||||||
|
e. Fixed a bug that caused local variables to be created with the empty
|
||||||
|
string for a value rather than no value.
|
||||||
|
|
||||||
|
f. Changed behavior so the shell now acts as if it received an interrupt
|
||||||
|
when a pipeline is killed by SIGINT while executing a list.
|
||||||
|
|
||||||
|
g. Fixed a bug that caused `declare var' and `typeset var' to initialize
|
||||||
|
`var' to the empty string.
|
||||||
|
|
||||||
|
h. Changed `bind' builtin to print a warning but proceed if invoked when
|
||||||
|
line editing is not active.
|
||||||
|
|
||||||
|
i. Fixed a bug that caused the shell to exit when the `errexit' option is
|
||||||
|
set and a command in a pipeline returns a non-zero exit status.
|
||||||
|
|
||||||
|
j. Fixed a bug that caused the shell to not run the exit trap in a command
|
||||||
|
run with `bash -c' under some circumstances.
|
||||||
|
|
||||||
|
k. Fixed a bug that caused parser errors to occasionally not set $? when
|
||||||
|
running commands with `eval'.
|
||||||
|
|
||||||
|
l. Fixed a bug that caused stray control characters when evaluating compound
|
||||||
|
array assignments containing $'\x7f' escapes.
|
||||||
|
|
||||||
|
m. Fixed a bug that caused redirections involving file descriptor 10 as the
|
||||||
|
target to behave incorrectly.
|
||||||
|
|
||||||
|
n. Fixed a bug that could cause memory to be freed multiple times when
|
||||||
|
assigning to COMP_WORDBREAKS.
|
||||||
|
|
||||||
|
o. Fixed a bug that could cause NULL pointer dereferences when COMP_WORDBREAKS
|
||||||
|
was unset.
|
||||||
|
|
||||||
|
2. Changes to Readline
|
||||||
|
|
||||||
|
3. New Features in Bash
|
||||||
|
|
||||||
|
a. A value of 0 for the -t option to `read' now returns success if there is
|
||||||
|
input available to be read from the specified file descriptor.
|
||||||
|
|
||||||
|
b. CDPATH and GLOBIGNORE are ignored when the shell is running in privileged
|
||||||
|
mode.
|
||||||
|
|
||||||
|
c. New bindable readline functions shell-forward-word and shell-backward-word,
|
||||||
|
which move forward and backward words delimited by shell metacharacters
|
||||||
|
and honor shell quoting.
|
||||||
|
|
||||||
|
d. New bindable readline functions shell-backward-kill-word and shell-kill-word
|
||||||
|
which kill words backward and forward, but use the same word boundaries
|
||||||
|
as shell-forward-word and shell-backward-word.
|
||||||
|
|
||||||
|
4. New Features in Readline
|
||||||
|
|
||||||
|
a. If the kernel supports it, readline displays special characters
|
||||||
|
corresponding to a keyboard-generated signal when the signal is received.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
This document details the changes between this version, bash-4.0-alpha,
|
||||||
|
and the previous version, bash-3.2-release.
|
||||||
|
|
||||||
|
1. Changes to Bash
|
||||||
|
|
||||||
|
a. Fixed several bugs in old-style `` command substitution parsing, including
|
||||||
|
comment parsing and quoted string handling.
|
||||||
|
|
||||||
|
b. Fixed problems parsing arguments to the [[ command's =~ regular expression
|
||||||
|
matching operator: metacharacter and whitespace parsing.
|
||||||
|
|
||||||
|
c. Fixed a bug that caused the shell to inappropriately reuse high-numbered
|
||||||
|
file descriptors it used internally.
|
||||||
|
|
||||||
|
d. Fixed a bug in pattern replacement word expansions that caused a `/' as
|
||||||
|
the first character of an expanded pattern to be mistaken for a global
|
||||||
|
replacement specifier.
|
||||||
|
|
||||||
|
e. Fixed several problems with the asprintf and snprintf replacement functions
|
||||||
|
that caused hangs and crashes.
|
||||||
|
|
||||||
|
f. Fixed a bug in the calculation of the current and previous job that caused
|
||||||
|
it to refer to incorrect jobs.
|
||||||
|
|
||||||
|
g. Fixed a bug in the check for the validity of a hashed command pathname that
|
||||||
|
caused unnecessary hash table deletions and additions.
|
||||||
|
|
||||||
|
h. Fixed a bug that caused child processes to inherit the wrong value for $!.
|
||||||
|
|
||||||
|
i. Fixed a bug that caused `.' to fail to read and execute commands from non-
|
||||||
|
regular files such as devices or named pipes.
|
||||||
|
|
||||||
|
j. Fixed a bug in printf formatting for the %x and %X expansions that occurred
|
||||||
|
on some systems.
|
||||||
|
|
||||||
|
k. Fixed a bug that caused the shell to crash when creating temporary files if
|
||||||
|
$TMPDIR named a non-writable directory.
|
||||||
|
|
||||||
|
l. Fixed a bug that caused the shell to ignore $TMPDIR when creating temporary
|
||||||
|
files under some circumstances.
|
||||||
|
|
||||||
|
m. Fixed a bug that caused named pipes created by process substitution to not
|
||||||
|
be cleaned up.
|
||||||
|
|
||||||
|
n. Fixed a bug that caused HISTTIMEFORMAT to not be honored when it appeared
|
||||||
|
in the initial shell environment.
|
||||||
|
|
||||||
|
o. Fixed several bugs in the expansion of $* and $@ (quoted and unquoted)
|
||||||
|
when IFS is null or contains non-whitespace characters; the same changes
|
||||||
|
apply to arrays subscripted with * or @.
|
||||||
|
|
||||||
|
p. Fixed several problems with pattern substitution expansions on the
|
||||||
|
positional parameters and arrays subscripted with * or @ that occurred
|
||||||
|
when $IFS was set to the empty string.
|
||||||
|
|
||||||
|
q. Made a change to the default locale initialization code that should
|
||||||
|
result in better behavior from the locale-aware library functions.
|
||||||
|
|
||||||
|
r. Fixed a bug that caused compacting the jobs list to drop jobs.
|
||||||
|
|
||||||
|
s. Fixed a bug that caused jumps back to the top-level processing loop from
|
||||||
|
a builtin command to leave the shell in an inconsistent state.
|
||||||
|
|
||||||
|
t. Fixed a bug that caused characters that would be escaped internally to be
|
||||||
|
doubled when escaped with a backslash.
|
||||||
|
|
||||||
|
u. Fixed the initialization of mailboxes to not cause maildirs to be read
|
||||||
|
(and stat(2) called for every message file) at shell startup.
|
||||||
|
|
||||||
|
v. Fixed a bug that caused the shell to not display $PS2 when the read builtin
|
||||||
|
reads a line continued with a backslash.
|
||||||
|
|
||||||
|
w. Fixed a bug that caused errors in word splitting when $IFS contained
|
||||||
|
characters used for internal quoting.
|
||||||
|
|
||||||
|
x. Fixed bugs that caused problems with output from shell builtins not being
|
||||||
|
completely displayed on some systems.
|
||||||
|
|
||||||
|
y. Fixed a bug that caused output to be lost when a redirection is acting on
|
||||||
|
the shell's output file descriptor.
|
||||||
|
|
||||||
|
z. Fixed bugs caused by shell builtins not checking for all write errors.
|
||||||
|
|
||||||
|
aa. Fixed a problem that caused the shell to dump core if expansions on the
|
||||||
|
pattern passed to the pattern removal word expansions resulted in expansion
|
||||||
|
errors.
|
||||||
|
|
||||||
|
bb. Fixed a bug that caused bash to loop infinitely after creating and
|
||||||
|
waiting for 4096 jobs.
|
||||||
|
|
||||||
|
cc. Fixed a bug that caused bash to lose the status of a background job under
|
||||||
|
certain circumstances.
|
||||||
|
|
||||||
|
dd. Fixed a bug that caused bash to not look in the temporary environment
|
||||||
|
when performing variable lookup under certain circumstances.
|
||||||
|
|
||||||
|
ee. Fixed a bug that caused bash to close file descriptors greater than 10
|
||||||
|
when they were used in redirections.
|
||||||
|
|
||||||
|
ff. Fixed a problem that caused the shell to attempt to read from the standard
|
||||||
|
input when called as `bash -i script'.
|
||||||
|
|
||||||
|
gg. Fixed a memory leak and variable initialization problems when the -v option
|
||||||
|
was supplied to `printf' that could cause incorrect results.
|
||||||
|
|
||||||
|
hh. Fixed a bug that caused the `read' builtin to count bytes when the -n option
|
||||||
|
was supplied, rather than (possibly multibyte) characters.
|
||||||
|
|
||||||
|
ii. Fixed a bug when displaying a function due to not converting the function
|
||||||
|
to an external form.
|
||||||
|
|
||||||
|
jj. Changed job control initialization to ensure that the shell has a tty
|
||||||
|
as its controlling terminal before enabling job control.
|
||||||
|
|
||||||
|
kk. Fixed a bug with the `test' builtin that caused it to misinterpret
|
||||||
|
arguments beginning with `-' but containing more than one character.
|
||||||
|
|
||||||
|
ll. Fixed bug that could cause the shell to dump core in certain cases where
|
||||||
|
a command sets the SIGINT disposition to the default.
|
||||||
|
|
||||||
|
mm. Fixed a bug in the pattern replacement (affecting both word expansion
|
||||||
|
and the `fc' builtin) that occurred when the pattern and replacement
|
||||||
|
strings were empty.
|
||||||
|
|
||||||
|
nn. Fixed a bug that caused an arithmetic evaluation error to disable all
|
||||||
|
further evaluation.
|
||||||
|
|
||||||
|
oo. Fixed a bug in pathname expansion that caused it to interpret backslashes
|
||||||
|
in the pathname as quoting characters.
|
||||||
|
|
||||||
|
pp. Fixed a bug in the replacement getcwd() implementation that could cause
|
||||||
|
memory to be overwritten.
|
||||||
|
|
||||||
|
qq. When in Posix mode, the `ulimit' builtin now uses a block size of 512 for
|
||||||
|
the `-c' and `-f' options.
|
||||||
|
|
||||||
|
rr. Brace expansion now allows process substitutions to pass through unchanged.
|
||||||
|
|
||||||
|
ss. Fixed a problem in the command name completion code to avoid quoting
|
||||||
|
escaped special characters twice when the command name begins with a tilde.
|
||||||
|
|
||||||
|
tt. Fixed a problem in the printf builtin that resulted in single-byte
|
||||||
|
output for the "'" escape, even when using multibyte characters.
|
||||||
|
|
||||||
|
uu. Fixed a bug that caused the failure exit status to be lost when redirections
|
||||||
|
attached to a compound command failed.
|
||||||
|
|
||||||
|
vv. Fixed a bug that caused the internal random number generator to not be
|
||||||
|
re-seeded correctly when creating a subshell.
|
||||||
|
|
||||||
|
ww. Fixed a bug that could cause the bash replacement getcwd to overwrite
|
||||||
|
memory.
|
||||||
|
|
||||||
|
xx. Fixed a bug that caused the shell to not receive SIGINT if it was sent
|
||||||
|
while the shell was waiting for a command substitution to terminate, and
|
||||||
|
make sure the exit status is correct when it does.
|
||||||
|
|
||||||
|
yy. Fixed a bug that resulted in the second and subsequent children spawned
|
||||||
|
by a shell begun to run a command substitution being placed into the
|
||||||
|
wrong process group.
|
||||||
|
|
||||||
|
zz. Fixed a bug that caused the results of successful tilde expansion to be
|
||||||
|
subject to pathname expansion and word splitting.
|
||||||
|
|
||||||
|
aaa. Fixed a bug that could cause the shell to hang if it encountered an
|
||||||
|
error that caused it to jump back to the top processing loop during a
|
||||||
|
command substitution or `eval' command.
|
||||||
|
|
||||||
|
bbb. Fixed a bug that caused the `read' builtin to use the tty's attributes
|
||||||
|
instead of those of the file descriptor passed with the -u option when
|
||||||
|
processing the -n and -d options.
|
||||||
|
|
||||||
|
ccc. Fixed a bug that caused incorrect expansion of ${array[@]:foo} if the
|
||||||
|
first character of $IFS was not whitespace.
|
||||||
|
|
||||||
|
ddd. Fixed a bug that occurred when scanning for the ending delimiter of a
|
||||||
|
${parameter/pat/sub} expansion.
|
||||||
|
|
||||||
|
eee. Fixed a bug that caused the shell to inappropriately expand command
|
||||||
|
substitutions in words when expanding directory names for completion.
|
||||||
|
|
||||||
|
fff. Fixed a bug that caused the `fc' builtin to look too far back in the
|
||||||
|
history list under certain circumstances.
|
||||||
|
|
||||||
|
ggg. Fixed a bug that caused a shell running in Posix mode to search $PWD for
|
||||||
|
a file specified as an argument to source/. when the file was not found
|
||||||
|
in $PATH.
|
||||||
|
|
||||||
|
hhh. Fixed a bug that caused the shell to modify the case of a command word
|
||||||
|
found via command completion when the shell was performing case-
|
||||||
|
insensitive completion.
|
||||||
|
|
||||||
|
iii. Fixed a bug that caused the shell to search $PATH for an argument to
|
||||||
|
source/. even when it contained a `/'.
|
||||||
|
|
||||||
|
jjj. Fixed a bug that caused brace expansion to misorder expansions when the
|
||||||
|
locale did not have a collating order like aAbBcC...zZ.
|
||||||
|
|
||||||
|
kkk. Fixed a bug that did not allow `set +o history' to have any effect when
|
||||||
|
run in a startup file or from a sourced file.
|
||||||
|
|
||||||
|
lll. Fixed a bug with the precedence of the ?: conditional arithmetic operator.
|
||||||
|
|
||||||
|
mmm. Fixed a bug that caused side effects of temporary variable assignments
|
||||||
|
to persist in the shell environment.
|
||||||
|
|
||||||
|
nnn. Fixed a bug that caused the terminal to be left in non-canonical mode
|
||||||
|
when using editing commands that invoke the an editor on the current
|
||||||
|
command line.
|
||||||
|
|
||||||
|
ooo. Fixed a bug that caused globbing characters and characters in $IFS to not
|
||||||
|
be quoted appropriately when displaying assignment statements.
|
||||||
|
|
||||||
|
ppp. Fixed a bug that caused the `-e' option to be inherited when sourcing a
|
||||||
|
file or evaluating a command with `eval' even if the return value of the
|
||||||
|
command was supposed to be ignored.
|
||||||
|
|
||||||
|
qqq. Fixed a bug that caused the shell to attempt to created variables with
|
||||||
|
invalid names if such names appeared in the initial environment.
|
||||||
|
|
||||||
|
rrr. Fixed a bug with quote removal in strings where the final character is a
|
||||||
|
backslash.
|
||||||
|
|
||||||
|
sss. Fixed a bug that caused the effects of special variables to persist even
|
||||||
|
when the variables were unset as part of the shell reinitializing itself
|
||||||
|
to execute a shell script.
|
||||||
|
|
||||||
|
ttt. Fixed a bug that caused the history to not be saved after `history -c' or
|
||||||
|
`history -d' was executed until a sufficient number of commands had been
|
||||||
|
saved to the history.
|
||||||
|
|
||||||
|
uuu. Bash now parses command substitutions according to Posix rules: parsing
|
||||||
|
the command contained in $() to find the closing delimiter.
|
||||||
|
|
||||||
|
vvv. Fixed a bug that caused traps on SIGCHLD set in a SIGCHLD handler to
|
||||||
|
not persist.
|
||||||
|
|
||||||
|
www. Fixed a bug that didn't allow SIGCHLD to interrupt the `wait' builtin
|
||||||
|
as Posix specifies.
|
||||||
|
|
||||||
|
xxx. Invalid numeric arguments to shell builtins no longer cause the shell to
|
||||||
|
short-circuit any executing compound command.
|
||||||
|
|
||||||
|
yyy. Fixed a bug that caused the exit status to be lost when `break' was
|
||||||
|
used to short-circuit a loop's execution.
|
||||||
|
|
||||||
|
zzz. Fixed a bug that caused stray ^? characters to be left in expansions of
|
||||||
|
"${array[*]}".
|
||||||
|
|
||||||
|
aaaa. Bash now prints better error messages for here documents terminated by
|
||||||
|
EOF and for identifying the incorrect token in an invalid arithmetic
|
||||||
|
expression.
|
||||||
|
|
||||||
|
bbbb. Fixed a bug in the variable length word expansion that caused it to
|
||||||
|
incorrectly calculate the number of multibyte characters.
|
||||||
|
|
||||||
|
cccc. Fixed a race condition that could result in the top-level shell setting
|
||||||
|
the terminal's process group to an incorrect value if the process
|
||||||
|
group was changed by a child of a child of the shell.
|
||||||
|
|
||||||
|
dddd. Fixed a bug that caused here documents belonging to commands within a
|
||||||
|
compound command to be displayed in a syntactially-incorrect form, which
|
||||||
|
prevented them from being re-read as input.
|
||||||
|
|
||||||
|
eeee. The shell displays more warnings about failures to set the locale.
|
||||||
|
|
||||||
|
ffff. Fixed a bug that caused the body of a here-document to not be saved to
|
||||||
|
the history list.
|
||||||
|
|
||||||
|
gggg. Fixed a bug that caused configure to incorrectly conclude that FreeBSD
|
||||||
|
had /dev/fd available, resulting in problems with process substitution.
|
||||||
|
|
||||||
|
2. Changes to Readline
|
||||||
|
|
||||||
|
a. Fixed a number of redisplay errors in environments supporting multibyte
|
||||||
|
characters.
|
||||||
|
|
||||||
|
b. Fixed bugs in vi command mode that caused motion commands to inappropriately
|
||||||
|
set the mark.
|
||||||
|
|
||||||
|
c. When using the arrow keys in vi insertion mode, readline allows movement
|
||||||
|
beyond the current end of the line (unlike command mode).
|
||||||
|
|
||||||
|
d. Fixed bugs that caused readline to loop when the terminal has been taken
|
||||||
|
away and reads return -1/EIO.
|
||||||
|
|
||||||
|
e. Fixed bugs in redisplay occurring when displaying prompts containing
|
||||||
|
invisible characters.
|
||||||
|
|
||||||
|
f. Fixed a bug that caused the completion append character to not be reset to
|
||||||
|
the default after an application-specified completion function changed it.
|
||||||
|
|
||||||
|
g. Fixed a problem that caused incorrect positioning of the cursor while in
|
||||||
|
emacs editing mode when moving forward at the end of a line while using
|
||||||
|
a locale supporting multibyte characters.
|
||||||
|
|
||||||
|
h. Fixed an off-by-one error that caused readline to drop every 511th
|
||||||
|
character of buffered input.
|
||||||
|
|
||||||
|
i. Fixed a bug that resulted in SIGTERM not being caught or cleaned up.
|
||||||
|
|
||||||
|
j. Fixed redisplay bugs caused by multiline prompts with invisible characters
|
||||||
|
or no characters following the final newline.
|
||||||
|
|
||||||
|
k. Fixed redisplay bug caused by prompts consisting solely of invisible
|
||||||
|
characters.
|
||||||
|
|
||||||
|
l. Fixed a bug in the code that buffers characters received very quickly in
|
||||||
|
succession which caused characters to be dropped.
|
||||||
|
|
||||||
|
m. Fixed a bug that caused readline to reference uninitialized data structures
|
||||||
|
if it received a SIGWINCH before completing initialzation.
|
||||||
|
|
||||||
|
n. Fixed a bug that caused the vi-mode `last command' to be set incorrectly
|
||||||
|
and therefore unrepeatable.
|
||||||
|
|
||||||
|
o. Fixed a bug that caused readline to disable echoing when it was being used
|
||||||
|
with an output file descriptor that was not a terminal.
|
||||||
|
|
||||||
|
p. Readline now blocks SIGINT while manipulating internal data structures
|
||||||
|
during redisplay.
|
||||||
|
|
||||||
|
q. Fixed a bug in redisplay that caused readline to segfault when pasting a
|
||||||
|
very long line (over 130,000 characters).
|
||||||
|
|
||||||
|
r. Fixed bugs in redisplay when using prompts with no visible printing
|
||||||
|
characters.
|
||||||
|
|
||||||
|
3. New Features in Bash
|
||||||
|
|
||||||
|
a. When using substring expansion on the positional parameters, a starting
|
||||||
|
index of 0 now causes $0 to be prefixed to the list.
|
||||||
|
|
||||||
|
b. The `help' builtin now prints its columns with entries sorted vertically
|
||||||
|
rather than horizontally.
|
||||||
|
|
||||||
|
c. There is a new variable, $BASHPID, which always returns the process id of
|
||||||
|
the current shell.
|
||||||
|
|
||||||
|
d. There is a new `autocd' option that, when enabled, causes bash to attempt
|
||||||
|
to `cd' to a directory name that is supplied as the first word of a
|
||||||
|
simple command.
|
||||||
|
|
||||||
|
e. There is a new `checkjobs' option that causes the shell to check for and
|
||||||
|
report any running or stopped jobs at exit.
|
||||||
|
|
||||||
|
f. The programmable completion code exports a new COMP_TYPE variable, set to
|
||||||
|
a character describing the type of completion being attempted.
|
||||||
|
|
||||||
|
g. The programmable completion code exports a new COMP_KEY variable, set to
|
||||||
|
the character that caused the completion to be invoked (e.g., TAB).
|
||||||
|
|
||||||
|
h. If creation of a child process fails due to insufficient resources, bash
|
||||||
|
will try again several times before reporting failure.
|
||||||
|
|
||||||
|
i. The programmable completion code now uses the same set of characters as
|
||||||
|
readline when breaking the command line into a list of words.
|
||||||
|
|
||||||
|
j. The block multiplier for the ulimit -c and -f options is now 512 when in
|
||||||
|
Posix mode, as Posix specifies.
|
||||||
|
|
||||||
|
k. Changed the behavior of the read builtin to save any partial input received
|
||||||
|
in the specified variable when the read builtin times out. This also
|
||||||
|
results in variables specified as arguments to read to be set to the empty
|
||||||
|
string when there is no input available. When the read builtin times out,
|
||||||
|
it returns an exit status greater than 128.
|
||||||
|
|
||||||
|
l. The shell now has the notion of a `compatibility level', controlled by
|
||||||
|
new variables settable by `shopt'. Setting this variable currently
|
||||||
|
restores the bash-3.1 behavior when processing quoted strings on the rhs
|
||||||
|
of the `=~' operator to the `[[' command.
|
||||||
|
|
||||||
|
m. The `ulimit' builtin now has new -b (socket buffer size) and -T (number
|
||||||
|
of threads) options.
|
||||||
|
|
||||||
|
n. The -p option to `declare' now displays all variable values and attributes
|
||||||
|
(or function values and attributes if used with -f).
|
||||||
|
|
||||||
|
o. There is a new `compopt' builtin that allows completion functions to modify
|
||||||
|
completion options for existing completions or the completion currently
|
||||||
|
being executed.
|
||||||
|
|
||||||
|
p. The `read' builtin has a new -i option which inserts text into the reply
|
||||||
|
buffer when using readline.
|
||||||
|
|
||||||
|
q. A new `-E' option to the complete builtin allows control of the default
|
||||||
|
behavior for completion on an empty line.
|
||||||
|
|
||||||
|
r. There is now limited support for completing command name words containing
|
||||||
|
globbing characters.
|
||||||
|
|
||||||
|
s. Changed format of internal help documentation for all builtins to roughly
|
||||||
|
follow man page format.
|
||||||
|
|
||||||
|
t. The `help' builtin now has a new -d option, to display a short description,
|
||||||
|
and a -m option, to print help information in a man page-like format.
|
||||||
|
|
||||||
|
u. There is a new `mapfile' builtin to populate an array with lines from a
|
||||||
|
given file.
|
||||||
|
|
||||||
|
v. If a command is not found, the shell attempts to execute a shell function
|
||||||
|
named `command_not_found_handle', supplying the command words as the
|
||||||
|
function arguments.
|
||||||
|
|
||||||
|
w. There is a new shell option: `globstar'. When enabled, the globbing code
|
||||||
|
treats `**' specially -- it matches all directories (and files within
|
||||||
|
them, when appropriate) recursively.
|
||||||
|
|
||||||
|
x. There is a new shell option: `dirspell'. When enabled, the filename
|
||||||
|
completion code performs spelling correction on directory names during
|
||||||
|
completion.
|
||||||
|
|
||||||
|
y. The `-t' option to the `read' builtin now supports fractional timeout
|
||||||
|
values.
|
||||||
|
|
||||||
|
z. Brace expansion now allows zero-padding of expanded numeric values and
|
||||||
|
will add the proper number of zeroes to make sure all values contain the
|
||||||
|
same number of digits.
|
||||||
|
|
||||||
|
aa. There is a new bash-specific bindable readline function: `dabbrev-expand'.
|
||||||
|
It uses menu completion on a set of words taken from the history list.
|
||||||
|
|
||||||
|
bb. The command assigned to a key sequence with `bind -x' now sets two new
|
||||||
|
variables in the environment of the executed command: READLINE_LINE_BUFFER
|
||||||
|
and READLINE_POINT. The command can change the current readline line
|
||||||
|
and cursor position by modifying READLINE_LINE_BUFFER and READLINE_POINT,
|
||||||
|
respectively.
|
||||||
|
|
||||||
|
cc. There is a new >>& redirection operator, which appends the standard output
|
||||||
|
and standard error to the named file.
|
||||||
|
|
||||||
|
dd. The parser now understands `|&' as a synonym for `2>&1 |', which redirects
|
||||||
|
the standard error for a command through a pipe.
|
||||||
|
|
||||||
|
ee. The new `;&' case statement action list terminator causes execution to
|
||||||
|
continue with the action associated with the next pattern in the
|
||||||
|
statement rather than terminating the command.
|
||||||
|
|
||||||
|
ff. The new `;;&' case statement action list terminator causes the shell to
|
||||||
|
test the next set of patterns after completing execution of the current
|
||||||
|
action, rather than terminating the command.
|
||||||
|
|
||||||
|
gg. The shell understands a new variable: PROMPT_DIRTRIM. When set to an
|
||||||
|
integer value greater than zero, prompt expansion of \w and \W will
|
||||||
|
retain only that number of trailing pathname components and replace
|
||||||
|
the intervening characters with `...'.
|
||||||
|
|
||||||
|
hh. There are new case-modifying word expansions: uppercase (^[^]) and
|
||||||
|
lowercase (,[,]). They can work on either the first character or
|
||||||
|
array element, or globally. They accept an optional shell pattern
|
||||||
|
that determines which characters to modify. There is an optionally-
|
||||||
|
configured feature to include capitalization operators.
|
||||||
|
|
||||||
|
ii. The shell provides associative array variables, with the appropriate
|
||||||
|
support to create, delete, assign values to, and expand them.
|
||||||
|
|
||||||
|
jj. The `declare' builtin now has new -l (convert value to lowercase upon
|
||||||
|
assignment) and -u (convert value to uppercase upon assignment) options.
|
||||||
|
There is an optionally-configurable -c option to capitalize a value at
|
||||||
|
assignment.
|
||||||
|
|
||||||
|
kk. There is a new `coproc' reserved word that specifies a coprocess: an
|
||||||
|
asynchronous command run with two pipes connected to the creating shell.
|
||||||
|
Coprocs can be named. The input and output file descriptors and the
|
||||||
|
PID of the coprocess are available to the calling shell in variables
|
||||||
|
with coproc-specific names.
|
||||||
|
|
||||||
|
4. New Features in Readline
|
||||||
|
|
||||||
|
a. A new variable, rl_sort_completion_matches; allows applications to inhibit
|
||||||
|
match list sorting (but beware: some things don't work right if
|
||||||
|
applications do this).
|
||||||
|
|
||||||
|
b. A new variable, rl_completion_invoking_key; allows applications to discover
|
||||||
|
the key that invoked rl_complete or rl_menu_complete.
|
||||||
|
|
||||||
|
c. The functions rl_block_sigint and rl_release_sigint are now public and
|
||||||
|
available to calling applications who want to protect critical sections
|
||||||
|
(like redisplay).
|
||||||
|
|
||||||
|
d. The functions rl_save_state and rl_restore_state are now public and
|
||||||
|
available to calling applications; documented rest of readline's state
|
||||||
|
flag values.
|
||||||
|
|
||||||
|
e. A new user-settable variable, `history-size', allows setting the maximum
|
||||||
|
number of entries in the history list.
|
||||||
|
|
||||||
|
f. There is a new implementation of menu completion, with several improvements
|
||||||
|
over the old; the most notable improvement is a better `completions
|
||||||
|
browsing' mode.
|
||||||
|
|
||||||
|
g. The menu completion code now uses the rl_menu_completion_entry_function
|
||||||
|
variable, allowing applications to provide their own menu completion
|
||||||
|
generators.
|
||||||
|
|
||||||
|
h. There is support for replacing a prefix of a pathname with a `...' when
|
||||||
|
displaying possible completions. This is controllable by setting the
|
||||||
|
`completion-prefix-display-length' variable. Matches with a common prefix
|
||||||
|
longer than this value have the common prefix replaced with `...'.
|
||||||
|
|
||||||
|
i. There is a new `revert-all-at-newline' variable. If enabled, readline will
|
||||||
|
undo all outstanding changes to all history lines when `accept-line' is
|
||||||
|
executed.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
This document details the changes between this version, bash-3.2-release,
|
This document details the changes between this version, bash-3.2-release,
|
||||||
and the previous version, bash-3.2-beta.
|
and the previous version, bash-3.2-beta.
|
||||||
|
|
||||||
|
|
|
||||||
45
COMPAT
45
COMPAT
|
|
@ -1,5 +1,5 @@
|
||||||
This document details the incompatibilities between this version of bash,
|
This document details the incompatibilities between this version of bash,
|
||||||
bash-3.2, and the previous widely-available versions, bash-1.14 (which is
|
bash-4.0, and the previous widely-available versions, bash-1.14 (which is
|
||||||
still the `standard' version for a few Linux distributions) and bash-2.x.
|
still the `standard' version for a few Linux distributions) and bash-2.x.
|
||||||
These were discovered by users of bash-2.x and 3.x, so this list is not
|
These were discovered by users of bash-2.x and 3.x, so this list is not
|
||||||
comprehensive. Some of these incompatibilities occur between the current
|
comprehensive. Some of these incompatibilities occur between the current
|
||||||
|
|
@ -271,5 +271,44 @@ bash-2.0 were significant.)
|
||||||
file permission bits obtained with stat(2). This obeys restrictions of
|
file permission bits obtained with stat(2). This obeys restrictions of
|
||||||
the file system (e.g., read-only or noexec mounts) not available via stat.
|
the file system (e.g., read-only or noexec mounts) not available via stat.
|
||||||
|
|
||||||
33. Beginning with bash-3.1/readline-5.1, the readline key binding code obeys
|
33. Bash-3.2 adopts the convention used by other string and pattern matching
|
||||||
the current setting of the `convert-meta' variable.
|
operators for the `[[' compound command, and matches any quoted portion
|
||||||
|
of the right-hand-side argument to the =~ operator as a string rather
|
||||||
|
than a regular expression.
|
||||||
|
|
||||||
|
34. Bash-4.0 allows the behavior in the previous item to be modified using
|
||||||
|
the notion of a shell `compatibility level'.
|
||||||
|
|
||||||
|
35. Bash-3.2 (patched) and Bash-4.0 fix a bug that leaves the shell in an
|
||||||
|
inconsistent internal state following an assignment error. One of the
|
||||||
|
changes means that compound commands or { ... } grouping commands are
|
||||||
|
aborted under some circumstances in which they previously were not.
|
||||||
|
This is what Posix specifies.
|
||||||
|
|
||||||
|
36. Bash-4.0 now allows process substitution constructs to pass unchanged
|
||||||
|
through brace expansion, so any expansion of the contents will have to be
|
||||||
|
separately specified, and each process subsitution will have to be
|
||||||
|
separately entered.
|
||||||
|
|
||||||
|
37. Bash-4.0 now allows SIGCHLD to interrupt the wait builtin, as Posix
|
||||||
|
specifies, so the SIGCHLD trap is no longer always invoked once per
|
||||||
|
exiting child if you are using `wait' to wait for all children.
|
||||||
|
|
||||||
|
38. Since bash-4.0 now follows Posix rules for finding the closing delimiter
|
||||||
|
of a $() command substitution, it will not behave as previous versions
|
||||||
|
did, but will catch more syntax and parsing errors before spawning a
|
||||||
|
subshell to evaluate the command substitution.
|
||||||
|
|
||||||
|
39. The programmable completion code uses the same set of delimiting characters
|
||||||
|
as readline when breaking the command line into words, rather than the
|
||||||
|
set of shell metacharacters, so programmable completion and readline
|
||||||
|
should be more consistent.
|
||||||
|
|
||||||
|
40. When the read builtin times out, it attempts to assign any input read to
|
||||||
|
specified variables, which also causes variables to be set to the empty
|
||||||
|
string if there is not enough input. Previous versions discarded the
|
||||||
|
characters read.
|
||||||
|
|
||||||
|
41. Beginning with bash-4.0, when one of the commands in a pipeline is killed
|
||||||
|
by a SIGINT while executing a command list, the shell acts as if it
|
||||||
|
received the interrupt.
|
||||||
|
|
|
||||||
851
COPYING
851
COPYING
|
|
@ -1,293 +1,626 @@
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
The Free Software Foundation has exempted Bash from the requirement of
|
|
||||||
Paragraph 2c of the General Public License. This is to say, there is
|
|
||||||
no requirement for Bash to print a notice when it is started
|
|
||||||
interactively in the usual way. We made this exception because users
|
|
||||||
and standards expect shells not to print such messages. This
|
|
||||||
exception applies to any program that serves as a shell and that is
|
|
||||||
based primarily on Bash as opposed to other GNU software.
|
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
The GNU General Public License is a free, copyleft license for
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
software and other kinds of works.
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
The licenses for most software and other practical works are designed
|
||||||
General Public License applies to most of the Free Software
|
to take away your freedom to share and change the works. By contrast,
|
||||||
Foundation's software and to any other program whose authors commit to
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
share and change all versions of a program--to make sure it remains free
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
have the freedom to distribute copies of free software (and charge for
|
have the freedom to distribute copies of free software (and charge for
|
||||||
this service if you wish), that you receive source code or can get it
|
them if you wish), that you receive source code or can get it if you
|
||||||
if you want it, that you can change the software or use pieces of it
|
want it, that you can change the software or use pieces of it in new
|
||||||
in new free programs; and that you know you can do these things.
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
To protect your rights, we need to prevent others from denying you
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
These restrictions translate to certain responsibilities for you if you
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
distribute copies of the software, or if you modify it.
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
For example, if you distribute copies of such a program, whether
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
you have. You must make sure that they, too, receive or can get the
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
source code. And you must show them these terms so they know their
|
or can get the source code. And you must show them these terms so they
|
||||||
rights.
|
know their rights.
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
distribute and/or modify the software.
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
that everyone understands that there is no warranty for this free
|
that there is no warranty for this free software. For both users' and
|
||||||
software. If the software is modified by someone else and passed on, we
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
want its recipients to know that what they have is not the original, so
|
changed, so that their problems will not be attributed erroneously to
|
||||||
that any problems introduced by others will not reflect on the original
|
authors of previous versions.
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
Some devices are designed to deny users access to install or run
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
modified versions of the software inside them, although the manufacturer
|
||||||
program will individually obtain patent licenses, in effect making the
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
protecting users' freedom to change the software. The systematic
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
TERMS AND CONDITIONS
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
0. Definitions.
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
of it, thus forming a work based on the Program, and copy and
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
distribute such modifications or work under the terms of Section 1
|
"recipients" may be individuals or organizations.
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
stating that you changed the files and the date of any change.
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
A "covered work" means either the unmodified Program or a work based
|
||||||
whole or in part contains or is derived from the Program or any
|
on the Program.
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
To "propagate" a work means to do anything with it that, without
|
||||||
when run, you must cause it, when started running for such
|
permission, would make you directly or secondarily liable for
|
||||||
interactive use in the most ordinary way, to print or display an
|
infringement under applicable copyright law, except executing it on a
|
||||||
announcement including an appropriate copyright notice and a
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
notice that there is no warranty (or else, saying that you provide
|
distribution (with or without modification), making available to the
|
||||||
a warranty) and that users may redistribute the program under
|
public, and in some countries other activities as well.
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
To "convey" a work means any kind of propagation that enables other
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
exercise the right to control the distribution of derivative or
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
to the extent that it includes a convenient and prominently visible
|
||||||
a storage or distribution medium does not bring the other work under
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
the scope of this License.
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
1. Source Code.
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
The "source code" for a work means the preferred form of the work
|
||||||
source code, which must be distributed under the terms of Sections
|
for making modifications to it. "Object code" means any non-source
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
form of a work.
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
A "Standard Interface" means an interface that either is an official
|
||||||
years, to give any third party, for a charge no more than your
|
standard defined by a recognized standards body, or, in the case of
|
||||||
cost of physically performing source distribution, a complete
|
interfaces specified for a particular programming language, one that
|
||||||
machine-readable copy of the corresponding source code, to be
|
is widely used among developers working in that language.
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
The "System Libraries" of an executable work include anything, other
|
||||||
to distribute corresponding source code. (This alternative is
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
allowed only for noncommercial distribution and only if you
|
packaging a Major Component, but which is not part of that Major
|
||||||
received the program in object code or executable form with such
|
Component, and (b) serves only to enable use of the work with that
|
||||||
an offer, in accord with Subsection b above.)
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
The "Corresponding Source" for a work in object code form means all
|
||||||
making modifications to it. For an executable work, complete source
|
the source code needed to generate, install, and (for an executable
|
||||||
code means all the source code for all modules it contains, plus any
|
work) run the object code and to modify the work, including scripts to
|
||||||
associated interface definition files, plus the scripts used to
|
control those activities. However, it does not include the work's
|
||||||
control compilation and installation of the executable. However, as a
|
System Libraries, or general-purpose tools or generally available free
|
||||||
special exception, the source code distributed need not include
|
programs which are used unmodified in performing those activities but
|
||||||
anything that is normally distributed (in either source or binary
|
which are not part of the work. For example, Corresponding Source
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
includes interface definition files associated with source files for
|
||||||
operating system on which the executable runs, unless that component
|
the work, and the source code for shared libraries and dynamically
|
||||||
itself accompanies the executable.
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
The Corresponding Source need not include anything that users
|
||||||
access to copy from a designated place, then offering equivalent
|
can regenerate automatically from other parts of the Corresponding
|
||||||
access to copy the source code from the same place counts as
|
Source.
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
The Corresponding Source for a work in source code form is that
|
||||||
signed it. However, nothing else grants you permission to modify or
|
same work.
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
2. Basic Permissions.
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
All rights granted under this License are granted for the term of
|
||||||
these terms and conditions. You may not impose any further
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
You are not responsible for enforcing compliance by third parties to
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
this License.
|
this License.
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
infringement or for any other reason (not limited to patent issues),
|
patent license under the contributor's essential patent claims, to
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
excuse you from the conditions of this License. If you cannot
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
License and any other pertinent obligations, then as a consequence you
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
may not distribute the Program at all. For example, if a patent
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
license would not permit royalty-free redistribution of the Program by
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
all those who receive copies directly or indirectly through you, then
|
the Program, the only way you could satisfy both those terms and this
|
||||||
the only way you could satisfy both it and this License would be to
|
License would be to refrain entirely from conveying the Program.
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
13. Use with the GNU Affero General Public License.
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
Notwithstanding any other provision of this License, you have
|
||||||
patents or other property right claims or to contest validity of any
|
permission to link or combine any covered work with a work licensed
|
||||||
such claims; this section has the sole purpose of protecting the
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
integrity of the free software distribution system, which is
|
combined work, and to convey the resulting work. The terms of this
|
||||||
implemented by public license practices. Many people have made
|
License will continue to apply to the part which is the covered work,
|
||||||
generous contributions to the wide range of software distributed
|
but the special requirements of the GNU Affero General Public License,
|
||||||
through that system in reliance on consistent application of that
|
section 13, concerning interaction through a network will apply to the
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
combination as such.
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
14. Revised Versions of this License.
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
of the General Public License from time to time. Such new versions will
|
the GNU General Public License from time to time. Such new versions will
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
address new problems or concerns.
|
address new problems or concerns.
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
Each version is given a distinguishing version number. If the
|
||||||
specifies a version number of this License which applies to it and "any
|
Program specifies that a certain numbered version of the GNU General
|
||||||
later version", you have the option of following the terms and conditions
|
Public License "or any later version" applies to it, you have the
|
||||||
either of that version or of any later version published by the Free
|
option of following the terms and conditions either of that numbered
|
||||||
Software Foundation. If the Program does not specify a version number of
|
version or of any later version published by the Free Software
|
||||||
this License, you may choose any version ever published by the Free Software
|
Foundation. If the Program does not specify a version number of the
|
||||||
Foundation.
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
If the Program specifies that a proxy can decide which future
|
||||||
programs whose distribution conditions are different, write to the author
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
public statement of acceptance of a version permanently authorizes you
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
to choose that version for the Program.
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
15. Disclaimer of Warranty.
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
Appendix: How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, the best way to achieve this is to make it
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
|
@ -295,15 +628,15 @@ free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
To do so, attach the following notices to the program. It is safest
|
||||||
to attach them to the start of each source file to most effectively
|
to attach them to the start of each source file to most effectively
|
||||||
convey the exclusion of warranty; and each file should have at least
|
state the exclusion of warranty; and each file should have at least
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
Copyright (C) 19yy <name of author>
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
|
|
@ -312,36 +645,30 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
If the program does terminal interaction, make it output a short
|
||||||
when it starts in an interactive mode:
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
<program> Copyright (C) <year> <name of author>
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
parts of the General Public License. Of course, the commands you use may
|
parts of the General Public License. Of course, your program's commands
|
||||||
be called something other than `show w' and `show c'; they could even be
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
necessary. Here is a sample; alter the names:
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
The GNU General Public License does not permit incorporating your program
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications with
|
||||||
<signature of Ty Coon>, 1 April 1989
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
Ty Coon, President of Vice
|
Public License instead of this License. But first, please read
|
||||||
|
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Library General
|
|
||||||
Public License instead of this License.
|
|
||||||
|
|
|
||||||
339
CWRU/audit-patch
Normal file
339
CWRU/audit-patch
Normal file
|
|
@ -0,0 +1,339 @@
|
||||||
|
Date: Tue, 06 Feb 2007 16:06:58 -0500
|
||||||
|
From: Steve Grubb <sgrubb@redhat.com>
|
||||||
|
Subject: Re: bash and linux audit
|
||||||
|
To: chet.ramey@case.edu
|
||||||
|
Organization: Red Hat
|
||||||
|
|
||||||
|
OK, I released audit 1.4 Sunday which has the logging function for user
|
||||||
|
commands. It produces audit events like this:
|
||||||
|
|
||||||
|
type=USER_CMD msg=audit(01/30/2007 18:23:45.793:143) : user pid=22862 uid=root
|
||||||
|
auid=root subj=system_u:system_r:unconfined_t:s0-s0:c0.c1023
|
||||||
|
msg='cwd=/root/test dir cmd=ls -l (terminal=tty1 res=success)'
|
||||||
|
|
||||||
|
diff -urp bash-3.2.orig/config-bot.h bash-3.2/config-bot.h
|
||||||
|
--- bash-3.2.orig/config-bot.h 2007-01-03 09:01:05.000000000 -0500
|
||||||
|
+++ bash-3.2/config-bot.h 2007-01-20 11:59:23.000000000 -0500
|
||||||
|
@@ -97,6 +97,11 @@
|
||||||
|
# define RESTRICTED_SHELL_NAME "rbash"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+/* If the shell is called by this name, it will become audited. */
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+# define AUDIT_SHELL_NAME "aubash"
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/***********************************************************/
|
||||||
|
/* Make sure feature defines have necessary prerequisites. */
|
||||||
|
/***********************************************************/
|
||||||
|
diff -urp bash-3.2.orig/config.h.in bash-3.2/config.h.in
|
||||||
|
--- bash-3.2.orig/config.h.in 2007-01-03 09:01:05.000000000 -0500
|
||||||
|
+++ bash-3.2/config.h.in 2007-01-20 11:59:23.000000000 -0500
|
||||||
|
@@ -81,6 +81,11 @@
|
||||||
|
flag. */
|
||||||
|
#undef RESTRICTED_SHELL
|
||||||
|
|
||||||
|
+/* Define AUDIT_SHELL if you want the generated shell to audit all
|
||||||
|
+ actions performed by root account. The shell thus generated can become
|
||||||
|
+ audited by being run with the name "aubash". */
|
||||||
|
+#undef AUDIT_SHELL
|
||||||
|
+
|
||||||
|
/* Define DISABLED_BUILTINS if you want "builtin foo" to always run the
|
||||||
|
shell builtin "foo", even if it has been disabled with "enable -n foo". */
|
||||||
|
#undef DISABLED_BUILTINS
|
||||||
|
diff -urp bash-3.2.orig/configure.in bash-3.2/configure.in
|
||||||
|
--- bash-3.2.orig/configure.in 2007-01-03 09:01:05.000000000 -0500
|
||||||
|
+++ bash-3.2/configure.in 2007-01-20 11:59:23.000000000 -0500
|
||||||
|
@@ -162,6 +162,7 @@ opt_history=yes
|
||||||
|
opt_bang_history=yes
|
||||||
|
opt_dirstack=yes
|
||||||
|
opt_restricted=yes
|
||||||
|
+opt_audit=yes
|
||||||
|
opt_process_subst=yes
|
||||||
|
opt_prompt_decoding=yes
|
||||||
|
opt_select=yes
|
||||||
|
@@ -195,8 +196,8 @@ dnl a minimal configuration turns everyt
|
||||||
|
dnl added individually
|
||||||
|
if test $opt_minimal_config = yes; then
|
||||||
|
opt_job_control=no opt_alias=no opt_readline=no
|
||||||
|
- opt_history=no opt_bang_history=no opt_dirstack=no
|
||||||
|
- opt_restricted=no opt_process_subst=no opt_prompt_decoding=no
|
||||||
|
+ opt_history=no opt_bang_history=no opt_dirstack=no opt_restricted=no
|
||||||
|
+ opt_audit=no opt_process_subst=no opt_prompt_decoding=no
|
||||||
|
opt_select=no opt_help=no opt_array_variables=no opt_dparen_arith=no
|
||||||
|
opt_brace_expansion=no opt_disabled_builtins=no opt_command_timing=no
|
||||||
|
opt_extended_glob=no opt_cond_command=no opt_arith_for_command=no
|
||||||
|
@@ -227,6 +228,7 @@ AC_ARG_ENABLE(progcomp, AC_HELP_STRING([
|
||||||
|
AC_ARG_ENABLE(prompt-string-decoding, AC_HELP_STRING([--enable-prompt-string-decoding], [turn on escape character decoding in prompts]), opt_prompt_decoding=$enableval)
|
||||||
|
AC_ARG_ENABLE(readline, AC_HELP_STRING([--enable-readline], [turn on command line editing]), opt_readline=$enableval)
|
||||||
|
AC_ARG_ENABLE(restricted, AC_HELP_STRING([--enable-restricted], [enable a restricted shell]), opt_restricted=$enableval)
|
||||||
|
+AC_ARG_ENABLE(audit, AC_HELP_STRING([--enable-audit], [enable an audited shell]), opt_audit=$enableval)
|
||||||
|
AC_ARG_ENABLE(select, AC_HELP_STRING([--enable-select], [include select command]), opt_select=$enableval)
|
||||||
|
AC_ARG_ENABLE(separate-helpfiles, AC_HELP_STRING([--enable-separate-helpfiles], [use external files for help builtin documentation]), opt_separate_help=$enableval)
|
||||||
|
AC_ARG_ENABLE(single-help-strings, AC_HELP_STRING([--enable-single-help-strings], [store help documentation as a single string to ease translation]), opt_single_longdoc_strings=$enableval)
|
||||||
|
@@ -254,6 +256,10 @@ fi
|
||||||
|
if test $opt_restricted = yes; then
|
||||||
|
AC_DEFINE(RESTRICTED_SHELL)
|
||||||
|
fi
|
||||||
|
+if test $opt_audit = yes; then
|
||||||
|
+AC_DEFINE(AUDIT_SHELL)
|
||||||
|
+AUDIT_LIB='-laudit'
|
||||||
|
+fi
|
||||||
|
if test $opt_process_subst = yes; then
|
||||||
|
AC_DEFINE(PROCESS_SUBSTITUTION)
|
||||||
|
fi
|
||||||
|
@@ -355,6 +361,8 @@ AC_SUBST(HELPDIRDEFINE)
|
||||||
|
AC_SUBST(HELPINSTALL)
|
||||||
|
AC_SUBST(HELPSTRINGS)
|
||||||
|
|
||||||
|
+AC_SUBST(AUDIT_LIB)
|
||||||
|
+
|
||||||
|
echo ""
|
||||||
|
echo "Beginning configuration for bash-$BASHVERS-$RELSTATUS for ${host_cpu}-${host_vendor}-${host_os}"
|
||||||
|
echo ""
|
||||||
|
diff -urp bash-3.2.orig/doc/bash.1 bash-3.2/doc/bash.1
|
||||||
|
--- bash-3.2.orig/doc/bash.1 2007-01-03 09:01:05.000000000 -0500
|
||||||
|
+++ bash-3.2/doc/bash.1 2007-01-20 11:59:23.000000000 -0500
|
||||||
|
@@ -155,6 +155,12 @@ single-character options to be recognize
|
||||||
|
.PP
|
||||||
|
.PD 0
|
||||||
|
.TP
|
||||||
|
+.B \-\-audit
|
||||||
|
+The shell logs all commands run by the root user (see
|
||||||
|
+.SM
|
||||||
|
+.B "AUDIT SHELL"
|
||||||
|
+below).
|
||||||
|
+.TP
|
||||||
|
.B \-\-debugger
|
||||||
|
Arrange for the debugger profile to be executed before the shell
|
||||||
|
starts.
|
||||||
|
@@ -8770,6 +8776,17 @@ turns off any restrictions in the shell
|
||||||
|
script.
|
||||||
|
.\" end of rbash.1
|
||||||
|
.if \n(zY=1 .ig zY
|
||||||
|
+.SH "AUDIT SHELL"
|
||||||
|
+.zY
|
||||||
|
+.PP
|
||||||
|
+If
|
||||||
|
+.B bash
|
||||||
|
+is started with the name
|
||||||
|
+.BR aubash ,
|
||||||
|
+or the
|
||||||
|
+.B \-\-audit
|
||||||
|
+option is supplied at invocation, the shell logs all commands issued by the root user to the audit system.
|
||||||
|
+.if \n(zY=1 .ig zY
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.PD 0
|
||||||
|
.TP
|
||||||
|
diff -urp bash-3.2.orig/eval.c bash-3.2/eval.c
|
||||||
|
--- bash-3.2.orig/eval.c 2007-01-03 09:01:06.000000000 -0500
|
||||||
|
+++ bash-3.2/eval.c 2007-01-20 11:59:23.000000000 -0500
|
||||||
|
@@ -45,6 +45,11 @@
|
||||||
|
# include "bashhist.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+# include <libaudit.h>
|
||||||
|
+# include <errno.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
extern int EOF_reached;
|
||||||
|
extern int indirection_level;
|
||||||
|
extern int posixly_correct;
|
||||||
|
@@ -58,6 +63,38 @@ extern int rpm_requires;
|
||||||
|
static void send_pwd_to_eterm __P((void));
|
||||||
|
static sighandler alrm_catcher __P((int));
|
||||||
|
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+static int audit_fd = -1;
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+audit_start ()
|
||||||
|
+{
|
||||||
|
+ audit_fd = audit_open ();
|
||||||
|
+ if (audit_fd < 0)
|
||||||
|
+ return -1;
|
||||||
|
+ else
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+audit (cmd, result)
|
||||||
|
+ char *cmd;
|
||||||
|
+ int result;
|
||||||
|
+{
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ if (audit_fd < 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ rc = audit_log_user_command (audit_fd, AUDIT_USER_CMD, cmd,
|
||||||
|
+ NULL, !result);
|
||||||
|
+ close (audit_fd);
|
||||||
|
+ audit_fd = -1;
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/* Read and execute commands until EOF is reached. This assumes that
|
||||||
|
the input source has already been initialized. */
|
||||||
|
int
|
||||||
|
@@ -145,7 +182,25 @@ reader_loop ()
|
||||||
|
|
||||||
|
executing = 1;
|
||||||
|
stdin_redir = 0;
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+ if (audited && interactive_shell && getuid () == 0)
|
||||||
|
+ {
|
||||||
|
+ if (audit_start () < 0)
|
||||||
|
+ {
|
||||||
|
+ if (errno != EINVAL && errno != EPROTONOSUPPORT &&
|
||||||
|
+ errno != EAFNOSUPPORT)
|
||||||
|
+ return EXECUTION_FAILURE;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
execute_command (current_command);
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+ {
|
||||||
|
+ extern char *shell_input_line;
|
||||||
|
+ audit (shell_input_line, last_command_exit_value);
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
exec_done:
|
||||||
|
QUIT;
|
||||||
|
diff -urp bash-3.2.orig/externs.h bash-3.2/externs.h
|
||||||
|
--- bash-3.2.orig/externs.h 2007-01-03 09:01:06.000000000 -0500
|
||||||
|
+++ bash-3.2/externs.h 2007-01-20 12:05:00.000000000 -0500
|
||||||
|
@@ -77,6 +77,10 @@ extern int shell_is_restricted __P((char
|
||||||
|
extern int maybe_make_restricted __P((char *));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+extern int maybe_make_audited __P((char *));
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
extern void unset_bash_input __P((int));
|
||||||
|
extern void get_current_user_info __P((void));
|
||||||
|
|
||||||
|
diff -urp bash-3.2.orig/flags.c bash-3.2/flags.c
|
||||||
|
--- bash-3.2.orig/flags.c 2007-01-03 09:01:06.000000000 -0500
|
||||||
|
+++ bash-3.2/flags.c 2007-01-20 11:59:23.000000000 -0500
|
||||||
|
@@ -142,6 +142,12 @@ int restricted = 0; /* currently restri
|
||||||
|
int restricted_shell = 0; /* shell was started in restricted mode. */
|
||||||
|
#endif /* RESTRICTED_SHELL */
|
||||||
|
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+/* Non-zero means that this shell is audited. An audited shell records
|
||||||
|
+ each command that the root user executes. */
|
||||||
|
+int audited = 0; /* shell was started in audit mode. */
|
||||||
|
+#endif /* AUDIT_SHELL */
|
||||||
|
+
|
||||||
|
/* Non-zero means that this shell is running in `privileged' mode. This
|
||||||
|
is required if the shell is to run setuid. If the `-p' option is
|
||||||
|
not supplied at startup, and the real and effective uids or gids
|
||||||
|
diff -urp bash-3.2.orig/flags.h bash-3.2/flags.h
|
||||||
|
--- bash-3.2.orig/flags.h 2007-01-03 09:01:06.000000000 -0500
|
||||||
|
+++ bash-3.2/flags.h 2007-01-20 11:59:23.000000000 -0500
|
||||||
|
@@ -66,6 +66,10 @@ extern int restricted;
|
||||||
|
extern int restricted_shell;
|
||||||
|
#endif /* RESTRICTED_SHELL */
|
||||||
|
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+extern int audited;
|
||||||
|
+#endif /* AUDIT_SHELL */
|
||||||
|
+
|
||||||
|
extern int *find_flag __P((int));
|
||||||
|
extern int change_flag __P((int, int));
|
||||||
|
extern char *which_set_flags __P((void));
|
||||||
|
Only in bash-3.2: .made
|
||||||
|
diff -urp bash-3.2.orig/Makefile.in bash-3.2/Makefile.in
|
||||||
|
--- bash-3.2.orig/Makefile.in 2007-01-03 09:01:06.000000000 -0500
|
||||||
|
+++ bash-3.2/Makefile.in 2007-01-20 11:59:23.000000000 -0500
|
||||||
|
@@ -366,6 +366,8 @@ MALLOC_LIBRARY = @MALLOC_LIBRARY@
|
||||||
|
MALLOC_LDFLAGS = @MALLOC_LDFLAGS@
|
||||||
|
MALLOC_DEP = @MALLOC_DEP@
|
||||||
|
|
||||||
|
+AUDIT_LIB = @AUDIT_LIB@
|
||||||
|
+
|
||||||
|
ALLOC_HEADERS = $(ALLOC_LIBSRC)/getpagesize.h $(ALLOC_LIBSRC)/shmalloc.h \
|
||||||
|
$(ALLOC_LIBSRC)/imalloc.h $(ALLOC_LIBSRC)/mstats.h \
|
||||||
|
$(ALLOC_LIBSRC)/table.h $(ALLOC_LIBSRC)/watch.h
|
||||||
|
@@ -386,7 +388,7 @@ BASHINCFILES = $(BASHINCDIR)/posixstat.
|
||||||
|
$(BASHINCDIR)/ocache.h
|
||||||
|
|
||||||
|
LIBRARIES = $(SHLIB_LIB) $(READLINE_LIB) $(HISTORY_LIB) $(TERMCAP_LIB) $(GLOB_LIB) \
|
||||||
|
- $(TILDE_LIB) $(MALLOC_LIB) $(INTL_LIB) $(LOCAL_LIBS)
|
||||||
|
+ $(TILDE_LIB) $(MALLOC_LIB) $(INTL_LIB) $(LOCAL_LIBS) $(AUDIT_LIB)
|
||||||
|
|
||||||
|
LIBDEP = $(SHLIB_DEP) $(INTL_DEP) $(READLINE_DEP) $(HISTORY_DEP) $(TERMCAP_DEP) $(GLOB_DEP) \
|
||||||
|
$(TILDE_DEP) $(MALLOC_DEP)
|
||||||
|
diff -urp bash-3.2.orig/parse.y bash-3.2/parse.y
|
||||||
|
--- bash-3.2.orig/parse.y 2007-01-03 09:01:06.000000000 -0500
|
||||||
|
+++ bash-3.2/parse.y 2007-01-20 11:59:23.000000000 -0500
|
||||||
|
@@ -258,7 +258,7 @@ int need_here_doc;
|
||||||
|
|
||||||
|
/* Where shell input comes from. History expansion is performed on each
|
||||||
|
line when the shell is interactive. */
|
||||||
|
-static char *shell_input_line = (char *)NULL;
|
||||||
|
+char *shell_input_line = (char *)NULL;
|
||||||
|
static int shell_input_line_index;
|
||||||
|
static int shell_input_line_size; /* Amount allocated for shell_input_line. */
|
||||||
|
static int shell_input_line_len; /* strlen (shell_input_line) */
|
||||||
|
diff -urp bash-3.2.orig/shell.c bash-3.2/shell.c
|
||||||
|
--- bash-3.2.orig/shell.c 2007-01-03 09:01:06.000000000 -0500
|
||||||
|
+++ bash-3.2/shell.c 2007-01-20 12:04:23.000000000 -0500
|
||||||
|
@@ -240,6 +240,9 @@ struct {
|
||||||
|
#if defined (RESTRICTED_SHELL)
|
||||||
|
{ "restricted", Int, &restricted, (char **)0x0 },
|
||||||
|
#endif
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+ { "audit", Int, &audited, (char **)0x0 },
|
||||||
|
+#endif
|
||||||
|
{ "verbose", Int, &echo_input_at_read, (char **)0x0 },
|
||||||
|
{ "version", Int, &do_version, (char **)0x0 },
|
||||||
|
{ "wordexp", Int, &wordexp_only, (char **)0x0 },
|
||||||
|
@@ -644,6 +647,10 @@ main (argc, argv, env)
|
||||||
|
maybe_make_restricted (shell_name);
|
||||||
|
#endif /* RESTRICTED_SHELL */
|
||||||
|
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+ maybe_make_audited (shell_name);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
if (wordexp_only)
|
||||||
|
{
|
||||||
|
startup_state = 3;
|
||||||
|
@@ -1143,6 +1150,29 @@ maybe_make_restricted (name)
|
||||||
|
}
|
||||||
|
#endif /* RESTRICTED_SHELL */
|
||||||
|
|
||||||
|
+#if defined (AUDIT_SHELL)
|
||||||
|
+/* Perhaps make this shell an `audited' one, based on NAME. If the
|
||||||
|
+ basename of NAME is "aubash", then this shell is audited. The
|
||||||
|
+ name of the audited shell is a configurable option, see config.h.
|
||||||
|
+ In an audited shell, all actions performed by root will be logged
|
||||||
|
+ to the audit system.
|
||||||
|
+ Do this also if `audited' is already set to 1 maybe the shell was
|
||||||
|
+ started with --audit. */
|
||||||
|
+int
|
||||||
|
+maybe_make_audited (name)
|
||||||
|
+ char *name;
|
||||||
|
+{
|
||||||
|
+ char *temp;
|
||||||
|
+
|
||||||
|
+ temp = base_pathname (name);
|
||||||
|
+ if (*temp == '-')
|
||||||
|
+ temp++;
|
||||||
|
+ if (audited || (STREQ (temp, AUDIT_SHELL_NAME)))
|
||||||
|
+ audited = 1;
|
||||||
|
+ return (audited);
|
||||||
|
+}
|
||||||
|
+#endif /* AUDIT_SHELL */
|
||||||
|
+
|
||||||
|
/* Fetch the current set of uids and gids and return 1 if we're running
|
||||||
|
setuid or setgid. */
|
||||||
|
static int
|
||||||
12860
CWRU/changelog
12860
CWRU/changelog
File diff suppressed because it is too large
Load diff
|
|
@ -5,10 +5,10 @@
|
||||||
|
|
||||||
# Copyright (C) 1996-2002 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2002 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
# any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
#
|
||||||
|
|
||||||
if [ "$1" = '-y' ]; then
|
if [ "$1" = '-y' ]; then
|
||||||
shift
|
shift
|
||||||
|
|
|
||||||
|
|
@ -2,23 +2,23 @@
|
||||||
* If necessary, link with lib/sh/libsh.a
|
* If necessary, link with lib/sh/libsh.a
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (C) 1998-2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
|
||||||
|
|
@ -17,23 +17,23 @@
|
||||||
* the -E flag to LOCAL_LDFLAGS.
|
* the -E flag to LOCAL_LDFLAGS.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (C) 1998-2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (__HPUX10_DLFCN_H__)
|
#if !defined (__HPUX10_DLFCN_H__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,22 @@
|
||||||
/* open-files -- report files a process has open */
|
/* open-files -- report files a process has open */
|
||||||
|
|
||||||
/* Copyright (C) 1989-2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1989-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,22 @@
|
||||||
/* sigs - print signal dispositions for a process */
|
/* sigs - print signal dispositions for a process */
|
||||||
|
|
||||||
/* Copyright (C) 1990-2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1990-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
|
||||||
|
|
@ -5,23 +5,23 @@
|
||||||
* chet@po.cwru.edu
|
* chet@po.cwru.edu
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (C) 1991-2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1991-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
|
||||||
23
INSTALL
23
INSTALL
|
|
@ -275,7 +275,16 @@ does not provide the necessary support.
|
||||||
|
|
||||||
`--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.
|
See *note Brace Expansion::, for a complete description.
|
||||||
|
|
||||||
|
`--enable-casemod-attributes'
|
||||||
|
Include support for case-modifying attributes in the `declare'
|
||||||
|
builtin and assignment statements. Variables with the UPPERCASE
|
||||||
|
attribute, for example, will have their values converted to
|
||||||
|
uppercase upon assignment.
|
||||||
|
|
||||||
|
`--enable-casemod-expansion'
|
||||||
|
Include support for case-modifying word expansions.
|
||||||
|
|
||||||
`--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
|
||||||
|
|
@ -292,6 +301,10 @@ does not provide the necessary support.
|
||||||
`=~' binary operator in the `[[' conditional command. (*note
|
`=~' binary operator in the `[[' conditional command. (*note
|
||||||
Conditional Constructs::).
|
Conditional Constructs::).
|
||||||
|
|
||||||
|
`--enable-coprocesses'
|
||||||
|
Include support for coprocesses and the `coproc' reserved word
|
||||||
|
(*note Pipelines::).
|
||||||
|
|
||||||
`--enable-debugger'
|
`--enable-debugger'
|
||||||
Include support for the bash debugger (distributed separately).
|
Include support for the bash debugger (distributed separately).
|
||||||
|
|
||||||
|
|
@ -301,7 +314,7 @@ does not provide the necessary support.
|
||||||
|
|
||||||
`--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
|
||||||
`xxx' has been disabled using `enable -n xxx'. See *Note Bash
|
`xxx' has been disabled using `enable -n xxx'. See *note Bash
|
||||||
Builtins::, for details of the `builtin' and `enable' builtin
|
Builtins::, for details of the `builtin' and `enable' builtin
|
||||||
commands.
|
commands.
|
||||||
|
|
||||||
|
|
@ -311,7 +324,7 @@ does not provide the necessary support.
|
||||||
|
|
||||||
`--enable-extended-glob'
|
`--enable-extended-glob'
|
||||||
Include support for the extended pattern matching features
|
Include support for the extended pattern matching features
|
||||||
described above under *Note Pattern Matching::.
|
described above under *note Pattern Matching::.
|
||||||
|
|
||||||
`--enable-help-builtin'
|
`--enable-help-builtin'
|
||||||
Include the `help' builtin, which displays help on shell builtins
|
Include the `help' builtin, which displays help on shell builtins
|
||||||
|
|
@ -346,7 +359,7 @@ does not provide 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. See *Note Printing a Prompt::, for a complete list of
|
strings. See *note Printing a Prompt::, for a complete list of
|
||||||
prompt string escape sequences.
|
prompt string escape sequences.
|
||||||
|
|
||||||
`--enable-readline'
|
`--enable-readline'
|
||||||
|
|
@ -355,7 +368,7 @@ does not provide the necessary support.
|
||||||
|
|
||||||
`--enable-restricted'
|
`--enable-restricted'
|
||||||
Include support for a "restricted shell". If this is enabled,
|
Include support for a "restricted shell". If this is enabled,
|
||||||
Bash, when called as `rbash', enters a restricted mode. See *Note
|
Bash, when called as `rbash', enters a restricted mode. See *note
|
||||||
The Restricted Shell::, for a description of restricted mode.
|
The Restricted Shell::, for a description of restricted mode.
|
||||||
|
|
||||||
`--enable-select'
|
`--enable-select'
|
||||||
|
|
|
||||||
153
MANIFEST
153
MANIFEST
|
|
@ -10,7 +10,6 @@ builtins d
|
||||||
cross-build d
|
cross-build d
|
||||||
doc d
|
doc d
|
||||||
examples d
|
examples d
|
||||||
examples/bashdb d
|
|
||||||
examples/obashdb d
|
examples/obashdb d
|
||||||
examples/complete d
|
examples/complete d
|
||||||
examples/functions d
|
examples/functions d
|
||||||
|
|
@ -33,7 +32,6 @@ lib/readline/doc d
|
||||||
lib/readline/examples d
|
lib/readline/examples d
|
||||||
lib/sh d
|
lib/sh d
|
||||||
lib/termcap d
|
lib/termcap d
|
||||||
lib/termcap/grot d
|
|
||||||
lib/tilde d
|
lib/tilde d
|
||||||
po d
|
po d
|
||||||
support d
|
support d
|
||||||
|
|
@ -61,6 +59,7 @@ config.h.in f
|
||||||
aclocal.m4 f
|
aclocal.m4 f
|
||||||
array.c f
|
array.c f
|
||||||
arrayfunc.c f
|
arrayfunc.c f
|
||||||
|
assoc.c f
|
||||||
eval.c f
|
eval.c f
|
||||||
print_cmd.c f
|
print_cmd.c f
|
||||||
general.c f
|
general.c f
|
||||||
|
|
@ -111,6 +110,7 @@ patchlevel.h f
|
||||||
variables.h f
|
variables.h f
|
||||||
array.h f
|
array.h f
|
||||||
arrayfunc.h f
|
arrayfunc.h f
|
||||||
|
assoc.h f
|
||||||
jobs.h f
|
jobs.h f
|
||||||
findcmd.h f
|
findcmd.h f
|
||||||
hashlib.h f
|
hashlib.h f
|
||||||
|
|
@ -177,6 +177,7 @@ builtins/let.def f
|
||||||
builtins/history.def f
|
builtins/history.def f
|
||||||
builtins/jobs.def f
|
builtins/jobs.def f
|
||||||
builtins/kill.def f
|
builtins/kill.def f
|
||||||
|
builtins/mapfile.def f
|
||||||
builtins/mkbuiltins.c f
|
builtins/mkbuiltins.c f
|
||||||
builtins/printf.def f
|
builtins/printf.def f
|
||||||
builtins/pushd.def f
|
builtins/pushd.def f
|
||||||
|
|
@ -375,18 +376,23 @@ lib/readline/examples/rl.c f
|
||||||
lib/readline/examples/rlcat.c f
|
lib/readline/examples/rlcat.c f
|
||||||
lib/readline/examples/Inputrc f
|
lib/readline/examples/Inputrc f
|
||||||
lib/sh/Makefile.in f
|
lib/sh/Makefile.in f
|
||||||
|
lib/sh/casemod.c f
|
||||||
lib/sh/clktck.c f
|
lib/sh/clktck.c f
|
||||||
lib/sh/clock.c f
|
lib/sh/clock.c f
|
||||||
lib/sh/eaccess.c f
|
lib/sh/eaccess.c f
|
||||||
|
lib/sh/fdprintf.c f
|
||||||
lib/sh/fmtullong.c f
|
lib/sh/fmtullong.c f
|
||||||
lib/sh/fmtulong.c f
|
lib/sh/fmtulong.c f
|
||||||
lib/sh/fmtumax.c f
|
lib/sh/fmtumax.c f
|
||||||
|
lib/sh/fpurge.c f
|
||||||
lib/sh/getcwd.c f
|
lib/sh/getcwd.c f
|
||||||
lib/sh/getenv.c f
|
lib/sh/getenv.c f
|
||||||
lib/sh/inet_aton.c f
|
lib/sh/inet_aton.c f
|
||||||
|
lib/sh/input_avail.c f
|
||||||
lib/sh/itos.c f
|
lib/sh/itos.c f
|
||||||
lib/sh/mailstat.c f
|
lib/sh/mailstat.c f
|
||||||
lib/sh/makepath.c f
|
lib/sh/makepath.c f
|
||||||
|
lib/sh/mbscmp.c f
|
||||||
lib/sh/memset.c f
|
lib/sh/memset.c f
|
||||||
lib/sh/mktime.c f
|
lib/sh/mktime.c f
|
||||||
lib/sh/netconn.c f
|
lib/sh/netconn.c f
|
||||||
|
|
@ -421,11 +427,15 @@ lib/sh/strtrans.c f
|
||||||
lib/sh/times.c f
|
lib/sh/times.c f
|
||||||
lib/sh/timeval.c f
|
lib/sh/timeval.c f
|
||||||
lib/sh/tmpfile.c f
|
lib/sh/tmpfile.c f
|
||||||
|
lib/sh/uconvert.c f
|
||||||
|
lib/sh/ufuncs.c f
|
||||||
lib/sh/vprint.c f
|
lib/sh/vprint.c f
|
||||||
lib/sh/wcsdup.c f
|
lib/sh/wcsdup.c f
|
||||||
lib/sh/winsize.c f
|
lib/sh/winsize.c f
|
||||||
lib/sh/xstrchr.c f
|
lib/sh/xstrchr.c f
|
||||||
lib/sh/zcatfd.c f
|
lib/sh/zcatfd.c f
|
||||||
|
lib/sh/zgetline.c f
|
||||||
|
lib/sh/zmapfd.c f
|
||||||
lib/sh/zread.c f
|
lib/sh/zread.c f
|
||||||
lib/sh/zwrite.c f
|
lib/sh/zwrite.c f
|
||||||
lib/termcap/Makefile.in f
|
lib/termcap/Makefile.in f
|
||||||
|
|
@ -434,21 +444,6 @@ lib/termcap/termcap.c f
|
||||||
lib/termcap/termcap.h f
|
lib/termcap/termcap.h f
|
||||||
lib/termcap/tparam.c f
|
lib/termcap/tparam.c f
|
||||||
lib/termcap/version.c f
|
lib/termcap/version.c f
|
||||||
lib/termcap/grot/termcap.info f
|
|
||||||
lib/termcap/grot/termcap.info-1 f
|
|
||||||
lib/termcap/grot/termcap.info-2 f
|
|
||||||
lib/termcap/grot/termcap.info-3 f
|
|
||||||
lib/termcap/grot/termcap.info-4 f
|
|
||||||
lib/termcap/grot/NEWS f
|
|
||||||
lib/termcap/grot/INSTALL f
|
|
||||||
lib/termcap/grot/ChangeLog f
|
|
||||||
lib/termcap/grot/texinfo.tex f
|
|
||||||
lib/termcap/grot/termcap.texi f
|
|
||||||
lib/termcap/grot/Makefile.in f
|
|
||||||
lib/termcap/grot/configure f
|
|
||||||
lib/termcap/grot/configure.in f
|
|
||||||
lib/termcap/grot/COPYING f
|
|
||||||
lib/termcap/grot/README f
|
|
||||||
lib/tilde/README f
|
lib/tilde/README f
|
||||||
lib/tilde/Makefile.in f
|
lib/tilde/Makefile.in f
|
||||||
lib/tilde/tilde.c f
|
lib/tilde/tilde.c f
|
||||||
|
|
@ -458,18 +453,63 @@ po/LINGUAS f
|
||||||
po/Makefile.in.in f
|
po/Makefile.in.in f
|
||||||
po/Makevars f
|
po/Makevars f
|
||||||
po/POTFILES.in f
|
po/POTFILES.in f
|
||||||
|
po/README f
|
||||||
po/Rules-builtins f
|
po/Rules-builtins f
|
||||||
po/Rules-quot f
|
po/Rules-quot f
|
||||||
po/bash.pot f
|
po/bash.pot f
|
||||||
po/boldquot.sed f
|
po/boldquot.sed f
|
||||||
po/en@quot.header f
|
po/en@boldquot.gmo f
|
||||||
po/en@boldquot.header f
|
po/en@boldquot.header f
|
||||||
po/en@quot.po f
|
|
||||||
po/en@boldquot.po f
|
po/en@boldquot.po f
|
||||||
po/en@quot.gmo f
|
po/en@quot.gmo f
|
||||||
po/en@boldquot.gmo f
|
po/en@quot.header f
|
||||||
po/ru.po f
|
po/en@quot.po f
|
||||||
|
po/af.gmo f
|
||||||
|
po/af.po f
|
||||||
|
po/bg.gmo f
|
||||||
|
po/bg.po f
|
||||||
|
po/ca.gmo f
|
||||||
|
po/ca.po f
|
||||||
|
po/cs.gmo f
|
||||||
|
po/cs.po f
|
||||||
|
po/de.gmo f
|
||||||
|
po/de.po f
|
||||||
|
po/eo.gmo f
|
||||||
|
po/eo.po f
|
||||||
|
po/es.gmo f
|
||||||
|
po/es.po f
|
||||||
|
po/et.gmo f
|
||||||
|
po/et.po f
|
||||||
|
po/fr.gmo f
|
||||||
|
po/fr.po f
|
||||||
|
po/hu.gmo f
|
||||||
|
po/hu.po f
|
||||||
|
po/id.gmo f
|
||||||
|
po/id.po f
|
||||||
|
po/ja.gmo f
|
||||||
|
po/ja.po f
|
||||||
|
po/lt.gmo f
|
||||||
|
po/lt.po f
|
||||||
|
po/nl.gmo f
|
||||||
|
po/nl.po f
|
||||||
|
po/pl.gmo f
|
||||||
|
po/pl.po f
|
||||||
|
po/pt_BR.gmo f
|
||||||
|
po/pt_BR.po f
|
||||||
|
po/ro.gmo f
|
||||||
|
po/ro.po f
|
||||||
po/ru.gmo f
|
po/ru.gmo f
|
||||||
|
po/ru.po f
|
||||||
|
po/sk.gmo f
|
||||||
|
po/sk.po f
|
||||||
|
po/sv.gmo f
|
||||||
|
po/sv.po f
|
||||||
|
po/tr.gmo f
|
||||||
|
po/tr.po f
|
||||||
|
po/vi.gmo f
|
||||||
|
po/vi.po f
|
||||||
|
po/zh_TW.gmo f
|
||||||
|
po/zh_TW.po f
|
||||||
po/insert-header.sin f
|
po/insert-header.sin f
|
||||||
po/quot.sed f
|
po/quot.sed f
|
||||||
po/remove-potcdate.sin f
|
po/remove-potcdate.sin f
|
||||||
|
|
@ -481,6 +521,7 @@ CWRU/misc/errlist.c f
|
||||||
CWRU/misc/hpux10-dlfcn.h f
|
CWRU/misc/hpux10-dlfcn.h f
|
||||||
CWRU/PLATFORMS f
|
CWRU/PLATFORMS f
|
||||||
CWRU/README f
|
CWRU/README f
|
||||||
|
CWRU/audit-patch f
|
||||||
CWRU/changelog f
|
CWRU/changelog f
|
||||||
CWRU/sh-redir-hack f
|
CWRU/sh-redir-hack f
|
||||||
CWRU/mh-folder-comp f
|
CWRU/mh-folder-comp f
|
||||||
|
|
@ -503,6 +544,7 @@ doc/fdl.texi f
|
||||||
doc/fdl.txt f
|
doc/fdl.txt f
|
||||||
support/Makefile.in f
|
support/Makefile.in f
|
||||||
support/bashversion.c f
|
support/bashversion.c f
|
||||||
|
support/checkbashisms f 755
|
||||||
support/config.guess f
|
support/config.guess f
|
||||||
support/config.rpath f 755
|
support/config.rpath f 755
|
||||||
support/config.sub f
|
support/config.sub f
|
||||||
|
|
@ -521,6 +563,7 @@ support/bashbug.sh f
|
||||||
support/man2html.c f
|
support/man2html.c f
|
||||||
support/recho.c f
|
support/recho.c f
|
||||||
support/zecho.c f
|
support/zecho.c f
|
||||||
|
support/xcase.c f
|
||||||
support/SYMLINKS f
|
support/SYMLINKS f
|
||||||
support/fixlinks f 755
|
support/fixlinks f 755
|
||||||
support/install.sh f 755
|
support/install.sh f 755
|
||||||
|
|
@ -531,15 +574,11 @@ support/shobj-conf f 755
|
||||||
support/rlvers.sh f 755
|
support/rlvers.sh f 755
|
||||||
examples/INDEX.txt f
|
examples/INDEX.txt f
|
||||||
examples/INDEX.html f
|
examples/INDEX.html f
|
||||||
examples/bashdb/PERMISSION f
|
|
||||||
examples/bashdb/README f
|
|
||||||
examples/bashdb/bashdb f
|
|
||||||
examples/bashdb/bashdb.el f
|
|
||||||
examples/obashdb/PERMISSION f
|
examples/obashdb/PERMISSION f
|
||||||
examples/obashdb/README f
|
examples/obashdb/README f
|
||||||
examples/obashdb/bashdb f
|
examples/obashdb/bashdb f
|
||||||
examples/obashdb/bashdb.fns f
|
examples/obashdb/bashdb.el f
|
||||||
examples/obashdb/bashdb.pre f
|
examples/complete/bash_completion f
|
||||||
examples/complete/complete-examples f
|
examples/complete/complete-examples f
|
||||||
examples/complete/complete.ianmac f
|
examples/complete/complete.ianmac f
|
||||||
examples/complete/complete2.ianmac f
|
examples/complete/complete2.ianmac f
|
||||||
|
|
@ -577,6 +616,7 @@ examples/loadables/uname.c f
|
||||||
examples/loadables/sync.c f
|
examples/loadables/sync.c f
|
||||||
examples/loadables/mkdir.c f
|
examples/loadables/mkdir.c f
|
||||||
examples/loadables/ln.c f
|
examples/loadables/ln.c f
|
||||||
|
examples/loadables/mypid.c f
|
||||||
examples/loadables/unlink.c f
|
examples/loadables/unlink.c f
|
||||||
examples/loadables/perl/Makefile.in f
|
examples/loadables/perl/Makefile.in f
|
||||||
examples/loadables/perl/README f
|
examples/loadables/perl/README f
|
||||||
|
|
@ -656,6 +696,8 @@ examples/scripts/showperm.bash f
|
||||||
examples/scripts/shprompt f
|
examples/scripts/shprompt f
|
||||||
examples/scripts/spin.bash f
|
examples/scripts/spin.bash f
|
||||||
examples/scripts/timeout f
|
examples/scripts/timeout f
|
||||||
|
examples/scripts/timeout2 f
|
||||||
|
examples/scripts/timeout3 f
|
||||||
examples/scripts/vtree2 f
|
examples/scripts/vtree2 f
|
||||||
examples/scripts/vtree3 f
|
examples/scripts/vtree3 f
|
||||||
examples/scripts/vtree3a f
|
examples/scripts/vtree3a f
|
||||||
|
|
@ -697,8 +739,19 @@ tests/array1.sub f
|
||||||
tests/array2.sub f
|
tests/array2.sub f
|
||||||
tests/array3.sub f
|
tests/array3.sub f
|
||||||
tests/array4.sub f
|
tests/array4.sub f
|
||||||
|
tests/array5.sub f
|
||||||
|
tests/array6.sub f
|
||||||
|
tests/array7.sub f
|
||||||
|
tests/array8.sub f
|
||||||
|
tests/array9.sub f
|
||||||
tests/array-at-star f
|
tests/array-at-star f
|
||||||
tests/array2.right f
|
tests/array2.right f
|
||||||
|
tests/assoc.tests f
|
||||||
|
tests/assoc.right f
|
||||||
|
tests/assoc1.sub f
|
||||||
|
tests/assoc2.sub f
|
||||||
|
tests/assoc3.sub f
|
||||||
|
tests/assoc4.sub f
|
||||||
tests/braces.tests f
|
tests/braces.tests f
|
||||||
tests/braces.right f
|
tests/braces.right f
|
||||||
tests/builtins.tests f
|
tests/builtins.tests f
|
||||||
|
|
@ -710,8 +763,27 @@ tests/source2.sub f
|
||||||
tests/source3.sub f
|
tests/source3.sub f
|
||||||
tests/source4.sub f
|
tests/source4.sub f
|
||||||
tests/source5.sub f
|
tests/source5.sub f
|
||||||
|
tests/source6.sub f
|
||||||
|
tests/case.tests f
|
||||||
|
tests/case.right f
|
||||||
|
tests/casemod.tests f
|
||||||
|
tests/casemod.right f
|
||||||
|
tests/comsub.tests f
|
||||||
|
tests/comsub.right f
|
||||||
|
tests/comsub-eof.tests f
|
||||||
|
tests/comsub-eof0.sub f
|
||||||
|
tests/comsub-eof1.sub f
|
||||||
|
tests/comsub-eof2.sub f
|
||||||
|
tests/comsub-eof3.sub f
|
||||||
|
tests/comsub-eof.right f
|
||||||
|
tests/comsub-posix.tests f
|
||||||
|
tests/comsub-posix.right f
|
||||||
|
tests/comsub-posix1.sub f
|
||||||
tests/cond.tests f
|
tests/cond.tests f
|
||||||
tests/cond.right f
|
tests/cond.right f
|
||||||
|
tests/cond-regexp.sub f
|
||||||
|
tests/coproc.tests f
|
||||||
|
tests/coproc.right f
|
||||||
tests/cprint.tests f
|
tests/cprint.tests f
|
||||||
tests/cprint.right f
|
tests/cprint.right f
|
||||||
tests/dbg-support.right f
|
tests/dbg-support.right f
|
||||||
|
|
@ -724,6 +796,7 @@ tests/dollar-at1.sub f
|
||||||
tests/dollar-at2.sub f
|
tests/dollar-at2.sub f
|
||||||
tests/dollar-star1.sub f
|
tests/dollar-star1.sub f
|
||||||
tests/dollar-star2.sub f
|
tests/dollar-star2.sub f
|
||||||
|
tests/dollar-star3.sub f
|
||||||
tests/dollar.right f
|
tests/dollar.right f
|
||||||
tests/dstack.tests f
|
tests/dstack.tests f
|
||||||
tests/dstack.right f
|
tests/dstack.right f
|
||||||
|
|
@ -740,8 +813,11 @@ tests/exec4.sub f
|
||||||
tests/exec5.sub f
|
tests/exec5.sub f
|
||||||
tests/exec6.sub f
|
tests/exec6.sub f
|
||||||
tests/exec7.sub f
|
tests/exec7.sub f
|
||||||
tests/exp-tests f
|
tests/exec8.sub f
|
||||||
|
tests/exp.tests f
|
||||||
tests/exp.right f
|
tests/exp.right f
|
||||||
|
tests/exp1.sub f
|
||||||
|
tests/exp2.sub f
|
||||||
tests/extglob.tests f
|
tests/extglob.tests f
|
||||||
tests/extglob.right f
|
tests/extglob.right f
|
||||||
tests/extglob1.sub f
|
tests/extglob1.sub f
|
||||||
|
|
@ -775,6 +851,7 @@ tests/histexp.right f
|
||||||
tests/history.tests f
|
tests/history.tests f
|
||||||
tests/history.right f
|
tests/history.right f
|
||||||
tests/history.list f 444
|
tests/history.list f 444
|
||||||
|
tests/history1.sub f
|
||||||
tests/ifs.tests f
|
tests/ifs.tests f
|
||||||
tests/ifs.right f
|
tests/ifs.right f
|
||||||
tests/ifs-posix.tests f
|
tests/ifs-posix.tests f
|
||||||
|
|
@ -783,6 +860,7 @@ tests/input-line.sh f
|
||||||
tests/input-line.sub f
|
tests/input-line.sub f
|
||||||
tests/input.right f
|
tests/input.right f
|
||||||
tests/intl.tests f
|
tests/intl.tests f
|
||||||
|
tests/intl1.sub f
|
||||||
tests/intl.right f
|
tests/intl.right f
|
||||||
tests/iquote.tests f
|
tests/iquote.tests f
|
||||||
tests/iquote.right f
|
tests/iquote.right f
|
||||||
|
|
@ -794,6 +872,9 @@ tests/jobs2.sub f
|
||||||
tests/jobs3.sub f
|
tests/jobs3.sub f
|
||||||
tests/jobs4.sub f
|
tests/jobs4.sub f
|
||||||
tests/jobs.right f
|
tests/jobs.right f
|
||||||
|
tests/mapfile.data f
|
||||||
|
tests/mapfile.right f
|
||||||
|
tests/mapfile.tests f
|
||||||
tests/more-exp.tests f
|
tests/more-exp.tests f
|
||||||
tests/more-exp.right f
|
tests/more-exp.right f
|
||||||
tests/new-exp.tests f
|
tests/new-exp.tests f
|
||||||
|
|
@ -803,6 +884,7 @@ tests/new-exp3.sub f
|
||||||
tests/new-exp4.sub f
|
tests/new-exp4.sub f
|
||||||
tests/new-exp5.sub f
|
tests/new-exp5.sub f
|
||||||
tests/new-exp6.sub f
|
tests/new-exp6.sub f
|
||||||
|
tests/new-exp7.sub f
|
||||||
tests/new-exp.right f
|
tests/new-exp.right f
|
||||||
tests/nquote.tests f
|
tests/nquote.tests f
|
||||||
tests/nquote.right f
|
tests/nquote.right f
|
||||||
|
|
@ -814,6 +896,8 @@ tests/nquote3.tests f
|
||||||
tests/nquote3.right f
|
tests/nquote3.right f
|
||||||
tests/nquote4.tests f
|
tests/nquote4.tests f
|
||||||
tests/nquote4.right f
|
tests/nquote4.right f
|
||||||
|
tests/nquote5.tests f
|
||||||
|
tests/nquote5.right f
|
||||||
tests/posix2.tests f
|
tests/posix2.tests f
|
||||||
tests/posix2.right f
|
tests/posix2.right f
|
||||||
tests/posixpat.tests f
|
tests/posixpat.tests f
|
||||||
|
|
@ -831,6 +915,7 @@ tests/read2.sub f
|
||||||
tests/read3.sub f
|
tests/read3.sub f
|
||||||
tests/read4.sub f
|
tests/read4.sub f
|
||||||
tests/read5.sub f
|
tests/read5.sub f
|
||||||
|
tests/read6.sub f
|
||||||
tests/redir.tests f
|
tests/redir.tests f
|
||||||
tests/redir.right f
|
tests/redir.right f
|
||||||
tests/redir1.sub f
|
tests/redir1.sub f
|
||||||
|
|
@ -843,6 +928,8 @@ tests/redir4.in1 f
|
||||||
tests/redir5.sub f
|
tests/redir5.sub f
|
||||||
tests/redir6.sub f
|
tests/redir6.sub f
|
||||||
tests/redir7.sub f
|
tests/redir7.sub f
|
||||||
|
tests/redir8.sub f
|
||||||
|
tests/redir9.sub f
|
||||||
tests/rhs-exp.tests f
|
tests/rhs-exp.tests f
|
||||||
tests/rhs-exp.right f
|
tests/rhs-exp.right f
|
||||||
tests/rsh.tests f
|
tests/rsh.tests f
|
||||||
|
|
@ -855,9 +942,16 @@ tests/run-arith-for f
|
||||||
tests/run-arith f
|
tests/run-arith f
|
||||||
tests/run-array f
|
tests/run-array f
|
||||||
tests/run-array2 f
|
tests/run-array2 f
|
||||||
|
tests/run-assoc f
|
||||||
tests/run-braces f
|
tests/run-braces f
|
||||||
tests/run-builtins f
|
tests/run-builtins f
|
||||||
|
tests/run-case f
|
||||||
|
tests/run-casemod f
|
||||||
|
tests/run-comsub f
|
||||||
|
tests/run-comsub-eof f
|
||||||
|
tests/run-comsub-posix f
|
||||||
tests/run-cond f
|
tests/run-cond f
|
||||||
|
tests/run-coproc f
|
||||||
tests/run-cprint f
|
tests/run-cprint f
|
||||||
tests/run-dbg-support f
|
tests/run-dbg-support f
|
||||||
tests/run-dbg-support2 f
|
tests/run-dbg-support2 f
|
||||||
|
|
@ -883,6 +977,7 @@ tests/run-intl f
|
||||||
tests/run-iquote f
|
tests/run-iquote f
|
||||||
tests/run-invert f
|
tests/run-invert f
|
||||||
tests/run-jobs f
|
tests/run-jobs f
|
||||||
|
tests/run-mapfile f
|
||||||
tests/run-more-exp f
|
tests/run-more-exp f
|
||||||
tests/run-new-exp f
|
tests/run-new-exp f
|
||||||
tests/run-nquote f
|
tests/run-nquote f
|
||||||
|
|
@ -890,6 +985,7 @@ tests/run-nquote1 f
|
||||||
tests/run-nquote2 f
|
tests/run-nquote2 f
|
||||||
tests/run-nquote3 f
|
tests/run-nquote3 f
|
||||||
tests/run-nquote4 f
|
tests/run-nquote4 f
|
||||||
|
tests/run-nquote5 f
|
||||||
tests/run-posix2 f
|
tests/run-posix2 f
|
||||||
tests/run-posixpat f
|
tests/run-posixpat f
|
||||||
tests/run-precedence f
|
tests/run-precedence f
|
||||||
|
|
@ -930,6 +1026,7 @@ tests/trap2.sub f 755
|
||||||
tests/trap2a.sub f 755
|
tests/trap2a.sub f 755
|
||||||
tests/type.tests f
|
tests/type.tests f
|
||||||
tests/type.right f
|
tests/type.right f
|
||||||
|
tests/type1.sub f
|
||||||
tests/varenv.right f
|
tests/varenv.right f
|
||||||
tests/varenv.sh f
|
tests/varenv.sh f
|
||||||
tests/varenv1.sub f
|
tests/varenv1.sub f
|
||||||
|
|
|
||||||
78
Makefile.in
78
Makefile.in
|
|
@ -1,11 +1,11 @@
|
||||||
# Makefile for bash-3.1, version 2.159
|
# Makefile for bash-4.0, version 3.4
|
||||||
#
|
#
|
||||||
# Copyright (C) 1996-2005 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
# any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
@ -13,8 +13,7 @@
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
# 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
|
||||||
|
|
@ -31,12 +30,15 @@ PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
|
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
|
||||||
bindir = @bindir@
|
bindir = @bindir@
|
||||||
libdir = @libdir@
|
libdir = @libdir@
|
||||||
infodir = @infodir@
|
infodir = @infodir@
|
||||||
includedir = @includedir@
|
includedir = @includedir@
|
||||||
datadir = @datadir@
|
datadir = @datadir@
|
||||||
localedir = $(datadir)/locale
|
localedir = @localedir@
|
||||||
|
|
||||||
mandir = @mandir@
|
mandir = @mandir@
|
||||||
manpfx = man
|
manpfx = man
|
||||||
|
|
@ -78,6 +80,8 @@ INSTALLMODE2 = -m 0555
|
||||||
|
|
||||||
TESTSCRIPT = @TESTSCRIPT@
|
TESTSCRIPT = @TESTSCRIPT@
|
||||||
|
|
||||||
|
DEBUGGER_START_FILE = @DEBUGGER_START_FILE@
|
||||||
|
|
||||||
#If you have purify, and want to use it, uncomment this definition or
|
#If you have purify, and want to use it, uncomment this definition or
|
||||||
# run the make as `make PURIFY=purify'
|
# run the make as `make PURIFY=purify'
|
||||||
# or run configure with the --with-purify argument.
|
# or run configure with the --with-purify argument.
|
||||||
|
|
@ -204,7 +208,12 @@ SHLIB_SOURCE = ${SH_LIBSRC}/clktck.c ${SH_LIBSRC}/getcwd.c \
|
||||||
${SH_LIBSRC}/memset.c ${SH_LIBSRC}/xstrchr.c \
|
${SH_LIBSRC}/memset.c ${SH_LIBSRC}/xstrchr.c \
|
||||||
${SH_LIBSRC}/zcatfd.c ${SH_LIBSRC}/shmatch.c \
|
${SH_LIBSRC}/zcatfd.c ${SH_LIBSRC}/shmatch.c \
|
||||||
${SH_LIBSRC}/strnlen.c ${SH_LIBSRC}/winsize.c \
|
${SH_LIBSRC}/strnlen.c ${SH_LIBSRC}/winsize.c \
|
||||||
${SH_LIBSRC}/eaccess.c ${SH_LIBSRC}/wcsdup.c
|
${SH_LIBSRC}/eaccess.c ${SH_LIBSRC}/wcsdup.c \
|
||||||
|
${SH_LIBSRC}/zmapfd.c ${SH_LIBSRC}/fpurge.c \
|
||||||
|
${SH_LIBSRC}/zgetline.c ${SH_LIBSRC}/mbscmp.c \
|
||||||
|
${SH_LIBSRC}/casemod.c ${SH_LIBSRC}/uconvert.c \
|
||||||
|
${SH_LIBSRC}/ufuncs.c ${SH_LIBSRC}/fdprintf.c \
|
||||||
|
${SH_LIBSRC}/input_avail.c
|
||||||
|
|
||||||
SHLIB_LIB = -lsh
|
SHLIB_LIB = -lsh
|
||||||
SHLIB_LIBNAME = libsh.a
|
SHLIB_LIBNAME = libsh.a
|
||||||
|
|
@ -402,7 +411,7 @@ CSOURCES = shell.c eval.c parse.y general.c make_cmd.c print_cmd.c y.tab.c \
|
||||||
dispose_cmd.c execute_cmd.c variables.c $(GLOBC) version.c \
|
dispose_cmd.c execute_cmd.c variables.c $(GLOBC) version.c \
|
||||||
expr.c copy_cmd.c flags.c subst.c hashcmd.c hashlib.c mailcheck.c \
|
expr.c copy_cmd.c flags.c subst.c hashcmd.c hashlib.c mailcheck.c \
|
||||||
test.c trap.c alias.c jobs.c nojobs.c $(ALLOC_FILES) braces.c \
|
test.c trap.c alias.c jobs.c nojobs.c $(ALLOC_FILES) braces.c \
|
||||||
input.c bashhist.c array.c arrayfunc.c sig.c pathexp.c \
|
input.c bashhist.c array.c arrayfunc.c assoc.c sig.c pathexp.c \
|
||||||
unwind_prot.c siglist.c bashline.c bracecomp.c error.c \
|
unwind_prot.c siglist.c bashline.c bracecomp.c error.c \
|
||||||
list.c stringlib.c locale.c findcmd.c redir.c \
|
list.c stringlib.c locale.c findcmd.c redir.c \
|
||||||
pcomplete.c pcomplib.c syntax.c xmalloc.c
|
pcomplete.c pcomplib.c syntax.c xmalloc.c
|
||||||
|
|
@ -413,7 +422,7 @@ HSOURCES = shell.h flags.h trap.h hashcmd.h hashlib.h jobs.h builtins.h \
|
||||||
command.h input.h error.h bashansi.h dispose_cmd.h make_cmd.h \
|
command.h input.h error.h bashansi.h dispose_cmd.h make_cmd.h \
|
||||||
subst.h externs.h siglist.h bashhist.h bashline.h bashtypes.h \
|
subst.h externs.h siglist.h bashhist.h bashline.h bashtypes.h \
|
||||||
array.h arrayfunc.h sig.h mailcheck.h bashintl.h bashjmp.h \
|
array.h arrayfunc.h sig.h mailcheck.h bashintl.h bashjmp.h \
|
||||||
execute_cmd.h parser.h pathexp.h pathnames.h pcomplete.h \
|
execute_cmd.h parser.h pathexp.h pathnames.h pcomplete.h assoc.h \
|
||||||
$(BASHINCFILES)
|
$(BASHINCFILES)
|
||||||
|
|
||||||
SOURCES = $(CSOURCES) $(HSOURCES) $(BUILTIN_DEFS)
|
SOURCES = $(CSOURCES) $(HSOURCES) $(BUILTIN_DEFS)
|
||||||
|
|
@ -431,7 +440,7 @@ OBJECTS = shell.o eval.o y.tab.o general.o make_cmd.o print_cmd.o $(GLOBO) \
|
||||||
dispose_cmd.o execute_cmd.o variables.o copy_cmd.o error.o \
|
dispose_cmd.o execute_cmd.o variables.o copy_cmd.o error.o \
|
||||||
expr.o flags.o $(JOBS_O) subst.o hashcmd.o hashlib.o mailcheck.o \
|
expr.o flags.o $(JOBS_O) subst.o hashcmd.o hashlib.o mailcheck.o \
|
||||||
trap.o input.o unwind_prot.o pathexp.o sig.o test.o version.o \
|
trap.o input.o unwind_prot.o pathexp.o sig.o test.o version.o \
|
||||||
alias.o array.o arrayfunc.o braces.o bracecomp.o bashhist.o \
|
alias.o array.o arrayfunc.o assoc.o braces.o bracecomp.o bashhist.o \
|
||||||
bashline.o $(SIGLIST_O) list.o stringlib.o locale.o findcmd.o redir.o \
|
bashline.o $(SIGLIST_O) list.o stringlib.o locale.o findcmd.o redir.o \
|
||||||
pcomplete.o pcomplib.o syntax.o xmalloc.o $(SIGNAMES_O)
|
pcomplete.o pcomplib.o syntax.o xmalloc.o $(SIGNAMES_O)
|
||||||
|
|
||||||
|
|
@ -456,7 +465,8 @@ BUILTIN_DEFS = $(DEFSRC)/alias.def $(DEFSRC)/bind.def $(DEFSRC)/break.def \
|
||||||
$(DEFSRC)/times.def $(DEFSRC)/trap.def $(DEFSRC)/type.def \
|
$(DEFSRC)/times.def $(DEFSRC)/trap.def $(DEFSRC)/type.def \
|
||||||
$(DEFSRC)/ulimit.def $(DEFSRC)/umask.def $(DEFSRC)/wait.def \
|
$(DEFSRC)/ulimit.def $(DEFSRC)/umask.def $(DEFSRC)/wait.def \
|
||||||
$(DEFSRC)/getopts.def $(DEFSRC)/reserved.def \
|
$(DEFSRC)/getopts.def $(DEFSRC)/reserved.def \
|
||||||
$(DEFSRC)/pushd.def $(DEFSRC)/shopt.def $(DEFSRC)/printf.def
|
$(DEFSRC)/pushd.def $(DEFSRC)/shopt.def $(DEFSRC)/printf.def \
|
||||||
|
$(DEFSRC)/mapfile.def
|
||||||
BUILTIN_C_SRC = $(DEFSRC)/mkbuiltins.c $(DEFSRC)/common.c \
|
BUILTIN_C_SRC = $(DEFSRC)/mkbuiltins.c $(DEFSRC)/common.c \
|
||||||
$(DEFSRC)/evalstring.c $(DEFSRC)/evalfile.c \
|
$(DEFSRC)/evalstring.c $(DEFSRC)/evalfile.c \
|
||||||
$(DEFSRC)/bashgetopt.c $(GETOPT_SOURCE)
|
$(DEFSRC)/bashgetopt.c $(GETOPT_SOURCE)
|
||||||
|
|
@ -475,7 +485,7 @@ BUILTIN_OBJS = $(DEFDIR)/alias.o $(DEFDIR)/bind.o $(DEFDIR)/break.o \
|
||||||
$(DEFDIR)/source.o $(DEFDIR)/suspend.o $(DEFDIR)/test.o \
|
$(DEFDIR)/source.o $(DEFDIR)/suspend.o $(DEFDIR)/test.o \
|
||||||
$(DEFDIR)/times.o $(DEFDIR)/trap.o $(DEFDIR)/type.o \
|
$(DEFDIR)/times.o $(DEFDIR)/trap.o $(DEFDIR)/type.o \
|
||||||
$(DEFDIR)/ulimit.o $(DEFDIR)/umask.o $(DEFDIR)/wait.o \
|
$(DEFDIR)/ulimit.o $(DEFDIR)/umask.o $(DEFDIR)/wait.o \
|
||||||
$(DEFDIR)/getopts.o $(BUILTIN_C_OBJ)
|
$(DEFDIR)/getopts.o $(DEFDIR)/mapfile.o $(BUILTIN_C_OBJ)
|
||||||
GETOPT_SOURCE = $(DEFSRC)/getopt.c $(DEFSRC)/getopt.h
|
GETOPT_SOURCE = $(DEFSRC)/getopt.c $(DEFSRC)/getopt.h
|
||||||
PSIZE_SOURCE = $(DEFSRC)/psize.sh $(DEFSRC)/psize.c
|
PSIZE_SOURCE = $(DEFSRC)/psize.sh $(DEFSRC)/psize.c
|
||||||
|
|
||||||
|
|
@ -497,10 +507,11 @@ SIGNAMES_SUPPORT = $(SUPPORT_SRC)mksignames.c
|
||||||
SUPPORT_SRC = $(srcdir)/support/
|
SUPPORT_SRC = $(srcdir)/support/
|
||||||
SDIR = $(dot)/support/
|
SDIR = $(dot)/support/
|
||||||
|
|
||||||
TESTS_SUPPORT = recho$(EXEEXT) zecho$(EXEEXT) printenv$(EXEEXT)
|
TESTS_SUPPORT = recho$(EXEEXT) zecho$(EXEEXT) printenv$(EXEEXT) xcase$(EXEEXT)
|
||||||
CREATED_SUPPORT = signames.h recho$(EXEEXT) zecho$(EXEEXT) printenv$(EXEEXT) \
|
CREATED_SUPPORT = signames.h recho$(EXEEXT) zecho$(EXEEXT) printenv$(EXEEXT) \
|
||||||
tests/recho$(EXEEXT) tests/zecho$(EXEEXT) \
|
tests/recho$(EXEEXT) tests/zecho$(EXEEXT) \
|
||||||
tests/printenv$(EXEEXT) mksignames$(EXEEXT) lsignames.h \
|
tests/printenv$(EXEEXT) xcase$(EXEEXT) tests/xcase$(EXEEXT) \
|
||||||
|
mksignames$(EXEEXT) lsignames.h \
|
||||||
mksyntax${EXEEXT} syntax.c $(VERSPROG) $(VERSOBJ) \
|
mksyntax${EXEEXT} syntax.c $(VERSPROG) $(VERSOBJ) \
|
||||||
buildversion.o mksignames.o signames.o buildsignames.o
|
buildversion.o mksignames.o signames.o buildsignames.o
|
||||||
CREATED_CONFIGURE = config.h config.cache config.status config.log \
|
CREATED_CONFIGURE = config.h config.cache config.status config.log \
|
||||||
|
|
@ -614,7 +625,7 @@ ${INTL_LIBRARY}: config.h ${INTL_LIBDIR}/Makefile
|
||||||
@(cd ${INTL_LIBDIR} && \
|
@(cd ${INTL_LIBDIR} && \
|
||||||
$(MAKE) $(MFLAGS) all) || exit 1
|
$(MAKE) $(MFLAGS) all) || exit 1
|
||||||
|
|
||||||
${LIBINTL_H}: ${INTL_LIBRARY}
|
${LIBINTL_H}: ${INTL_DEP}
|
||||||
|
|
||||||
signames.o: $(SUPPORT_SRC)signames.c
|
signames.o: $(SUPPORT_SRC)signames.c
|
||||||
$(RM) $@
|
$(RM) $@
|
||||||
|
|
@ -669,9 +680,6 @@ ${DEFDIR}/builtext.h: $(BUILTIN_DEFS)
|
||||||
Makefile makefile: config.status $(srcdir)/Makefile.in
|
Makefile makefile: config.status $(srcdir)/Makefile.in
|
||||||
CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status
|
CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
pathnames.h: config.status $(srcdir)/Makefile.in
|
|
||||||
CONFIG_HEADERS= $(SHELL) ./config.status
|
|
||||||
|
|
||||||
Makefiles makefiles: config.status $(srcdir)/Makefile.in
|
Makefiles makefiles: config.status $(srcdir)/Makefile.in
|
||||||
@for mf in $(CREATED_MAKEFILES); do \
|
@for mf in $(CREATED_MAKEFILES); do \
|
||||||
CONFIG_FILES=$$mf CONFIG_HEADERS= $(SHELL) ./config.status ; \
|
CONFIG_FILES=$$mf CONFIG_HEADERS= $(SHELL) ./config.status ; \
|
||||||
|
|
@ -685,6 +693,15 @@ stamp-h: config.status $(srcdir)/config.h.in $(srcdir)/config-top.h $(srcdir)/co
|
||||||
config.status: $(srcdir)/configure
|
config.status: $(srcdir)/configure
|
||||||
$(SHELL) ./config.status --recheck
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
|
pathnames.h: Makefile $(srcdir)/pathnames.h.in
|
||||||
|
@sed -e 's|@DEBUGGER_START_FILE\@|${DEBUGGER_START_FILE}|g' $(srcdir)/pathnames.h.in > pathnames.tmp
|
||||||
|
@if test -f $@; then \
|
||||||
|
cmp -s pathnames.tmp $@ || mv pathnames.tmp $@; \
|
||||||
|
else \
|
||||||
|
mv pathnames.tmp $@; \
|
||||||
|
fi
|
||||||
|
@${RM} pathnames.tmp
|
||||||
|
|
||||||
# comment out for distribution
|
# comment out for distribution
|
||||||
$(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4 $(srcdir)/config.h.in
|
$(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4 $(srcdir)/config.h.in
|
||||||
cd $(srcdir) && autoconf
|
cd $(srcdir) && autoconf
|
||||||
|
|
@ -811,6 +828,9 @@ zecho$(EXEEXT): $(SUPPORT_SRC)zecho.c
|
||||||
printenv$(EXEEXT): $(SUPPORT_SRC)printenv.c
|
printenv$(EXEEXT): $(SUPPORT_SRC)printenv.c
|
||||||
@$(CC_FOR_BUILD) $(CCFLAGS_FOR_BUILD) -o $@ $(SUPPORT_SRC)printenv.c ${LIBS_FOR_BUILD}
|
@$(CC_FOR_BUILD) $(CCFLAGS_FOR_BUILD) -o $@ $(SUPPORT_SRC)printenv.c ${LIBS_FOR_BUILD}
|
||||||
|
|
||||||
|
xcase$(EXEEXT): $(SUPPORT_SRC)xcase.c
|
||||||
|
@$(CC_FOR_BUILD) $(CCFLAGS_FOR_BUILD) -o $@ $(SUPPORT_SRC)xcase.c ${LIBS_FOR_BUILD}
|
||||||
|
|
||||||
test tests check: force $(Program) $(TESTS_SUPPORT)
|
test tests check: force $(Program) $(TESTS_SUPPORT)
|
||||||
@-test -d tests || mkdir tests
|
@-test -d tests || mkdir tests
|
||||||
@cp $(TESTS_SUPPORT) tests
|
@cp $(TESTS_SUPPORT) tests
|
||||||
|
|
@ -977,7 +997,7 @@ shell.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h arr
|
||||||
shell.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
|
shell.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
|
||||||
shell.o: make_cmd.h subst.h sig.h pathnames.h externs.h
|
shell.o: make_cmd.h subst.h sig.h pathnames.h externs.h
|
||||||
shell.o: flags.h trap.h mailcheck.h builtins.h $(DEFSRC)/common.h
|
shell.o: flags.h trap.h mailcheck.h builtins.h $(DEFSRC)/common.h
|
||||||
shell.o: jobs.h siglist.h input.h execute_cmd.h findcmd.h bashhist.h
|
shell.o: jobs.h siglist.h input.h execute_cmd.h findcmd.h bashhist.h bashline.h
|
||||||
shell.o: ${GLOB_LIBSRC}/strmatch.h ${BASHINCDIR}/posixtime.h
|
shell.o: ${GLOB_LIBSRC}/strmatch.h ${BASHINCDIR}/posixtime.h
|
||||||
sig.o: config.h bashtypes.h
|
sig.o: config.h bashtypes.h
|
||||||
sig.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
|
sig.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
|
||||||
|
|
@ -1043,6 +1063,7 @@ jobs.o: ${BASHINCDIR}/posixtime.h
|
||||||
nojobs.o: config.h bashtypes.h ${BASHINCDIR}/filecntl.h bashjmp.h ${BASHINCDIR}/posixjmp.h
|
nojobs.o: config.h bashtypes.h ${BASHINCDIR}/filecntl.h bashjmp.h ${BASHINCDIR}/posixjmp.h
|
||||||
nojobs.o: command.h ${BASHINCDIR}/stdc.h general.h xmalloc.h jobs.h quit.h siglist.h externs.h
|
nojobs.o: command.h ${BASHINCDIR}/stdc.h general.h xmalloc.h jobs.h quit.h siglist.h externs.h
|
||||||
nojobs.o: sig.h error.h ${BASHINCDIR}/shtty.h input.h
|
nojobs.o: sig.h error.h ${BASHINCDIR}/shtty.h input.h
|
||||||
|
nojobs.o: $(DEFDIR)/builtext.h
|
||||||
|
|
||||||
# shell features that may be compiled in
|
# shell features that may be compiled in
|
||||||
|
|
||||||
|
|
@ -1059,6 +1080,14 @@ arrayfunc.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
|
||||||
arrayfunc.o: make_cmd.h subst.h sig.h pathnames.h externs.h
|
arrayfunc.o: make_cmd.h subst.h sig.h pathnames.h externs.h
|
||||||
arrayfunc.o: $(DEFSRC)/common.h
|
arrayfunc.o: $(DEFSRC)/common.h
|
||||||
arrayfunc.o: ${BASHINCDIR}/shmbutil.h
|
arrayfunc.o: ${BASHINCDIR}/shmbutil.h
|
||||||
|
assoc.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
|
||||||
|
assoc.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h
|
||||||
|
assoc.o: command.h ${BASHINCDIR}/stdc.h error.h
|
||||||
|
assoc.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h
|
||||||
|
assoc.o: assoc.h hashlib.h
|
||||||
|
assoc.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
|
||||||
|
assoc.o: make_cmd.h subst.h sig.h pathnames.h externs.h
|
||||||
|
assoc.o: $(DEFSRC)/common.h
|
||||||
braces.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
|
braces.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
|
||||||
braces.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
|
braces.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
|
||||||
braces.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h
|
braces.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h
|
||||||
|
|
@ -1367,6 +1396,9 @@ builtins/complete.o: bashtypes.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
|
||||||
builtins/complete.o: builtins.h
|
builtins/complete.o: builtins.h
|
||||||
builtins/complete.o: pcomplete.h
|
builtins/complete.o: pcomplete.h
|
||||||
builtins/complete.o: ${DEFSRC}/common.h ${DEFSRC}/bashgetopt.h
|
builtins/complete.o: ${DEFSRC}/common.h ${DEFSRC}/bashgetopt.h
|
||||||
|
builtins/mapfile.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
|
||||||
|
builtins/mapfile.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
|
||||||
|
builtins/mapfile.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
|
||||||
|
|
||||||
# libintl dependencies
|
# libintl dependencies
|
||||||
builtins/bind.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
builtins/bind.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
|
|
@ -1390,7 +1422,8 @@ builtins/inlib.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
builtins/jobs.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
builtins/jobs.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
builtins/kill.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
builtins/kill.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
builtins/let.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
builtins/let.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
builtins/mkbuiltins.c: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
builtins/mapfile.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
|
builtins/mkbuiltins.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
builtins/printf.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
builtins/printf.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
builtins/pushd.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
builtins/pushd.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
builtins/read.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
builtins/read.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
|
|
@ -1441,6 +1474,7 @@ builtins/inlib.o: $(DEFSRC)/inlib.def
|
||||||
builtins/jobs.o: $(DEFSRC)/jobs.def
|
builtins/jobs.o: $(DEFSRC)/jobs.def
|
||||||
builtins/kill.o: $(DEFSRC)/kill.def
|
builtins/kill.o: $(DEFSRC)/kill.def
|
||||||
builtins/let.o: $(DEFSRC)/let.def
|
builtins/let.o: $(DEFSRC)/let.def
|
||||||
|
builtins/mapfile.o: $(DEFSRC)/mapfile.def
|
||||||
builtins/pushd.o: $(DEFSRC)/pushd.def
|
builtins/pushd.o: $(DEFSRC)/pushd.def
|
||||||
builtins/read.o: $(DEFSRC)/read.def
|
builtins/read.o: $(DEFSRC)/read.def
|
||||||
builtins/reserved.o: $(DEFSRC)/reserved.def
|
builtins/reserved.o: $(DEFSRC)/reserved.def
|
||||||
|
|
|
||||||
198
NEWS
198
NEWS
|
|
@ -1,3 +1,201 @@
|
||||||
|
This is a terse description of the new features added to bash-4.0 since
|
||||||
|
the release of bash-3.2. As always, the manual page (doc/bash.1) is
|
||||||
|
the place to look for complete descriptions.
|
||||||
|
|
||||||
|
1. New Features in Bash
|
||||||
|
|
||||||
|
a. When using substring expansion on the positional parameters, a starting
|
||||||
|
index of 0 now causes $0 to be prefixed to the list.
|
||||||
|
|
||||||
|
b. The `help' builtin now prints its columns with entries sorted vertically
|
||||||
|
rather than horizontally.
|
||||||
|
|
||||||
|
c. There is a new variable, $BASHPID, which always returns the process id of
|
||||||
|
the current shell.
|
||||||
|
|
||||||
|
d. There is a new `autocd' option that, when enabled, causes bash to attempt
|
||||||
|
to `cd' to a directory name that is supplied as the first word of a
|
||||||
|
simple command.
|
||||||
|
|
||||||
|
e. There is a new `checkjobs' option that causes the shell to check for and
|
||||||
|
report any running or stopped jobs at exit.
|
||||||
|
|
||||||
|
f. The programmable completion code exports a new COMP_TYPE variable, set to
|
||||||
|
a character describing the type of completion being attempted.
|
||||||
|
|
||||||
|
g. The programmable completion code exports a new COMP_KEY variable, set to
|
||||||
|
the character that caused the completion to be invoked (e.g., TAB).
|
||||||
|
|
||||||
|
h. If creation of a child process fails due to insufficient resources, bash
|
||||||
|
will try again several times before reporting failure.
|
||||||
|
|
||||||
|
i. The programmable completion code now uses the same set of characters as
|
||||||
|
readline when breaking the command line into a list of words.
|
||||||
|
|
||||||
|
j. The block multiplier for the ulimit -c and -f options is now 512 when in
|
||||||
|
Posix mode, as Posix specifies.
|
||||||
|
|
||||||
|
k. Changed the behavior of the read builtin to save any partial input received
|
||||||
|
in the specified variable when the read builtin times out. This also
|
||||||
|
results in variables specified as arguments to read to be set to the empty
|
||||||
|
string when there is no input available. When the read builtin times out,
|
||||||
|
it returns an exit status greater than 128.
|
||||||
|
|
||||||
|
l. The shell now has the notion of a `compatibility level', controlled by
|
||||||
|
new variables settable by `shopt'. Setting this variable currently
|
||||||
|
restores the bash-3.1 behavior when processing quoted strings on the rhs
|
||||||
|
of the `=~' operator to the `[[' command.
|
||||||
|
|
||||||
|
m. The `ulimit' builtin now has new -b (socket buffer size) and -T (number
|
||||||
|
of threads) options.
|
||||||
|
|
||||||
|
n. The -p option to `declare' now displays all variable values and attributes
|
||||||
|
(or function values and attributes if used with -f).
|
||||||
|
|
||||||
|
o. There is a new `compopt' builtin that allows completion functions to modify
|
||||||
|
completion options for existing completions or the completion currently
|
||||||
|
being executed.
|
||||||
|
|
||||||
|
p. The `read' builtin has a new -i option which inserts text into the reply
|
||||||
|
buffer when using readline.
|
||||||
|
|
||||||
|
q. A new `-E' option to the complete builtin allows control of the default
|
||||||
|
behavior for completion on an empty line.
|
||||||
|
|
||||||
|
r. There is now limited support for completing command name words containing
|
||||||
|
globbing characters.
|
||||||
|
|
||||||
|
s. Changed format of internal help documentation for all builtins to roughly
|
||||||
|
follow man page format.
|
||||||
|
|
||||||
|
t. The `help' builtin now has a new -d option, to display a short description,
|
||||||
|
and a -m option, to print help information in a man page-like format.
|
||||||
|
|
||||||
|
u. There is a new `mapfile' builtin to populate an array with lines from a
|
||||||
|
given file.
|
||||||
|
|
||||||
|
v. If a command is not found, the shell attempts to execute a shell function
|
||||||
|
named `command_not_found_handle', supplying the command words as the
|
||||||
|
function arguments.
|
||||||
|
|
||||||
|
w. There is a new shell option: `globstar'. When enabled, the globbing code
|
||||||
|
treats `**' specially -- it matches all directories (and files within
|
||||||
|
them, when appropriate) recursively.
|
||||||
|
|
||||||
|
x. There is a new shell option: `dirspell'. When enabled, the filename
|
||||||
|
completion code performs spelling correction on directory names during
|
||||||
|
completion.
|
||||||
|
|
||||||
|
y. The `-t' option to the `read' builtin now supports fractional timeout
|
||||||
|
values.
|
||||||
|
|
||||||
|
z. Brace expansion now allows zero-padding of expanded numeric values and
|
||||||
|
will add the proper number of zeroes to make sure all values contain the
|
||||||
|
same number of digits.
|
||||||
|
|
||||||
|
aa. There is a new bash-specific bindable readline function: `dabbrev-expand'.
|
||||||
|
It uses menu completion on a set of words taken from the history list.
|
||||||
|
|
||||||
|
bb. The command assigned to a key sequence with `bind -x' now sets two new
|
||||||
|
variables in the environment of the executed command: READLINE_LINE_BUFFER
|
||||||
|
and READLINE_POINT. The command can change the current readline line
|
||||||
|
and cursor position by modifying READLINE_LINE_BUFFER and READLINE_POINT,
|
||||||
|
respectively.
|
||||||
|
|
||||||
|
cc. There is a new >>& redirection operator, which appends the standard output
|
||||||
|
and standard error to the named file.
|
||||||
|
|
||||||
|
dd. The parser now understands `|&' as a synonym for `2>&1 |', which redirects
|
||||||
|
the standard error for a command through a pipe.
|
||||||
|
|
||||||
|
ee. The new `;&' case statement action list terminator causes execution to
|
||||||
|
continue with the action associated with the next pattern in the
|
||||||
|
statement rather than terminating the command.
|
||||||
|
|
||||||
|
ff. The new `;;&' case statement action list terminator causes the shell to
|
||||||
|
test the next set of patterns after completing execution of the current
|
||||||
|
action, rather than terminating the command.
|
||||||
|
|
||||||
|
gg. The shell understands a new variable: PROMPT_DIRTRIM. When set to an
|
||||||
|
integer value greater than zero, prompt expansion of \w and \W will
|
||||||
|
retain only that number of trailing pathname components and replace
|
||||||
|
the intervening characters with `...'.
|
||||||
|
|
||||||
|
hh. There are new case-modifying word expansions: uppercase (^[^]) and
|
||||||
|
lowercase (,[,]). They can work on either the first character or
|
||||||
|
array element, or globally. They accept an optional shell pattern
|
||||||
|
that determines which characters to modify. There is an optionally-
|
||||||
|
configured feature to include capitalization operators.
|
||||||
|
|
||||||
|
ii. The shell provides associative array variables, with the appropriate
|
||||||
|
support to create, delete, assign values to, and expand them.
|
||||||
|
|
||||||
|
jj. The `declare' builtin now has new -l (convert value to lowercase upon
|
||||||
|
assignment) and -u (convert value to uppercase upon assignment) options.
|
||||||
|
There is an optionally-configurable -c option to capitalize a value at
|
||||||
|
assignment.
|
||||||
|
|
||||||
|
kk. There is a new `coproc' reserved word that specifies a coprocess: an
|
||||||
|
asynchronous command run with two pipes connected to the creating shell.
|
||||||
|
Coprocs can be named. The input and output file descriptors and the
|
||||||
|
PID of the coprocess are available to the calling shell in variables
|
||||||
|
with coproc-specific names.
|
||||||
|
|
||||||
|
ll. A value of 0 for the -t option to `read' now returns success if there is
|
||||||
|
input available to be read from the specified file descriptor.
|
||||||
|
|
||||||
|
mm. CDPATH and GLOBIGNORE are ignored when the shell is running in privileged
|
||||||
|
mode.
|
||||||
|
|
||||||
|
nn. New bindable readline functions shell-forward-word and shell-backward-word,
|
||||||
|
which move forward and backward words delimited by shell metacharacters
|
||||||
|
and honor shell quoting.
|
||||||
|
|
||||||
|
oo. New bindable readline functions shell-backward-kill-word and shell-kill-word
|
||||||
|
which kill words backward and forward, but use the same word boundaries
|
||||||
|
as shell-forward-word and shell-backward-word.
|
||||||
|
|
||||||
|
2. New Features in Readline
|
||||||
|
|
||||||
|
a. A new variable, rl_sort_completion_matches; allows applications to inhibit
|
||||||
|
match list sorting (but beware: some things don't work right if
|
||||||
|
applications do this).
|
||||||
|
|
||||||
|
b. A new variable, rl_completion_invoking_key; allows applications to discover
|
||||||
|
the key that invoked rl_complete or rl_menu_complete.
|
||||||
|
|
||||||
|
c. The functions rl_block_sigint and rl_release_sigint are now public and
|
||||||
|
available to calling applications who want to protect critical sections
|
||||||
|
(like redisplay).
|
||||||
|
|
||||||
|
d. The functions rl_save_state and rl_restore_state are now public and
|
||||||
|
available to calling applications; documented rest of readline's state
|
||||||
|
flag values.
|
||||||
|
|
||||||
|
e. A new user-settable variable, `history-size', allows setting the maximum
|
||||||
|
number of entries in the history list.
|
||||||
|
|
||||||
|
f. There is a new implementation of menu completion, with several improvements
|
||||||
|
over the old; the most notable improvement is a better `completions
|
||||||
|
browsing' mode.
|
||||||
|
|
||||||
|
g. The menu completion code now uses the rl_menu_completion_entry_function
|
||||||
|
variable, allowing applications to provide their own menu completion
|
||||||
|
generators.
|
||||||
|
|
||||||
|
h. There is support for replacing a prefix of a pathname with a `...' when
|
||||||
|
displaying possible completions. This is controllable by setting the
|
||||||
|
`completion-prefix-display-length' variable. Matches with a common prefix
|
||||||
|
longer than this value have the common prefix replaced with `...'.
|
||||||
|
|
||||||
|
i. There is a new `revert-all-at-newline' variable. If enabled, readline will
|
||||||
|
undo all outstanding changes to all history lines when `accept-line' is
|
||||||
|
executed.
|
||||||
|
|
||||||
|
j. If the kernel supports it, readline displays special characters
|
||||||
|
corresponding to a keyboard-generated signal when the signal is received.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
This is a terse description of the new features added to bash-3.2 since
|
This is a terse description of the new features added to bash-3.2 since
|
||||||
the release of bash-3.1. As always, the manual page (doc/bash.1) is
|
the release of bash-3.1. As always, the manual page (doc/bash.1) is
|
||||||
the place to look for complete descriptions.
|
the place to look for complete descriptions.
|
||||||
|
|
|
||||||
10
NOTES
10
NOTES
|
|
@ -335,3 +335,13 @@ Platform-Specific Configuration and Operation Notes
|
||||||
17. Do NOT use bison-1.75. It builds a non-working parser. The most
|
17. Do NOT use bison-1.75. It builds a non-working parser. The most
|
||||||
obvious effect is that constructs like "for i; do echo $i; done" don't
|
obvious effect is that constructs like "for i; do echo $i; done" don't
|
||||||
loop over the positional parameters.
|
loop over the positional parameters.
|
||||||
|
|
||||||
|
18. I have received reports that using -O2 with the MIPSpro results in a
|
||||||
|
binary that fails in strange ways. Using -O1 seems to work.
|
||||||
|
|
||||||
|
19. There is special handling to ensure the shell links against static
|
||||||
|
versions of the included readline and history libraries on Mac OS X;
|
||||||
|
Apple ships inadequate dynamic libreadline and libhistory "replacements"
|
||||||
|
as standard libraries.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
5
POSIX
5
POSIX
|
|
@ -154,13 +154,16 @@ The following list is what's changed when `POSIX mode' is in effect:
|
||||||
`$PATH'.
|
`$PATH'.
|
||||||
|
|
||||||
40. The `vi' editing mode will invoke the `vi' editor directly when
|
40. The `vi' editing mode will invoke the `vi' editor directly when
|
||||||
the `v' command is run, instead of checking `$FCEDIT' and
|
the `v' command is run, instead of checking `$VISUAL' and
|
||||||
`$EDITOR'.
|
`$EDITOR'.
|
||||||
|
|
||||||
41. When the `xpg_echo' option is enabled, Bash does not attempt to
|
41. When the `xpg_echo' option is enabled, Bash does not attempt to
|
||||||
interpret any arguments to `echo' as options. Each argument is
|
interpret any arguments to `echo' as options. Each argument is
|
||||||
displayed, after escape characters are converted.
|
displayed, after escape characters are converted.
|
||||||
|
|
||||||
|
42. The `ulimit' builtin uses a block size of 512 bytes for the `-c'
|
||||||
|
and `-f' options.
|
||||||
|
|
||||||
|
|
||||||
There is other POSIX behavior that Bash does not implement by default
|
There is other POSIX behavior that Bash does not implement by default
|
||||||
even when in POSIX mode. Specifically:
|
even when in POSIX mode. Specifically:
|
||||||
|
|
|
||||||
13
README
13
README
|
|
@ -1,7 +1,7 @@
|
||||||
Introduction
|
Introduction
|
||||||
============
|
============
|
||||||
|
|
||||||
This is GNU Bash, version 3.2. Bash is the GNU Project's Bourne
|
This is GNU Bash, version 4.0. 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
|
||||||
|
|
@ -15,13 +15,14 @@ See the file POSIX for a discussion of how the Bash defaults differ
|
||||||
from the POSIX.2 spec and a description of the Bash `posix mode'.
|
from the POSIX.2 spec and a description of the Bash `posix mode'.
|
||||||
|
|
||||||
There are some user-visible incompatibilities between this version
|
There are some user-visible incompatibilities between this version
|
||||||
of Bash and previous widely-distributed versions, bash-1.14 and
|
of Bash and previous widely-distributed versions, bash-2.05b and
|
||||||
bash-2.05b. For details, see the file COMPAT. The NEWS file tersely
|
bash-3.2. For details, see the file COMPAT. The NEWS file tersely
|
||||||
lists features that are new in this release.
|
lists features that are new in this release.
|
||||||
|
|
||||||
Bash is free software, distributed under the terms of the [GNU]
|
Bash is free software, distributed under the terms of the [GNU] General
|
||||||
General Public License, version 2. For more information, see the
|
Public License as published by the Free Software Foundation,
|
||||||
file COPYING.
|
version 3 of the License (or any later version). For more information,
|
||||||
|
see the file COPYING.
|
||||||
|
|
||||||
A number of frequently-asked questions are answered in the file
|
A number of frequently-asked questions are answered in the file
|
||||||
`doc/FAQ'.
|
`doc/FAQ'.
|
||||||
|
|
|
||||||
51
aclocal.m4
vendored
51
aclocal.m4
vendored
|
|
@ -215,7 +215,7 @@ AC_CACHE_VAL(bash_cv_sys_siglist,
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
#ifndef SYS_SIGLIST_DECLARED
|
#if !HAVE_DECL_SYS_SIGLIST
|
||||||
extern char *sys_siglist[];
|
extern char *sys_siglist[];
|
||||||
#endif
|
#endif
|
||||||
main()
|
main()
|
||||||
|
|
@ -336,18 +336,18 @@ main()
|
||||||
{
|
{
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
int fd, err;
|
int fd, err;
|
||||||
err = mkdir("/tmp/bash-aclocal", 0700);
|
err = mkdir("bash-aclocal", 0700);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
perror("mkdir");
|
perror("mkdir");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
unlink("/tmp/bash-aclocal/not_a_directory");
|
unlink("bash-aclocal/not_a_directory");
|
||||||
fd = open("/tmp/bash-aclocal/not_a_directory", O_WRONLY|O_CREAT|O_EXCL, 0666);
|
fd = open("bash-aclocal/not_a_directory", O_WRONLY|O_CREAT|O_EXCL, 0666);
|
||||||
write(fd, "\n", 1);
|
write(fd, "\n", 1);
|
||||||
close(fd);
|
close(fd);
|
||||||
dir = opendir("/tmp/bash-aclocal/not_a_directory");
|
dir = opendir("bash-aclocal/not_a_directory");
|
||||||
unlink("/tmp/bash-aclocal/not_a_directory");
|
unlink("bash-aclocal/not_a_directory");
|
||||||
rmdir("/tmp/bash-aclocal");
|
rmdir("bash-aclocal");
|
||||||
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_WARN(cannot check opendir if cross compiling -- defaulting to no)
|
[AC_MSG_WARN(cannot check opendir if cross compiling -- defaulting to no)
|
||||||
|
|
@ -685,7 +685,7 @@ fi
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN(BASH_FUNC_GETCWD,
|
AC_DEFUN(BASH_FUNC_GETCWD,
|
||||||
[AC_MSG_CHECKING([if getcwd() will dynamically allocate memory])
|
[AC_MSG_CHECKING([if getcwd() will dynamically allocate memory with 0 size])
|
||||||
AC_CACHE_VAL(bash_cv_getcwd_malloc,
|
AC_CACHE_VAL(bash_cv_getcwd_malloc,
|
||||||
[AC_TRY_RUN([
|
[AC_TRY_RUN([
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
@ -1423,19 +1423,19 @@ exit (1);
|
||||||
#if defined (NeXT)
|
#if defined (NeXT)
|
||||||
exit (1);
|
exit (1);
|
||||||
#endif
|
#endif
|
||||||
err = mkdir("/tmp/bash-aclocal", 0700);
|
err = mkdir("bash-aclocal", 0700);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
perror ("mkdir");
|
perror ("mkdir");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
fd = mknod ("/tmp/bash-aclocal/sh-np-autoconf", 0666 | S_IFIFO, 0);
|
fd = mknod ("bash-aclocal/sh-np-autoconf", 0666 | S_IFIFO, 0);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
rmdir ("/tmp/bash-aclocal");
|
rmdir ("bash-aclocal");
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
unlink ("/tmp/bash-aclocal/sh-np-autoconf");
|
unlink ("bash-aclocal/sh-np-autoconf");
|
||||||
rmdir ("/tmp/bash-aclocal");
|
rmdir ("bash-aclocal");
|
||||||
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_WARN(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)
|
||||||
|
|
@ -1541,18 +1541,16 @@ AC_DEFUN(BASH_CHECK_DEV_FD,
|
||||||
[AC_MSG_CHECKING(whether /dev/fd is available)
|
[AC_MSG_CHECKING(whether /dev/fd is available)
|
||||||
AC_CACHE_VAL(bash_cv_dev_fd,
|
AC_CACHE_VAL(bash_cv_dev_fd,
|
||||||
[bash_cv_dev_fd=""
|
[bash_cv_dev_fd=""
|
||||||
if test -d /dev/fd && test -r /dev/fd/0 < /dev/null; then
|
if test -d /dev/fd && (exec test -r /dev/fd/0 < /dev/null) ; then
|
||||||
# check for systems like FreeBSD 5 that only provide /dev/fd/[012]
|
# check for systems like FreeBSD 5 that only provide /dev/fd/[012]
|
||||||
exec 3</dev/null
|
if (exec test -r /dev/fd/3 3</dev/null) ; then
|
||||||
if test -r /dev/fd/3; then
|
|
||||||
bash_cv_dev_fd=standard
|
bash_cv_dev_fd=standard
|
||||||
else
|
else
|
||||||
bash_cv_dev_fd=absent
|
bash_cv_dev_fd=absent
|
||||||
fi
|
fi
|
||||||
exec 3<&-
|
|
||||||
fi
|
fi
|
||||||
if test -z "$bash_cv_dev_fd" ; then
|
if test -z "$bash_cv_dev_fd" ; then
|
||||||
if test -d /proc/self/fd && test -r /proc/self/fd/0 < /dev/null; then
|
if test -d /proc/self/fd && (exec test -r /proc/self/fd/0 < /dev/null) ; then
|
||||||
bash_cv_dev_fd=whacky
|
bash_cv_dev_fd=whacky
|
||||||
else
|
else
|
||||||
bash_cv_dev_fd=absent
|
bash_cv_dev_fd=absent
|
||||||
|
|
@ -1572,9 +1570,9 @@ fi
|
||||||
AC_DEFUN(BASH_CHECK_DEV_STDIN,
|
AC_DEFUN(BASH_CHECK_DEV_STDIN,
|
||||||
[AC_MSG_CHECKING(whether /dev/stdin stdout stderr are available)
|
[AC_MSG_CHECKING(whether /dev/stdin stdout stderr are available)
|
||||||
AC_CACHE_VAL(bash_cv_dev_stdin,
|
AC_CACHE_VAL(bash_cv_dev_stdin,
|
||||||
[if test -d /dev/fd && test -r /dev/stdin < /dev/null; then
|
[if test -d /dev/fd && (exec test -r /dev/stdin < /dev/null) ; then
|
||||||
bash_cv_dev_stdin=present
|
bash_cv_dev_stdin=present
|
||||||
elif test -d /proc/self/fd && test -r /dev/stdin < /dev/null; then
|
elif test -d /proc/self/fd && (exec test -r /dev/stdin < /dev/null) ; then
|
||||||
bash_cv_dev_stdin=present
|
bash_cv_dev_stdin=present
|
||||||
else
|
else
|
||||||
bash_cv_dev_stdin=absent
|
bash_cv_dev_stdin=absent
|
||||||
|
|
@ -1679,8 +1677,9 @@ AC_CHECK_HEADERS(wctype.h)
|
||||||
AC_CHECK_HEADERS(wchar.h)
|
AC_CHECK_HEADERS(wchar.h)
|
||||||
AC_CHECK_HEADERS(langinfo.h)
|
AC_CHECK_HEADERS(langinfo.h)
|
||||||
|
|
||||||
AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS))
|
|
||||||
AC_CHECK_FUNC(mbrlen, AC_DEFINE(HAVE_MBRLEN))
|
AC_CHECK_FUNC(mbrlen, AC_DEFINE(HAVE_MBRLEN))
|
||||||
|
AC_CHECK_FUNC(mbscmp, AC_DEFINE(HAVE_MBSCMP))
|
||||||
|
AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS))
|
||||||
|
|
||||||
AC_CHECK_FUNC(wcrtomb, AC_DEFINE(HAVE_WCRTOMB))
|
AC_CHECK_FUNC(wcrtomb, AC_DEFINE(HAVE_WCRTOMB))
|
||||||
AC_CHECK_FUNC(wcscoll, AC_DEFINE(HAVE_WCSCOLL))
|
AC_CHECK_FUNC(wcscoll, AC_DEFINE(HAVE_WCSCOLL))
|
||||||
|
|
@ -2366,7 +2365,7 @@ AC_DEFUN([AM_INTL_SUBDIR],
|
||||||
AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
|
AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
|
||||||
stdlib.h string.h unistd.h sys/param.h])
|
stdlib.h string.h unistd.h sys/param.h])
|
||||||
AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \
|
AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \
|
||||||
geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \
|
geteuid getgid getuid mempcpy munmap putenv setenv setlocale localeconv stpcpy \
|
||||||
strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next \
|
strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next \
|
||||||
__fsetlocking])
|
__fsetlocking])
|
||||||
|
|
||||||
|
|
@ -3999,3 +3998,11 @@ AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG],
|
||||||
[Define if you have the unsigned long long type.])
|
[Define if you have the unsigned long long type.])
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl From gnulib
|
||||||
|
AC_DEFUN([BASH_FUNC_FPURGE],
|
||||||
|
[
|
||||||
|
AC_CHECK_FUNCS_ONCE([fpurge])
|
||||||
|
AC_CHECK_FUNCS_ONCE([__fpurge])
|
||||||
|
AC_CHECK_DECLS([fpurge], , , [#include <stdio.h>])
|
||||||
|
])
|
||||||
|
|
|
||||||
24
alias.c
24
alias.c
|
|
@ -1,23 +1,23 @@
|
||||||
/* alias.c -- Not a full alias, but just the kind that we use in the
|
/* alias.c -- Not a full alias, but just the kind that we use in the
|
||||||
shell. Csh style alias is somewhere else (`over there, in a box'). */
|
shell. Csh style alias is somewhere else (`over there, in a box'). */
|
||||||
|
|
||||||
/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it
|
Bash is free software: you can redistribute it and/or modify
|
||||||
under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT
|
Bash is distributed in the hope that it will be useful,
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Bash; see the file COPYING. If not, write to the Free
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
|
@ -67,7 +67,7 @@ HASH_TABLE *aliases = (HASH_TABLE *)NULL;
|
||||||
void
|
void
|
||||||
initialize_aliases ()
|
initialize_aliases ()
|
||||||
{
|
{
|
||||||
if (!aliases)
|
if (aliases == 0)
|
||||||
aliases = hash_create (ALIAS_HASH_BUCKETS);
|
aliases = hash_create (ALIAS_HASH_BUCKETS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
22
alias.h
22
alias.h
|
|
@ -1,22 +1,22 @@
|
||||||
/* alias.h -- structure definitions. */
|
/* alias.h -- structure definitions. */
|
||||||
|
|
||||||
/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
|
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it
|
Bash is free software: you can redistribute it and/or modify
|
||||||
under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 1, or (at your option)
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT
|
Bash is distributed in the hope that it will be useful,
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Bash; see the file COPYING. If not, write to the Free
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (_ALIAS_H_)
|
#if !defined (_ALIAS_H_)
|
||||||
#define _ALIAS_H_
|
#define _ALIAS_H_
|
||||||
|
|
|
||||||
177
array.c
177
array.c
|
|
@ -9,23 +9,23 @@
|
||||||
* chet@ins.cwru.edu
|
* chet@ins.cwru.edu
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Copyright (C) 1997-2004 Free Software Foundation, Inc.
|
/* Copyright (C) 1997-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
|
@ -137,7 +137,7 @@ ARRAY_ELEMENT *s, *e;
|
||||||
a = array_create ();
|
a = array_create ();
|
||||||
a->type = array->type;
|
a->type = array->type;
|
||||||
|
|
||||||
for (p = s, i = 0; p != e; p = element_forw(p), i++) {
|
for (mi = 0, p = s, i = 0; p != e; p = element_forw(p), i++) {
|
||||||
n = array_create_element (element_index(p), element_value(p));
|
n = array_create_element (element_index(p), element_value(p));
|
||||||
ADD_BEFORE(a->head, n);
|
ADD_BEFORE(a->head, n);
|
||||||
mi = element_index(n);
|
mi = element_index(n);
|
||||||
|
|
@ -315,6 +315,54 @@ ARRAY *array;
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ARRAY *
|
||||||
|
array_dequote(array)
|
||||||
|
ARRAY *array;
|
||||||
|
{
|
||||||
|
ARRAY_ELEMENT *a;
|
||||||
|
char *t;
|
||||||
|
|
||||||
|
if (array == 0 || array_head(array) == 0 || array_empty(array))
|
||||||
|
return (ARRAY *)NULL;
|
||||||
|
for (a = element_forw(array->head); a != array->head; a = element_forw(a)) {
|
||||||
|
t = dequote_string (a->value);
|
||||||
|
FREE(a->value);
|
||||||
|
a->value = t;
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
ARRAY *
|
||||||
|
array_dequote_escapes(array)
|
||||||
|
ARRAY *array;
|
||||||
|
{
|
||||||
|
ARRAY_ELEMENT *a;
|
||||||
|
char *t;
|
||||||
|
|
||||||
|
if (array == 0 || array_head(array) == 0 || array_empty(array))
|
||||||
|
return (ARRAY *)NULL;
|
||||||
|
for (a = element_forw(array->head); a != array->head; a = element_forw(a)) {
|
||||||
|
t = dequote_escapes (a->value);
|
||||||
|
FREE(a->value);
|
||||||
|
a->value = t;
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
ARRAY *
|
||||||
|
array_remove_quoted_nulls(array)
|
||||||
|
ARRAY *array;
|
||||||
|
{
|
||||||
|
ARRAY_ELEMENT *a;
|
||||||
|
char *t;
|
||||||
|
|
||||||
|
if (array == 0 || array_head(array) == 0 || array_empty(array))
|
||||||
|
return (ARRAY *)NULL;
|
||||||
|
for (a = element_forw(array->head); a != array->head; a = element_forw(a))
|
||||||
|
a->value = remove_quoted_nulls (a->value);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return a string whose elements are the members of array A beginning at
|
* Return a string whose elements are the members of array A beginning at
|
||||||
* index START and spanning NELEM members. Null elements are counted.
|
* index START and spanning NELEM members. Null elements are counted.
|
||||||
|
|
@ -329,7 +377,8 @@ int starsub, quoted;
|
||||||
ARRAY *a2;
|
ARRAY *a2;
|
||||||
ARRAY_ELEMENT *h, *p;
|
ARRAY_ELEMENT *h, *p;
|
||||||
arrayind_t i;
|
arrayind_t i;
|
||||||
char *ifs, sep[2], *t;
|
char *ifs, *sifs, *t;
|
||||||
|
int slen;
|
||||||
|
|
||||||
p = a ? array_head (a) : 0;
|
p = a ? array_head (a) : 0;
|
||||||
if (p == 0 || array_empty (a) || start > array_max_index(a))
|
if (p == 0 || array_empty (a) || start > array_max_index(a))
|
||||||
|
|
@ -360,13 +409,25 @@ int starsub, quoted;
|
||||||
array_quote_escapes(a2);
|
array_quote_escapes(a2);
|
||||||
|
|
||||||
if (starsub && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) {
|
if (starsub && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) {
|
||||||
ifs = getifs();
|
/* ${array[*]} */
|
||||||
sep[0] = ifs ? *ifs : '\0';
|
array_remove_quoted_nulls (a2);
|
||||||
|
sifs = ifs_firstchar ((int *)NULL);
|
||||||
|
t = array_to_string (a2, sifs, 0);
|
||||||
|
free (sifs);
|
||||||
|
} else if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) {
|
||||||
|
/* ${array[@]} */
|
||||||
|
sifs = ifs_firstchar (&slen);
|
||||||
|
ifs = getifs ();
|
||||||
|
if (ifs == 0 || *ifs == 0) {
|
||||||
|
if (slen < 2)
|
||||||
|
sifs = xrealloc(sifs, 2);
|
||||||
|
sifs[0] = ' ';
|
||||||
|
sifs[1] = '\0';
|
||||||
|
}
|
||||||
|
t = array_to_string (a2, sifs, 0);
|
||||||
|
free (sifs);
|
||||||
} else
|
} else
|
||||||
sep[0] = ' ';
|
t = array_to_string (a2, " ", 0);
|
||||||
sep[1] = '\0';
|
|
||||||
|
|
||||||
t = array_to_string (a2, sep, 0);
|
|
||||||
array_dispose(a2);
|
array_dispose(a2);
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
|
|
@ -380,7 +441,8 @@ int mflags;
|
||||||
{
|
{
|
||||||
ARRAY *a2;
|
ARRAY *a2;
|
||||||
ARRAY_ELEMENT *e;
|
ARRAY_ELEMENT *e;
|
||||||
char *t, *ifs, sifs[2];
|
char *t, *sifs, *ifs;
|
||||||
|
int slen;
|
||||||
|
|
||||||
if (a == 0 || array_head(a) == 0 || array_empty(a))
|
if (a == 0 || array_head(a) == 0 || array_empty(a))
|
||||||
return ((char *)NULL);
|
return ((char *)NULL);
|
||||||
|
|
@ -396,11 +458,24 @@ int mflags;
|
||||||
array_quote(a2);
|
array_quote(a2);
|
||||||
else
|
else
|
||||||
array_quote_escapes(a2);
|
array_quote_escapes(a2);
|
||||||
|
|
||||||
if (mflags & MATCH_STARSUB) {
|
if (mflags & MATCH_STARSUB) {
|
||||||
ifs = getifs();
|
array_remove_quoted_nulls (a2);
|
||||||
sifs[0] = ifs ? *ifs : '\0';
|
sifs = ifs_firstchar((int *)NULL);
|
||||||
sifs[1] = '\0';
|
|
||||||
t = array_to_string (a2, sifs, 0);
|
t = array_to_string (a2, sifs, 0);
|
||||||
|
free(sifs);
|
||||||
|
} else if (mflags & MATCH_QUOTED) {
|
||||||
|
/* ${array[@]} */
|
||||||
|
sifs = ifs_firstchar (&slen);
|
||||||
|
ifs = getifs ();
|
||||||
|
if (ifs == 0 || *ifs == 0) {
|
||||||
|
if (slen < 2)
|
||||||
|
sifs = xrealloc (sifs, 2);
|
||||||
|
sifs[0] = ' ';
|
||||||
|
sifs[1] = '\0';
|
||||||
|
}
|
||||||
|
t = array_to_string (a2, sifs, 0);
|
||||||
|
free(sifs);
|
||||||
} else
|
} else
|
||||||
t = array_to_string (a2, " ", 0);
|
t = array_to_string (a2, " ", 0);
|
||||||
array_dispose (a2);
|
array_dispose (a2);
|
||||||
|
|
@ -408,6 +483,56 @@ int mflags;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
array_modcase (a, pat, modop, mflags)
|
||||||
|
ARRAY *a;
|
||||||
|
char *pat;
|
||||||
|
int modop;
|
||||||
|
int mflags;
|
||||||
|
{
|
||||||
|
ARRAY *a2;
|
||||||
|
ARRAY_ELEMENT *e;
|
||||||
|
char *t, *sifs, *ifs;
|
||||||
|
int slen;
|
||||||
|
|
||||||
|
if (a == 0 || array_head(a) == 0 || array_empty(a))
|
||||||
|
return ((char *)NULL);
|
||||||
|
|
||||||
|
a2 = array_copy(a);
|
||||||
|
for (e = element_forw(a2->head); e != a2->head; e = element_forw(e)) {
|
||||||
|
t = sh_modcase(element_value(e), pat, modop);
|
||||||
|
FREE(element_value(e));
|
||||||
|
e->value = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mflags & MATCH_QUOTED)
|
||||||
|
array_quote(a2);
|
||||||
|
else
|
||||||
|
array_quote_escapes(a2);
|
||||||
|
|
||||||
|
if (mflags & MATCH_STARSUB) {
|
||||||
|
array_remove_quoted_nulls (a2);
|
||||||
|
sifs = ifs_firstchar((int *)NULL);
|
||||||
|
t = array_to_string (a2, sifs, 0);
|
||||||
|
free(sifs);
|
||||||
|
} else if (mflags & MATCH_QUOTED) {
|
||||||
|
/* ${array[@]} */
|
||||||
|
sifs = ifs_firstchar (&slen);
|
||||||
|
ifs = getifs ();
|
||||||
|
if (ifs == 0 || *ifs == 0) {
|
||||||
|
if (slen < 2)
|
||||||
|
sifs = xrealloc (sifs, 2);
|
||||||
|
sifs[0] = ' ';
|
||||||
|
sifs[1] = '\0';
|
||||||
|
}
|
||||||
|
t = array_to_string (a2, sifs, 0);
|
||||||
|
free(sifs);
|
||||||
|
} else
|
||||||
|
t = array_to_string (a2, " ", 0);
|
||||||
|
array_dispose (a2);
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Allocate and return a new array element with index INDEX and value
|
* Allocate and return a new array element with index INDEX and value
|
||||||
* VALUE.
|
* VALUE.
|
||||||
|
|
@ -618,8 +743,8 @@ ARRAY *a;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return a string that is the concatenation of all the elements in A,
|
* Return a string that is the concatenation of the elements in A from START
|
||||||
* separated by SEP.
|
* to END, separated by SEP.
|
||||||
*/
|
*/
|
||||||
static char *
|
static char *
|
||||||
array_to_string_internal (start, end, sep, quoted)
|
array_to_string_internal (start, end, sep, quoted)
|
||||||
|
|
|
||||||
30
array.h
30
array.h
|
|
@ -1,23 +1,24 @@
|
||||||
/* array.h -- definitions for the interface exported by array.c that allows
|
/* array.h -- definitions for the interface exported by array.c that allows
|
||||||
the rest of the shell to manipulate array variables. */
|
the rest of the shell to manipulate array variables. */
|
||||||
|
|
||||||
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
/* Copyright (C) 1997-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
|
||||||
|
|
||||||
#ifndef _ARRAY_H_
|
#ifndef _ARRAY_H_
|
||||||
#define _ARRAY_H_
|
#define _ARRAY_H_
|
||||||
|
|
@ -54,11 +55,16 @@ extern ARRAY_ELEMENT *array_shift __P((ARRAY *, int, int));
|
||||||
extern int array_rshift __P((ARRAY *, int, char *));
|
extern int array_rshift __P((ARRAY *, int, char *));
|
||||||
extern ARRAY_ELEMENT *array_unshift_element __P((ARRAY *));
|
extern ARRAY_ELEMENT *array_unshift_element __P((ARRAY *));
|
||||||
extern int array_shift_element __P((ARRAY *, char *));
|
extern int array_shift_element __P((ARRAY *, char *));
|
||||||
|
|
||||||
extern ARRAY *array_quote __P((ARRAY *));
|
extern ARRAY *array_quote __P((ARRAY *));
|
||||||
extern ARRAY *array_quote_escapes __P((ARRAY *));
|
extern ARRAY *array_quote_escapes __P((ARRAY *));
|
||||||
|
extern ARRAY *array_dequote __P((ARRAY *));
|
||||||
|
extern ARRAY *array_dequote_escapes __P((ARRAY *));
|
||||||
|
extern ARRAY *array_remove_quoted_nulls __P((ARRAY *));
|
||||||
|
|
||||||
extern char *array_subrange __P((ARRAY *, arrayind_t, arrayind_t, int, int));
|
extern char *array_subrange __P((ARRAY *, arrayind_t, arrayind_t, int, int));
|
||||||
extern char *array_patsub __P((ARRAY *, char *, char *, int));
|
extern char *array_patsub __P((ARRAY *, char *, char *, int));
|
||||||
|
extern char *array_modcase __P((ARRAY *, char *, int, int));
|
||||||
|
|
||||||
/* Basic operations on array elements. */
|
/* Basic operations on array elements. */
|
||||||
extern ARRAY_ELEMENT *array_create_element __P((arrayind_t, char *));
|
extern ARRAY_ELEMENT *array_create_element __P((arrayind_t, char *));
|
||||||
|
|
|
||||||
332
arrayfunc.c
332
arrayfunc.c
|
|
@ -1,22 +1,22 @@
|
||||||
/* arrayfunc.c -- High-level array functions used by other parts of the shell. */
|
/* arrayfunc.c -- High-level array functions used by other parts of the shell. */
|
||||||
|
|
||||||
/* Copyright (C) 2001-2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2001-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
|
@ -30,6 +30,7 @@
|
||||||
#include "bashintl.h"
|
#include "bashintl.h"
|
||||||
|
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
|
#include "pathexp.h"
|
||||||
|
|
||||||
#include "shmbutil.h"
|
#include "shmbutil.h"
|
||||||
|
|
||||||
|
|
@ -39,13 +40,14 @@ extern char *this_command_name;
|
||||||
extern int last_command_exit_value;
|
extern int last_command_exit_value;
|
||||||
extern int array_needs_making;
|
extern int array_needs_making;
|
||||||
|
|
||||||
static SHELL_VAR *bind_array_var_internal __P((SHELL_VAR *, arrayind_t, char *, int));
|
static SHELL_VAR *bind_array_var_internal __P((SHELL_VAR *, arrayind_t, char *, char *, int));
|
||||||
|
|
||||||
|
static char *quote_assign __P((const char *));
|
||||||
static void quote_array_assignment_chars __P((WORD_LIST *));
|
static void quote_array_assignment_chars __P((WORD_LIST *));
|
||||||
static char *array_value_internal __P((char *, int, int, int *));
|
static char *array_value_internal __P((char *, int, int, int *));
|
||||||
|
|
||||||
/* Standard error message to use when encountering an invalid array subscript */
|
/* Standard error message to use when encountering an invalid array subscript */
|
||||||
char *bash_badsub_errmsg = N_("bad array subscript");
|
const char * const bash_badsub_errmsg = N_("bad array subscript");
|
||||||
|
|
||||||
/* **************************************************************** */
|
/* **************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
|
|
@ -84,10 +86,42 @@ convert_var_to_array (var)
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Convert a shell variable to an array variable. The original value is
|
||||||
|
saved as array[0]. */
|
||||||
|
SHELL_VAR *
|
||||||
|
convert_var_to_assoc (var)
|
||||||
|
SHELL_VAR *var;
|
||||||
|
{
|
||||||
|
char *oldval;
|
||||||
|
HASH_TABLE *hash;
|
||||||
|
|
||||||
|
oldval = value_cell (var);
|
||||||
|
hash = assoc_create (0);
|
||||||
|
if (oldval)
|
||||||
|
assoc_insert (hash, "0", oldval);
|
||||||
|
|
||||||
|
FREE (value_cell (var));
|
||||||
|
var_setassoc (var, hash);
|
||||||
|
|
||||||
|
/* these aren't valid anymore */
|
||||||
|
var->dynamic_value = (sh_var_value_func_t *)NULL;
|
||||||
|
var->assign_func = (sh_var_assign_func_t *)NULL;
|
||||||
|
|
||||||
|
INVALIDATE_EXPORTSTR (var);
|
||||||
|
if (exported_p (var))
|
||||||
|
array_needs_making++;
|
||||||
|
|
||||||
|
VSETATTR (var, att_assoc);
|
||||||
|
VUNSETATTR (var, att_invisible);
|
||||||
|
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
static SHELL_VAR *
|
static SHELL_VAR *
|
||||||
bind_array_var_internal (entry, ind, value, flags)
|
bind_array_var_internal (entry, ind, key, value, flags)
|
||||||
SHELL_VAR *entry;
|
SHELL_VAR *entry;
|
||||||
arrayind_t ind;
|
arrayind_t ind;
|
||||||
|
char *key;
|
||||||
char *value;
|
char *value;
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
|
|
@ -100,6 +134,9 @@ bind_array_var_internal (entry, ind, value, flags)
|
||||||
{
|
{
|
||||||
dentry = (SHELL_VAR *)xmalloc (sizeof (SHELL_VAR));
|
dentry = (SHELL_VAR *)xmalloc (sizeof (SHELL_VAR));
|
||||||
dentry->name = savestring (entry->name);
|
dentry->name = savestring (entry->name);
|
||||||
|
if (assoc_p (entry))
|
||||||
|
newval = assoc_reference (assoc_cell (entry), key);
|
||||||
|
else
|
||||||
newval = array_reference (array_cell (entry), ind);
|
newval = array_reference (array_cell (entry), ind);
|
||||||
if (newval)
|
if (newval)
|
||||||
dentry->value = savestring (newval);
|
dentry->value = savestring (newval);
|
||||||
|
|
@ -109,7 +146,7 @@ bind_array_var_internal (entry, ind, value, flags)
|
||||||
dentry->value[0] = '\0';
|
dentry->value[0] = '\0';
|
||||||
}
|
}
|
||||||
dentry->exportstr = 0;
|
dentry->exportstr = 0;
|
||||||
dentry->attributes = entry->attributes & ~(att_array|att_exported);
|
dentry->attributes = entry->attributes & ~(att_array|att_assoc|att_exported);
|
||||||
/* Leave the rest of the members uninitialized; the code doesn't look
|
/* Leave the rest of the members uninitialized; the code doesn't look
|
||||||
at them. */
|
at them. */
|
||||||
newval = make_variable_value (dentry, value, flags);
|
newval = make_variable_value (dentry, value, flags);
|
||||||
|
|
@ -119,7 +156,9 @@ bind_array_var_internal (entry, ind, value, flags)
|
||||||
newval = make_variable_value (entry, value, flags);
|
newval = make_variable_value (entry, value, flags);
|
||||||
|
|
||||||
if (entry->assign_func)
|
if (entry->assign_func)
|
||||||
(*entry->assign_func) (entry, newval, ind);
|
(*entry->assign_func) (entry, newval, ind, key);
|
||||||
|
else if (assoc_p (entry))
|
||||||
|
assoc_insert (assoc_cell (entry), key, newval);
|
||||||
else
|
else
|
||||||
array_insert (array_cell (entry), ind, newval);
|
array_insert (array_cell (entry), ind, newval);
|
||||||
FREE (newval);
|
FREE (newval);
|
||||||
|
|
@ -157,7 +196,38 @@ bind_array_variable (name, ind, value, flags)
|
||||||
entry = convert_var_to_array (entry);
|
entry = convert_var_to_array (entry);
|
||||||
|
|
||||||
/* ENTRY is an array variable, and ARRAY points to the value. */
|
/* ENTRY is an array variable, and ARRAY points to the value. */
|
||||||
return (bind_array_var_internal (entry, ind, value, flags));
|
return (bind_array_var_internal (entry, ind, 0, value, flags));
|
||||||
|
}
|
||||||
|
|
||||||
|
SHELL_VAR *
|
||||||
|
bind_array_element (entry, ind, value, flags)
|
||||||
|
SHELL_VAR *entry;
|
||||||
|
arrayind_t ind;
|
||||||
|
char *value;
|
||||||
|
int flags;
|
||||||
|
{
|
||||||
|
return (bind_array_var_internal (entry, ind, 0, value, flags));
|
||||||
|
}
|
||||||
|
|
||||||
|
SHELL_VAR *
|
||||||
|
bind_assoc_variable (entry, name, key, value, flags)
|
||||||
|
SHELL_VAR *entry;
|
||||||
|
char *name;
|
||||||
|
char *key;
|
||||||
|
char *value;
|
||||||
|
int flags;
|
||||||
|
{
|
||||||
|
SHELL_VAR *dentry;
|
||||||
|
char *newval;
|
||||||
|
|
||||||
|
if (readonly_p (entry) || noassign_p (entry))
|
||||||
|
{
|
||||||
|
if (readonly_p (entry))
|
||||||
|
err_readonly (name);
|
||||||
|
return (entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (bind_array_var_internal (entry, 0, key, value, flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse NAME, a lhs of an assignment statement of the form v[s], and
|
/* Parse NAME, a lhs of an assignment statement of the form v[s], and
|
||||||
|
|
@ -167,7 +237,7 @@ assign_array_element (name, value, flags)
|
||||||
char *name, *value;
|
char *name, *value;
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
char *sub, *vname;
|
char *sub, *vname, *akey;
|
||||||
arrayind_t ind;
|
arrayind_t ind;
|
||||||
int sublen;
|
int sublen;
|
||||||
SHELL_VAR *entry;
|
SHELL_VAR *entry;
|
||||||
|
|
@ -184,6 +254,23 @@ assign_array_element (name, value, flags)
|
||||||
return ((SHELL_VAR *)NULL);
|
return ((SHELL_VAR *)NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entry = find_variable (vname);
|
||||||
|
|
||||||
|
if (entry && assoc_p (entry))
|
||||||
|
{
|
||||||
|
sub[sublen-1] = '\0';
|
||||||
|
akey = expand_assignment_string_to_string (sub, 0); /* [ */
|
||||||
|
sub[sublen-1] = ']';
|
||||||
|
if (akey == 0 || *akey == 0)
|
||||||
|
{
|
||||||
|
free (vname);
|
||||||
|
err_badarraysub (name);
|
||||||
|
return ((SHELL_VAR *)NULL);
|
||||||
|
}
|
||||||
|
entry = bind_assoc_variable (entry, vname, akey, value, flags);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
ind = array_expand_index (sub, sublen);
|
ind = array_expand_index (sub, sublen);
|
||||||
if (ind < 0)
|
if (ind < 0)
|
||||||
{
|
{
|
||||||
|
|
@ -191,8 +278,8 @@ assign_array_element (name, value, flags)
|
||||||
err_badarraysub (name);
|
err_badarraysub (name);
|
||||||
return ((SHELL_VAR *)NULL);
|
return ((SHELL_VAR *)NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
entry = bind_array_variable (vname, ind, value, flags);
|
entry = bind_array_variable (vname, ind, value, flags);
|
||||||
|
}
|
||||||
|
|
||||||
free (vname);
|
free (vname);
|
||||||
return (entry);
|
return (entry);
|
||||||
|
|
@ -200,27 +287,33 @@ assign_array_element (name, value, flags)
|
||||||
|
|
||||||
/* Find the array variable corresponding to NAME. If there is no variable,
|
/* Find the array variable corresponding to NAME. If there is no variable,
|
||||||
create a new array variable. If the variable exists but is not an array,
|
create a new array variable. If the variable exists but is not an array,
|
||||||
convert it to an indexed array. If CHECK_FLAGS is non-zero, an existing
|
convert it to an indexed array. If FLAGS&1 is non-zero, an existing
|
||||||
variable is checked for the readonly or noassign attribute in preparation
|
variable is checked for the readonly or noassign attribute in preparation
|
||||||
for assignment (e.g., by the `read' builtin). */
|
for assignment (e.g., by the `read' builtin). If FLAGS&2 is non-zero, we
|
||||||
|
create an associative array. */
|
||||||
SHELL_VAR *
|
SHELL_VAR *
|
||||||
find_or_make_array_variable (name, check_flags)
|
find_or_make_array_variable (name, flags)
|
||||||
char *name;
|
char *name;
|
||||||
int check_flags;
|
int flags;
|
||||||
{
|
{
|
||||||
SHELL_VAR *var;
|
SHELL_VAR *var;
|
||||||
|
|
||||||
var = find_variable (name);
|
var = find_variable (name);
|
||||||
|
|
||||||
if (var == 0)
|
if (var == 0)
|
||||||
var = make_new_array_variable (name);
|
var = (flags & 2) ? make_new_assoc_variable (name) : make_new_array_variable (name);
|
||||||
else if (check_flags && (readonly_p (var) || noassign_p (var)))
|
else if ((flags & 1) && (readonly_p (var) || noassign_p (var)))
|
||||||
{
|
{
|
||||||
if (readonly_p (var))
|
if (readonly_p (var))
|
||||||
err_readonly (name);
|
err_readonly (name);
|
||||||
return ((SHELL_VAR *)NULL);
|
return ((SHELL_VAR *)NULL);
|
||||||
}
|
}
|
||||||
else if (array_p (var) == 0)
|
else if ((flags & 2) && array_p (var))
|
||||||
|
{
|
||||||
|
report_error (_("%s: cannot convert indexed to associative array"), name);
|
||||||
|
return ((SHELL_VAR *)NULL);
|
||||||
|
}
|
||||||
|
else if (array_p (var) == 0 && assoc_p (var) == 0)
|
||||||
var = convert_var_to_array (var);
|
var = convert_var_to_array (var);
|
||||||
|
|
||||||
return (var);
|
return (var);
|
||||||
|
|
@ -234,8 +327,13 @@ assign_array_from_string (name, value, flags)
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
SHELL_VAR *var;
|
SHELL_VAR *var;
|
||||||
|
int vflags;
|
||||||
|
|
||||||
var = find_or_make_array_variable (name, 1);
|
vflags = 1;
|
||||||
|
if (flags & ASS_MKASSOC)
|
||||||
|
vflags |= 2;
|
||||||
|
|
||||||
|
var = find_or_make_array_variable (name, vflags);
|
||||||
if (var == 0)
|
if (var == 0)
|
||||||
return ((SHELL_VAR *)NULL);
|
return ((SHELL_VAR *)NULL);
|
||||||
|
|
||||||
|
|
@ -259,14 +357,15 @@ assign_array_var_from_word_list (var, list, flags)
|
||||||
|
|
||||||
for (l = list; l; l = l->next, i++)
|
for (l = list; l; l = l->next, i++)
|
||||||
if (var->assign_func)
|
if (var->assign_func)
|
||||||
(*var->assign_func) (var, l->word->word, i);
|
(*var->assign_func) (var, l->word->word, i, 0);
|
||||||
else
|
else
|
||||||
array_insert (a, i, l->word->word);
|
array_insert (a, i, l->word->word);
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
WORD_LIST *
|
WORD_LIST *
|
||||||
expand_compound_array_assignment (value, flags)
|
expand_compound_array_assignment (var, value, flags)
|
||||||
|
SHELL_VAR *var;
|
||||||
char *value;
|
char *value;
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
|
|
@ -315,18 +414,30 @@ assign_compound_array_list (var, nlist, flags)
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
ARRAY *a;
|
ARRAY *a;
|
||||||
|
HASH_TABLE *h;
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
char *w, *val, *nval;
|
char *w, *val, *nval;
|
||||||
int len, iflags;
|
int len, iflags;
|
||||||
arrayind_t ind, last_ind;
|
arrayind_t ind, last_ind;
|
||||||
|
char *akey;
|
||||||
|
|
||||||
a = array_cell (var);
|
a = (var && array_p (var)) ? array_cell (var) : (ARRAY *)0;
|
||||||
|
h = (var && assoc_p (var)) ? assoc_cell (var) : (HASH_TABLE *)0;
|
||||||
|
|
||||||
|
akey = (char *)0;
|
||||||
|
ind = 0;
|
||||||
|
|
||||||
/* Now that we are ready to assign values to the array, kill the existing
|
/* Now that we are ready to assign values to the array, kill the existing
|
||||||
value. */
|
value. */
|
||||||
if (a && (flags & ASS_APPEND) == 0)
|
if ((flags & ASS_APPEND) == 0)
|
||||||
|
{
|
||||||
|
if (array_p (var) && a)
|
||||||
array_flush (a);
|
array_flush (a);
|
||||||
last_ind = (flags & ASS_APPEND) ? array_max_index (a) + 1 : 0;
|
else if (assoc_p (var) && h)
|
||||||
|
assoc_flush (h);
|
||||||
|
}
|
||||||
|
|
||||||
|
last_ind = (a && (flags & ASS_APPEND)) ? array_max_index (a) + 1 : 0;
|
||||||
|
|
||||||
for (list = nlist; list; list = list->next)
|
for (list = nlist; list; list = list->next)
|
||||||
{
|
{
|
||||||
|
|
@ -341,9 +452,14 @@ assign_compound_array_list (var, nlist, flags)
|
||||||
/* XXX - changes for `+=' */
|
/* XXX - changes for `+=' */
|
||||||
if (w[len] != ']' || (w[len+1] != '=' && (w[len+1] != '+' || w[len+2] != '=')))
|
if (w[len] != ']' || (w[len+1] != '=' && (w[len+1] != '+' || w[len+2] != '=')))
|
||||||
{
|
{
|
||||||
|
if (assoc_p (var))
|
||||||
|
{
|
||||||
|
err_badarraysub (w);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
nval = make_variable_value (var, w, flags);
|
nval = make_variable_value (var, w, flags);
|
||||||
if (var->assign_func)
|
if (var->assign_func)
|
||||||
(*var->assign_func) (var, nval, last_ind);
|
(*var->assign_func) (var, nval, last_ind, 0);
|
||||||
else
|
else
|
||||||
array_insert (a, last_ind, nval);
|
array_insert (a, last_ind, nval);
|
||||||
FREE (nval);
|
FREE (nval);
|
||||||
|
|
@ -359,17 +475,34 @@ assign_compound_array_list (var, nlist, flags)
|
||||||
|
|
||||||
if (ALL_ELEMENT_SUB (w[1]) && len == 2)
|
if (ALL_ELEMENT_SUB (w[1]) && len == 2)
|
||||||
{
|
{
|
||||||
|
if (assoc_p (var))
|
||||||
|
report_error (_("%s: invalid associative array key"), w);
|
||||||
|
else
|
||||||
report_error (_("%s: cannot assign to non-numeric index"), w);
|
report_error (_("%s: cannot assign to non-numeric index"), w);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (array_p (var))
|
||||||
|
{
|
||||||
ind = array_expand_index (w + 1, len);
|
ind = array_expand_index (w + 1, len);
|
||||||
if (ind < 0)
|
if (ind < 0)
|
||||||
{
|
{
|
||||||
err_badarraysub (w);
|
err_badarraysub (w);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
last_ind = ind;
|
last_ind = ind;
|
||||||
|
}
|
||||||
|
else if (assoc_p (var))
|
||||||
|
{
|
||||||
|
akey = substring (w, 1, len);
|
||||||
|
if (akey == 0 || *akey == 0)
|
||||||
|
{
|
||||||
|
err_badarraysub (w);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* XXX - changes for `+=' -- just accept the syntax. ksh93 doesn't do this */
|
/* XXX - changes for `+=' -- just accept the syntax. ksh93 doesn't do this */
|
||||||
if (w[len + 1] == '+' && w[len + 2] == '=')
|
if (w[len + 1] == '+' && w[len + 2] == '=')
|
||||||
{
|
{
|
||||||
|
|
@ -379,6 +512,11 @@ assign_compound_array_list (var, nlist, flags)
|
||||||
else
|
else
|
||||||
val = w + len + 2;
|
val = w + len + 2;
|
||||||
}
|
}
|
||||||
|
else if (assoc_p (var))
|
||||||
|
{
|
||||||
|
report_error (_("%s: %s: must use subscript when assigning associative array"), var->name, w);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
else /* No [ind]=value, just a stray `=' */
|
else /* No [ind]=value, just a stray `=' */
|
||||||
{
|
{
|
||||||
ind = last_ind;
|
ind = last_ind;
|
||||||
|
|
@ -387,7 +525,7 @@ assign_compound_array_list (var, nlist, flags)
|
||||||
|
|
||||||
if (integer_p (var))
|
if (integer_p (var))
|
||||||
this_command_name = (char *)NULL; /* no command name for errors */
|
this_command_name = (char *)NULL; /* no command name for errors */
|
||||||
bind_array_var_internal (var, ind, val, iflags);
|
bind_array_var_internal (var, ind, akey, val, iflags);
|
||||||
last_ind++;
|
last_ind++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -405,7 +543,7 @@ assign_array_var_from_string (var, value, flags)
|
||||||
if (value == 0)
|
if (value == 0)
|
||||||
return var;
|
return var;
|
||||||
|
|
||||||
nlist = expand_compound_array_assignment (value, flags);
|
nlist = expand_compound_array_assignment (var, value, flags);
|
||||||
assign_compound_array_list (var, nlist, flags);
|
assign_compound_array_list (var, nlist, flags);
|
||||||
|
|
||||||
if (nlist)
|
if (nlist)
|
||||||
|
|
@ -413,15 +551,44 @@ assign_array_var_from_string (var, value, flags)
|
||||||
return (var);
|
return (var);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Quote globbing chars and characters in $IFS before the `=' in an assignment
|
||||||
|
statement (usually a compound array assignment) to protect them from
|
||||||
|
unwanted filename expansion or word splitting. */
|
||||||
|
static char *
|
||||||
|
quote_assign (string)
|
||||||
|
const char *string;
|
||||||
|
{
|
||||||
|
size_t slen;
|
||||||
|
int saw_eq;
|
||||||
|
char *temp, *t;
|
||||||
|
const char *s, *send;
|
||||||
|
DECLARE_MBSTATE;
|
||||||
|
|
||||||
|
slen = strlen (string);
|
||||||
|
send = string + slen;
|
||||||
|
|
||||||
|
t = temp = (char *)xmalloc (slen * 2 + 1);
|
||||||
|
saw_eq = 0;
|
||||||
|
for (s = string; *s; )
|
||||||
|
{
|
||||||
|
if (*s == '=')
|
||||||
|
saw_eq = 1;
|
||||||
|
if (saw_eq == 0 && (glob_char_p (s) || isifs (*s)))
|
||||||
|
*t++ = '\\';
|
||||||
|
|
||||||
|
COPY_CHAR_P (t, s, send);
|
||||||
|
}
|
||||||
|
*t = '\0';
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
/* For each word in a compound array assignment, if the word looks like
|
/* For each word in a compound array assignment, if the word looks like
|
||||||
[ind]=value, quote the `[' and `]' before the `=' to protect them from
|
[ind]=value, quote globbing chars and characters in $IFS before the `='. */
|
||||||
unwanted filename expansion. */
|
|
||||||
static void
|
static void
|
||||||
quote_array_assignment_chars (list)
|
quote_array_assignment_chars (list)
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
{
|
{
|
||||||
char *s, *t, *nword;
|
char *nword;
|
||||||
int saw_eq;
|
|
||||||
WORD_LIST *l;
|
WORD_LIST *l;
|
||||||
|
|
||||||
for (l = list; l; l = l->next)
|
for (l = list; l; l = l->next)
|
||||||
|
|
@ -431,17 +598,7 @@ quote_array_assignment_chars (list)
|
||||||
/* Don't bother if it doesn't look like [ind]=value */
|
/* Don't bother if it doesn't look like [ind]=value */
|
||||||
if (l->word->word[0] != '[' || xstrchr (l->word->word, '=') == 0) /* ] */
|
if (l->word->word[0] != '[' || xstrchr (l->word->word, '=') == 0) /* ] */
|
||||||
continue;
|
continue;
|
||||||
s = nword = (char *)xmalloc (strlen (l->word->word) * 2 + 1);
|
nword = quote_assign (l->word->word);
|
||||||
saw_eq = 0;
|
|
||||||
for (t = l->word->word; *t; )
|
|
||||||
{
|
|
||||||
if (*t == '=')
|
|
||||||
saw_eq = 1;
|
|
||||||
if (saw_eq == 0 && (*t == '[' || *t == ']'))
|
|
||||||
*s++ = '\\';
|
|
||||||
*s++ = *t++;
|
|
||||||
}
|
|
||||||
*s = '\0';
|
|
||||||
free (l->word->word);
|
free (l->word->word);
|
||||||
l->word->word = nword;
|
l->word->word = nword;
|
||||||
}
|
}
|
||||||
|
|
@ -516,6 +673,7 @@ unbind_array_element (var, sub)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
arrayind_t ind;
|
arrayind_t ind;
|
||||||
|
char *akey;
|
||||||
ARRAY_ELEMENT *ae;
|
ARRAY_ELEMENT *ae;
|
||||||
|
|
||||||
len = skipsubscript (sub, 0);
|
len = skipsubscript (sub, 0);
|
||||||
|
|
@ -531,6 +689,19 @@ unbind_array_element (var, sub)
|
||||||
unbind_variable (var->name);
|
unbind_variable (var->name);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (assoc_p (var))
|
||||||
|
{
|
||||||
|
akey = expand_assignment_string_to_string (sub, 0); /* [ */
|
||||||
|
if (akey == 0 || *akey == 0)
|
||||||
|
{
|
||||||
|
builtin_error ("[%s]: %s", sub, _(bash_badsub_errmsg));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
assoc_remove (assoc_cell (var), akey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
ind = array_expand_index (sub, len+1);
|
ind = array_expand_index (sub, len+1);
|
||||||
if (ind < 0)
|
if (ind < 0)
|
||||||
{
|
{
|
||||||
|
|
@ -540,6 +711,8 @@ unbind_array_element (var, sub)
|
||||||
ae = array_remove (array_cell (var), ind);
|
ae = array_remove (array_cell (var), ind);
|
||||||
if (ae)
|
if (ae)
|
||||||
array_dispose_element (ae);
|
array_dispose_element (ae);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -563,6 +736,26 @@ print_array_assignment (var, quoted)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Format and output an associative array assignment in compound form
|
||||||
|
VAR=(VALUES), suitable for re-use as input. */
|
||||||
|
void
|
||||||
|
print_assoc_assignment (var, quoted)
|
||||||
|
SHELL_VAR *var;
|
||||||
|
int quoted;
|
||||||
|
{
|
||||||
|
char *vstr;
|
||||||
|
|
||||||
|
vstr = assoc_to_assign (assoc_cell (var), quoted);
|
||||||
|
|
||||||
|
if (vstr == 0)
|
||||||
|
printf ("%s=%s\n", var->name, quoted ? "'()'" : "()");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf ("%s=%s\n", var->name, vstr);
|
||||||
|
free (vstr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* Utility functions to manage arrays and their contents for expansion */
|
/* Utility functions to manage arrays and their contents for expansion */
|
||||||
|
|
@ -693,8 +886,8 @@ array_variable_part (s, subp, lenp)
|
||||||
/* Return a string containing the elements in the array and subscript
|
/* Return a string containing the elements in the array and subscript
|
||||||
described by S. If the subscript is * or @, obeys quoting rules akin
|
described by S. If the subscript is * or @, obeys quoting rules akin
|
||||||
to the expansion of $* and $@ including double quoting. If RTYPE
|
to the expansion of $* and $@ including double quoting. If RTYPE
|
||||||
is non-null it gets 1 if the array reference is name[@] or name[*]
|
is non-null it gets 1 if the array reference is name[*], 2 if the
|
||||||
and 0 otherwise. */
|
reference is name[@], and 0 otherwise. */
|
||||||
static char *
|
static char *
|
||||||
array_value_internal (s, quoted, allow_all, rtype)
|
array_value_internal (s, quoted, allow_all, rtype)
|
||||||
char *s;
|
char *s;
|
||||||
|
|
@ -702,6 +895,7 @@ array_value_internal (s, quoted, allow_all, rtype)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
arrayind_t ind;
|
arrayind_t ind;
|
||||||
|
char *akey;
|
||||||
char *retval, *t, *temp;
|
char *retval, *t, *temp;
|
||||||
WORD_LIST *l;
|
WORD_LIST *l;
|
||||||
SHELL_VAR *var;
|
SHELL_VAR *var;
|
||||||
|
|
@ -730,8 +924,14 @@ array_value_internal (s, quoted, allow_all, rtype)
|
||||||
}
|
}
|
||||||
else if (var == 0 || value_cell (var) == 0)
|
else if (var == 0 || value_cell (var) == 0)
|
||||||
return ((char *)NULL);
|
return ((char *)NULL);
|
||||||
else if (array_p (var) == 0)
|
else if (array_p (var) == 0 && assoc_p (var) == 0)
|
||||||
l = add_string_to_list (value_cell (var), (WORD_LIST *)NULL);
|
l = add_string_to_list (value_cell (var), (WORD_LIST *)NULL);
|
||||||
|
else if (assoc_p (var))
|
||||||
|
{
|
||||||
|
l = assoc_to_word_list (assoc_cell (var));
|
||||||
|
if (l == (WORD_LIST *)NULL)
|
||||||
|
return ((char *)NULL);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
l = array_to_word_list (array_cell (var));
|
l = array_to_word_list (array_cell (var));
|
||||||
|
|
@ -754,9 +954,12 @@ array_value_internal (s, quoted, allow_all, rtype)
|
||||||
{
|
{
|
||||||
if (rtype)
|
if (rtype)
|
||||||
*rtype = 0;
|
*rtype = 0;
|
||||||
|
if (var == 0 || array_p (var) || assoc_p (var) == 0)
|
||||||
|
{
|
||||||
ind = array_expand_index (t, len);
|
ind = array_expand_index (t, len);
|
||||||
if (ind < 0)
|
if (ind < 0)
|
||||||
{
|
{
|
||||||
|
index_error:
|
||||||
if (var)
|
if (var)
|
||||||
err_badarraysub (var->name);
|
err_badarraysub (var->name);
|
||||||
else
|
else
|
||||||
|
|
@ -767,10 +970,23 @@ array_value_internal (s, quoted, allow_all, rtype)
|
||||||
}
|
}
|
||||||
return ((char *)NULL);
|
return ((char *)NULL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else if (assoc_p (var))
|
||||||
|
{
|
||||||
|
t[len - 1] = '\0';
|
||||||
|
akey = expand_assignment_string_to_string (t, 0); /* [ */
|
||||||
|
t[len - 1] = ']';
|
||||||
|
if (akey == 0 || *akey == 0)
|
||||||
|
goto index_error;
|
||||||
|
}
|
||||||
|
|
||||||
if (var == 0)
|
if (var == 0)
|
||||||
return ((char *)NULL);
|
return ((char *)NULL);
|
||||||
if (array_p (var) == 0)
|
if (array_p (var) == 0 && assoc_p (var) == 0)
|
||||||
return (ind == 0 ? value_cell (var) : (char *)NULL);
|
return (ind == 0 ? value_cell (var) : (char *)NULL);
|
||||||
|
else if (assoc_p (var))
|
||||||
|
retval = assoc_reference (assoc_cell (var), akey);
|
||||||
|
else
|
||||||
retval = array_reference (array_cell (var), ind);
|
retval = array_reference (array_cell (var), ind);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -815,14 +1031,14 @@ array_keys (s, quoted)
|
||||||
if (var == 0 || ALL_ELEMENT_SUB (t[0]) == 0 || t[1] != ']')
|
if (var == 0 || ALL_ELEMENT_SUB (t[0]) == 0 || t[1] != ']')
|
||||||
return (char *)NULL;
|
return (char *)NULL;
|
||||||
|
|
||||||
if (array_p (var) == 0)
|
if (array_p (var) == 0 && assoc_p (var) == 0)
|
||||||
l = add_string_to_list ("0", (WORD_LIST *)NULL);
|
l = add_string_to_list ("0", (WORD_LIST *)NULL);
|
||||||
|
else if (assoc_p (var))
|
||||||
|
l = assoc_keys_to_word_list (assoc_cell (var));
|
||||||
else
|
else
|
||||||
{
|
|
||||||
l = array_keys_to_word_list (array_cell (var));
|
l = array_keys_to_word_list (array_cell (var));
|
||||||
if (l == (WORD_LIST *)NULL)
|
if (l == (WORD_LIST *)NULL)
|
||||||
return ((char *) NULL);
|
return ((char *) NULL);
|
||||||
}
|
|
||||||
|
|
||||||
if (t[0] == '*' && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
|
if (t[0] == '*' && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
28
arrayfunc.h
28
arrayfunc.h
|
|
@ -1,22 +1,22 @@
|
||||||
/* arrayfunc.h -- declarations for miscellaneous array functions in arrayfunc.c */
|
/* arrayfunc.h -- declarations for miscellaneous array functions in arrayfunc.c */
|
||||||
|
|
||||||
/* Copyright (C) 2001-2004 Free Software Foundation, Inc.
|
/* Copyright (C) 2001-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it
|
Bash is free software: you can redistribute it and/or modify
|
||||||
under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT
|
Bash is distributed in the hope that it will be useful,
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Bash; see the file COPYING. If not, write to the Free
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (_ARRAYFUNC_H_)
|
#if !defined (_ARRAYFUNC_H_)
|
||||||
#define _ARRAYFUNC_H_
|
#define _ARRAYFUNC_H_
|
||||||
|
|
@ -26,8 +26,10 @@
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
|
|
||||||
extern SHELL_VAR *convert_var_to_array __P((SHELL_VAR *));
|
extern SHELL_VAR *convert_var_to_array __P((SHELL_VAR *));
|
||||||
|
extern SHELL_VAR *convert_var_to_assoc __P((SHELL_VAR *));
|
||||||
|
|
||||||
extern SHELL_VAR *bind_array_variable __P((char *, arrayind_t, char *, int));
|
extern SHELL_VAR *bind_array_variable __P((char *, arrayind_t, char *, int));
|
||||||
|
extern SHELL_VAR *bind_array_element __P((SHELL_VAR *, arrayind_t, char *, int));
|
||||||
extern SHELL_VAR *assign_array_element __P((char *, char *, int));
|
extern SHELL_VAR *assign_array_element __P((char *, char *, int));
|
||||||
|
|
||||||
extern SHELL_VAR *find_or_make_array_variable __P((char *, int));
|
extern SHELL_VAR *find_or_make_array_variable __P((char *, int));
|
||||||
|
|
@ -35,13 +37,15 @@ extern SHELL_VAR *find_or_make_array_variable __P((char *, int));
|
||||||
extern SHELL_VAR *assign_array_from_string __P((char *, char *, int));
|
extern SHELL_VAR *assign_array_from_string __P((char *, char *, int));
|
||||||
extern SHELL_VAR *assign_array_var_from_word_list __P((SHELL_VAR *, WORD_LIST *, int));
|
extern SHELL_VAR *assign_array_var_from_word_list __P((SHELL_VAR *, WORD_LIST *, int));
|
||||||
|
|
||||||
extern WORD_LIST *expand_compound_array_assignment __P((char *, int));
|
extern WORD_LIST *expand_compound_array_assignment __P((SHELL_VAR *, char *, int));
|
||||||
extern void assign_compound_array_list __P((SHELL_VAR *, WORD_LIST *, int));
|
extern void assign_compound_array_list __P((SHELL_VAR *, WORD_LIST *, int));
|
||||||
extern SHELL_VAR *assign_array_var_from_string __P((SHELL_VAR *, char *, int));
|
extern SHELL_VAR *assign_array_var_from_string __P((SHELL_VAR *, char *, int));
|
||||||
|
|
||||||
extern int unbind_array_element __P((SHELL_VAR *, char *));
|
extern int unbind_array_element __P((SHELL_VAR *, char *));
|
||||||
extern int skipsubscript __P((const char *, int));
|
extern int skipsubscript __P((const char *, int));
|
||||||
|
|
||||||
extern void print_array_assignment __P((SHELL_VAR *, int));
|
extern void print_array_assignment __P((SHELL_VAR *, int));
|
||||||
|
extern void print_assoc_assignment __P((SHELL_VAR *, int));
|
||||||
|
|
||||||
extern arrayind_t array_expand_index __P((char *, int));
|
extern arrayind_t array_expand_index __P((char *, int));
|
||||||
extern int valid_array_reference __P((char *));
|
extern int valid_array_reference __P((char *));
|
||||||
|
|
|
||||||
518
assoc.c
Normal file
518
assoc.c
Normal file
|
|
@ -0,0 +1,518 @@
|
||||||
|
/*
|
||||||
|
* assoc.c - functions to manipulate associative arrays
|
||||||
|
*
|
||||||
|
* Associative arrays are standard shell hash tables.
|
||||||
|
*
|
||||||
|
* Chet Ramey
|
||||||
|
* chet@ins.cwru.edu
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Copyright (C) 2008,2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
|
Bash is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Bash is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#if defined (ARRAY_VARS)
|
||||||
|
|
||||||
|
#if defined (HAVE_UNISTD_H)
|
||||||
|
# ifdef _MINIX
|
||||||
|
# include <sys/types.h>
|
||||||
|
# endif
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "bashansi.h"
|
||||||
|
|
||||||
|
#include "shell.h"
|
||||||
|
#include "array.h"
|
||||||
|
#include "assoc.h"
|
||||||
|
#include "builtins/common.h"
|
||||||
|
|
||||||
|
static WORD_LIST *assoc_to_word_list_internal __P((HASH_TABLE *, int));
|
||||||
|
|
||||||
|
/* assoc_create == hash_create */
|
||||||
|
|
||||||
|
void
|
||||||
|
assoc_dispose (hash)
|
||||||
|
HASH_TABLE *hash;
|
||||||
|
{
|
||||||
|
if (hash)
|
||||||
|
{
|
||||||
|
hash_flush (hash, 0);
|
||||||
|
hash_dispose (hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
assoc_flush (hash)
|
||||||
|
HASH_TABLE *hash;
|
||||||
|
{
|
||||||
|
hash_flush (hash, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
assoc_insert (hash, key, value)
|
||||||
|
HASH_TABLE *hash;
|
||||||
|
char *key;
|
||||||
|
char *value;
|
||||||
|
{
|
||||||
|
BUCKET_CONTENTS *b;
|
||||||
|
|
||||||
|
b = hash_search (key, hash, HASH_CREATE);
|
||||||
|
if (b == 0)
|
||||||
|
return -1;
|
||||||
|
FREE (b->data);
|
||||||
|
b->data = value ? savestring (value) : (char *)0;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
assoc_remove (hash, string)
|
||||||
|
HASH_TABLE *hash;
|
||||||
|
char *string;
|
||||||
|
{
|
||||||
|
BUCKET_CONTENTS *b;
|
||||||
|
|
||||||
|
b = hash_remove (string, hash, 0);
|
||||||
|
if (b)
|
||||||
|
{
|
||||||
|
free ((char *)b->data);
|
||||||
|
free (b->key);
|
||||||
|
free (b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
assoc_reference (hash, string)
|
||||||
|
HASH_TABLE *hash;
|
||||||
|
char *string;
|
||||||
|
{
|
||||||
|
BUCKET_CONTENTS *b;
|
||||||
|
|
||||||
|
if (hash == 0)
|
||||||
|
return (char *)0;
|
||||||
|
|
||||||
|
b = hash_search (string, hash, 0);
|
||||||
|
return (b ? (char *)b->data : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Quote the data associated with each element of the hash table ASSOC,
|
||||||
|
using quote_string */
|
||||||
|
HASH_TABLE *
|
||||||
|
assoc_quote (h)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
BUCKET_CONTENTS *tlist;
|
||||||
|
char *t;
|
||||||
|
|
||||||
|
if (h == 0 || assoc_empty (h))
|
||||||
|
return ((HASH_TABLE *)NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < h->nbuckets; i++)
|
||||||
|
for (tlist = hash_items (i, h); tlist; tlist = tlist->next)
|
||||||
|
{
|
||||||
|
t = quote_string ((char *)tlist->data);
|
||||||
|
FREE (tlist->data);
|
||||||
|
tlist->data = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Quote escape characters in the data associated with each element
|
||||||
|
of the hash table ASSOC, using quote_escapes */
|
||||||
|
HASH_TABLE *
|
||||||
|
assoc_quote_escapes (h)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
BUCKET_CONTENTS *tlist;
|
||||||
|
char *t;
|
||||||
|
|
||||||
|
if (h == 0 || assoc_empty (h))
|
||||||
|
return ((HASH_TABLE *)NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < h->nbuckets; i++)
|
||||||
|
for (tlist = hash_items (i, h); tlist; tlist = tlist->next)
|
||||||
|
{
|
||||||
|
t = quote_escapes ((char *)tlist->data);
|
||||||
|
FREE (tlist->data);
|
||||||
|
tlist->data = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
HASH_TABLE *
|
||||||
|
assoc_dequote (h)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
BUCKET_CONTENTS *tlist;
|
||||||
|
char *t;
|
||||||
|
|
||||||
|
if (h == 0 || assoc_empty (h))
|
||||||
|
return ((HASH_TABLE *)NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < h->nbuckets; i++)
|
||||||
|
for (tlist = hash_items (i, h); tlist; tlist = tlist->next)
|
||||||
|
{
|
||||||
|
t = dequote_string ((char *)tlist->data);
|
||||||
|
FREE (tlist->data);
|
||||||
|
tlist->data = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
HASH_TABLE *
|
||||||
|
assoc_dequote_escapes (h)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
BUCKET_CONTENTS *tlist;
|
||||||
|
char *t;
|
||||||
|
|
||||||
|
if (h == 0 || assoc_empty (h))
|
||||||
|
return ((HASH_TABLE *)NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < h->nbuckets; i++)
|
||||||
|
for (tlist = hash_items (i, h); tlist; tlist = tlist->next)
|
||||||
|
{
|
||||||
|
t = dequote_escapes ((char *)tlist->data);
|
||||||
|
FREE (tlist->data);
|
||||||
|
tlist->data = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
HASH_TABLE *
|
||||||
|
assoc_remove_quoted_nulls (h)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
BUCKET_CONTENTS *tlist;
|
||||||
|
char *t;
|
||||||
|
|
||||||
|
if (h == 0 || assoc_empty (h))
|
||||||
|
return ((HASH_TABLE *)NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < h->nbuckets; i++)
|
||||||
|
for (tlist = hash_items (i, h); tlist; tlist = tlist->next)
|
||||||
|
{
|
||||||
|
t = remove_quoted_nulls ((char *)tlist->data);
|
||||||
|
tlist->data = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return a string whose elements are the members of array H beginning at
|
||||||
|
* the STARTth element and spanning NELEM members. Null elements are counted.
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
assoc_subrange (hash, start, nelem, starsub, quoted)
|
||||||
|
HASH_TABLE *hash;
|
||||||
|
arrayind_t start, nelem;
|
||||||
|
int starsub, quoted;
|
||||||
|
{
|
||||||
|
WORD_LIST *l, *save, *h, *t;
|
||||||
|
int i, j;
|
||||||
|
char *ret;
|
||||||
|
|
||||||
|
if (assoc_empty (hash))
|
||||||
|
return ((char *)NULL);
|
||||||
|
|
||||||
|
save = l = assoc_to_word_list (hash);
|
||||||
|
if (save == 0)
|
||||||
|
return ((char *)NULL);
|
||||||
|
|
||||||
|
for (i = 1; l && i < start; i++)
|
||||||
|
l = l->next;
|
||||||
|
if (l == 0)
|
||||||
|
return ((char *)NULL);
|
||||||
|
for (j = 0,h = t = l; l && j < nelem; j++)
|
||||||
|
{
|
||||||
|
t = l;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
t->next = (WORD_LIST *)NULL;
|
||||||
|
|
||||||
|
ret = string_list_pos_params (starsub ? '*' : '@', h, quoted);
|
||||||
|
|
||||||
|
if (t != l)
|
||||||
|
t->next = l;
|
||||||
|
|
||||||
|
dispose_words (save);
|
||||||
|
return (ret);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
assoc_patsub (h, pat, rep, mflags)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
char *pat, *rep;
|
||||||
|
int mflags;
|
||||||
|
{
|
||||||
|
BUCKET_CONTENTS *tlist;
|
||||||
|
int i, slen;
|
||||||
|
HASH_TABLE *h2;
|
||||||
|
char *t, *sifs, *ifs;
|
||||||
|
|
||||||
|
if (h == 0 || assoc_empty (h))
|
||||||
|
return ((char *)NULL);
|
||||||
|
|
||||||
|
h2 = assoc_copy (h);
|
||||||
|
for (i = 0; i < h2->nbuckets; i++)
|
||||||
|
for (tlist = hash_items (i, h2); tlist; tlist = tlist->next)
|
||||||
|
{
|
||||||
|
t = pat_subst ((char *)tlist->data, pat, rep, mflags);
|
||||||
|
FREE (tlist->data);
|
||||||
|
tlist->data = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mflags & MATCH_QUOTED)
|
||||||
|
assoc_quote (h2);
|
||||||
|
else
|
||||||
|
assoc_quote_escapes (h2);
|
||||||
|
|
||||||
|
if (mflags & MATCH_STARSUB)
|
||||||
|
{
|
||||||
|
assoc_remove_quoted_nulls (h2);
|
||||||
|
sifs = ifs_firstchar ((int *)NULL);
|
||||||
|
t = assoc_to_string (h2, sifs, 0);
|
||||||
|
free (sifs);
|
||||||
|
}
|
||||||
|
else if (mflags & MATCH_QUOTED)
|
||||||
|
{
|
||||||
|
/* ${array[@]} */
|
||||||
|
sifs = ifs_firstchar (&slen);
|
||||||
|
ifs = getifs ();
|
||||||
|
if (ifs == 0 || *ifs == 0)
|
||||||
|
{
|
||||||
|
if (slen < 2)
|
||||||
|
sifs = xrealloc (sifs, 2);
|
||||||
|
sifs[0] = ' ';
|
||||||
|
sifs[1] = '\0';
|
||||||
|
}
|
||||||
|
t = assoc_to_string (h2, sifs, 0);
|
||||||
|
free(sifs);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
t = assoc_to_string (h2, " ", 0);
|
||||||
|
|
||||||
|
assoc_dispose (h2);
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
assoc_modcase (h, pat, modop, mflags)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
char *pat;
|
||||||
|
int modop;
|
||||||
|
int mflags;
|
||||||
|
{
|
||||||
|
BUCKET_CONTENTS *tlist;
|
||||||
|
int i, slen;
|
||||||
|
HASH_TABLE *h2;
|
||||||
|
char *t, *sifs, *ifs;
|
||||||
|
|
||||||
|
if (h == 0 || assoc_empty (h))
|
||||||
|
return ((char *)NULL);
|
||||||
|
|
||||||
|
h2 = assoc_copy (h);
|
||||||
|
for (i = 0; i < h2->nbuckets; i++)
|
||||||
|
for (tlist = hash_items (i, h2); tlist; tlist = tlist->next)
|
||||||
|
{
|
||||||
|
t = sh_modcase ((char *)tlist->data, pat, modop);
|
||||||
|
FREE (tlist->data);
|
||||||
|
tlist->data = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mflags & MATCH_QUOTED)
|
||||||
|
assoc_quote (h2);
|
||||||
|
else
|
||||||
|
assoc_quote_escapes (h2);
|
||||||
|
|
||||||
|
if (mflags & MATCH_STARSUB)
|
||||||
|
{
|
||||||
|
assoc_remove_quoted_nulls (h2);
|
||||||
|
sifs = ifs_firstchar ((int *)NULL);
|
||||||
|
t = assoc_to_string (h2, sifs, 0);
|
||||||
|
free (sifs);
|
||||||
|
}
|
||||||
|
else if (mflags & MATCH_QUOTED)
|
||||||
|
{
|
||||||
|
/* ${array[@]} */
|
||||||
|
sifs = ifs_firstchar (&slen);
|
||||||
|
ifs = getifs ();
|
||||||
|
if (ifs == 0 || *ifs == 0)
|
||||||
|
{
|
||||||
|
if (slen < 2)
|
||||||
|
sifs = xrealloc (sifs, 2);
|
||||||
|
sifs[0] = ' ';
|
||||||
|
sifs[1] = '\0';
|
||||||
|
}
|
||||||
|
t = assoc_to_string (h2, sifs, 0);
|
||||||
|
free(sifs);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
t = assoc_to_string (h2, " ", 0);
|
||||||
|
|
||||||
|
assoc_dispose (h2);
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
assoc_to_assign (hash, quoted)
|
||||||
|
HASH_TABLE *hash;
|
||||||
|
int quoted;
|
||||||
|
{
|
||||||
|
char *ret;
|
||||||
|
char *istr, *vstr;
|
||||||
|
int i, rsize, rlen, elen;
|
||||||
|
BUCKET_CONTENTS *tlist;
|
||||||
|
|
||||||
|
if (hash == 0 || assoc_empty (hash))
|
||||||
|
return (char *)0;
|
||||||
|
|
||||||
|
ret = xmalloc (rsize = 128);
|
||||||
|
ret[0] = '(';
|
||||||
|
rlen = 1;
|
||||||
|
|
||||||
|
for (i = 0; i < hash->nbuckets; i++)
|
||||||
|
for (tlist = hash_items (i, hash); tlist; tlist = tlist->next)
|
||||||
|
{
|
||||||
|
istr = tlist->key;
|
||||||
|
vstr = tlist->data ? sh_double_quote ((char *)tlist->data) : (char *)0;
|
||||||
|
|
||||||
|
elen = STRLEN (istr) + 8 + STRLEN (vstr);
|
||||||
|
RESIZE_MALLOCED_BUFFER (ret, rlen, (elen+1), rsize, rsize);
|
||||||
|
|
||||||
|
ret[rlen++] = '[';
|
||||||
|
strcpy (ret+rlen, istr);
|
||||||
|
rlen += STRLEN (istr);
|
||||||
|
ret[rlen++] = ']';
|
||||||
|
ret[rlen++] = '=';
|
||||||
|
if (vstr)
|
||||||
|
{
|
||||||
|
strcpy (ret + rlen, vstr);
|
||||||
|
rlen += STRLEN (vstr);
|
||||||
|
}
|
||||||
|
ret[rlen++] = ' ';
|
||||||
|
|
||||||
|
FREE (vstr);
|
||||||
|
}
|
||||||
|
|
||||||
|
RESIZE_MALLOCED_BUFFER (ret, rlen, 1, rsize, 8);
|
||||||
|
ret[rlen++] = ')';
|
||||||
|
ret[rlen] = '\0';
|
||||||
|
|
||||||
|
if (quoted)
|
||||||
|
{
|
||||||
|
vstr = sh_single_quote (ret);
|
||||||
|
free (ret);
|
||||||
|
ret = vstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static WORD_LIST *
|
||||||
|
assoc_to_word_list_internal (h, t)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
int t;
|
||||||
|
{
|
||||||
|
WORD_LIST *list;
|
||||||
|
int i;
|
||||||
|
BUCKET_CONTENTS *tlist;
|
||||||
|
char *w;
|
||||||
|
|
||||||
|
if (h == 0 || assoc_empty (h))
|
||||||
|
return((WORD_LIST *)NULL);
|
||||||
|
list = (WORD_LIST *)NULL;
|
||||||
|
|
||||||
|
for (i = 0; i < h->nbuckets; i++)
|
||||||
|
for (tlist = hash_items (i, h); tlist; tlist = tlist->next)
|
||||||
|
{
|
||||||
|
w = (t == 0) ? (char *)tlist->data : (char *)tlist->key;
|
||||||
|
list = make_word_list (make_bare_word(w), list);
|
||||||
|
}
|
||||||
|
return (REVERSE_LIST(list, WORD_LIST *));
|
||||||
|
}
|
||||||
|
|
||||||
|
WORD_LIST *
|
||||||
|
assoc_to_word_list (h)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
{
|
||||||
|
return (assoc_to_word_list_internal (h, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
WORD_LIST *
|
||||||
|
assoc_keys_to_word_list (h)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
{
|
||||||
|
return (assoc_to_word_list_internal (h, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
assoc_to_string (h, sep, quoted)
|
||||||
|
HASH_TABLE *h;
|
||||||
|
char *sep;
|
||||||
|
int quoted;
|
||||||
|
{
|
||||||
|
BUCKET_CONTENTS *tlist;
|
||||||
|
int i;
|
||||||
|
char *result, *t, *w;
|
||||||
|
WORD_LIST *list, *l;
|
||||||
|
|
||||||
|
if (h == 0)
|
||||||
|
return ((char *)NULL);
|
||||||
|
if (assoc_empty (h))
|
||||||
|
return (savestring (""));
|
||||||
|
|
||||||
|
result = NULL;
|
||||||
|
list = NULL;
|
||||||
|
/* This might be better implemented directly, but it's simple to implement
|
||||||
|
by converting to a word list first, possibly quoting the data, then
|
||||||
|
using list_string */
|
||||||
|
for (i = 0; i < h->nbuckets; i++)
|
||||||
|
for (tlist = hash_items (i, h); tlist; tlist = tlist->next)
|
||||||
|
{
|
||||||
|
w = (char *)tlist->data;
|
||||||
|
if (w == 0)
|
||||||
|
continue;
|
||||||
|
t = quoted ? quote_string (w) : savestring (w);
|
||||||
|
list = make_word_list (make_bare_word(t), list);
|
||||||
|
FREE (t);
|
||||||
|
}
|
||||||
|
|
||||||
|
l = REVERSE_LIST(list, WORD_LIST *);
|
||||||
|
|
||||||
|
result = l ? string_list_internal (l, sep) : savestring ("");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARRAY_VARS */
|
||||||
61
assoc.h
Normal file
61
assoc.h
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
/* assoc.h -- definitions for the interface exported by assoc.c that allows
|
||||||
|
the rest of the shell to manipulate associative array variables. */
|
||||||
|
|
||||||
|
/* Copyright (C) 2008,2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
|
Bash is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Bash is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ASSOC_H_
|
||||||
|
#define _ASSOC_H_
|
||||||
|
|
||||||
|
#include "stdc.h"
|
||||||
|
#include "hashlib.h"
|
||||||
|
|
||||||
|
#define assoc_empty(h) ((h)->nentries == 0)
|
||||||
|
#define assoc_num_elements(h) ((h)->nentries)
|
||||||
|
|
||||||
|
#define assoc_create(n) (hash_create((n)))
|
||||||
|
|
||||||
|
#define assoc_copy(h) (hash_copy((h), 0))
|
||||||
|
|
||||||
|
#define assoc_walk(h, f) (hash_walk((h), (f))
|
||||||
|
|
||||||
|
extern void assoc_dispose __P((HASH_TABLE *));
|
||||||
|
extern void assoc_flush __P((HASH_TABLE *));
|
||||||
|
|
||||||
|
extern int assoc_insert __P((HASH_TABLE *, char *, char *));
|
||||||
|
extern void assoc_remove __P((HASH_TABLE *, char *));
|
||||||
|
|
||||||
|
extern char *assoc_reference __P((HASH_TABLE *, char *));
|
||||||
|
|
||||||
|
extern char *assoc_subrange __P((HASH_TABLE *, arrayind_t, arrayind_t, int, int));
|
||||||
|
extern char *assoc_patsub __P((HASH_TABLE *, char *, char *, int));
|
||||||
|
extern char *assoc_modcase __P((HASH_TABLE *, char *, int, int));
|
||||||
|
|
||||||
|
extern HASH_TABLE *assoc_quote __P((HASH_TABLE *));
|
||||||
|
extern HASH_TABLE *assoc_quote_escapes __P((HASH_TABLE *));
|
||||||
|
extern HASH_TABLE *assoc_dequote __P((HASH_TABLE *));
|
||||||
|
extern HASH_TABLE *assoc_dequote_escapes __P((HASH_TABLE *));
|
||||||
|
extern HASH_TABLE *assoc_remove_quoted_nulls __P((HASH_TABLE *));
|
||||||
|
|
||||||
|
extern char *assoc_to_assign __P((HASH_TABLE *, int));
|
||||||
|
|
||||||
|
extern WORD_LIST *assoc_to_word_list __P((HASH_TABLE *));
|
||||||
|
extern WORD_LIST *assoc_keys_to_word_list __P((HASH_TABLE *));
|
||||||
|
|
||||||
|
extern char *assoc_to_string __P((HASH_TABLE *, char *, int));
|
||||||
|
#endif /* _ASSOC_H_ */
|
||||||
24
bashansi.h
24
bashansi.h
|
|
@ -1,22 +1,22 @@
|
||||||
/* bashansi.h -- Typically included information required by picky compilers. */
|
/* bashansi.h -- Typically included information required by picky compilers. */
|
||||||
|
|
||||||
/* Copyright (C) 1993 Free Software Foundation, Inc.
|
/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (_BASHANSI_H_)
|
#if !defined (_BASHANSI_H_)
|
||||||
#define _BASHANSI_H_
|
#define _BASHANSI_H_
|
||||||
|
|
|
||||||
83
bashhist.c
83
bashhist.c
|
|
@ -1,22 +1,22 @@
|
||||||
/* bashhist.c -- bash interface to the GNU history library. */
|
/* bashhist.c -- bash interface to the GNU history library. */
|
||||||
|
|
||||||
/* Copyright (C) 1993-2004 Free Software Foundation, Inc.
|
/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
|
@ -265,7 +265,6 @@ void
|
||||||
load_history ()
|
load_history ()
|
||||||
{
|
{
|
||||||
char *hf;
|
char *hf;
|
||||||
struct stat buf;
|
|
||||||
|
|
||||||
/* Truncate history file for interactive shells which desire it.
|
/* Truncate history file for interactive shells which desire it.
|
||||||
Note that the history file is automatically truncated to the
|
Note that the history file is automatically truncated to the
|
||||||
|
|
@ -280,7 +279,7 @@ load_history ()
|
||||||
/* Read the history in HISTFILE into the history list. */
|
/* Read the history in HISTFILE into the history list. */
|
||||||
hf = get_string_value ("HISTFILE");
|
hf = get_string_value ("HISTFILE");
|
||||||
|
|
||||||
if (hf && *hf && stat (hf, &buf) == 0)
|
if (hf && *hf && file_exists (hf))
|
||||||
{
|
{
|
||||||
read_history (hf);
|
read_history (hf);
|
||||||
using_history ();
|
using_history ();
|
||||||
|
|
@ -288,16 +287,65 @@ load_history ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bash_clear_history ()
|
||||||
|
{
|
||||||
|
clear_history ();
|
||||||
|
history_lines_this_session = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Delete and free the history list entry at offset I. */
|
||||||
|
int
|
||||||
|
bash_delete_histent (i)
|
||||||
|
int i;
|
||||||
|
{
|
||||||
|
HIST_ENTRY *discard;
|
||||||
|
|
||||||
|
discard = remove_history (i);
|
||||||
|
if (discard)
|
||||||
|
free_history_entry (discard);
|
||||||
|
history_lines_this_session--;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
bash_delete_last_history ()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
HIST_ENTRY **hlist, *histent;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
hlist = history_list ();
|
||||||
|
if (hlist == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; hlist[i]; i++)
|
||||||
|
;
|
||||||
|
i--;
|
||||||
|
|
||||||
|
/* History_get () takes a parameter that must be offset by history_base. */
|
||||||
|
histent = history_get (history_base + i); /* Don't free this */
|
||||||
|
if (histent == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
r = bash_delete_histent (i);
|
||||||
|
|
||||||
|
if (where_history () > history_length)
|
||||||
|
history_set_pos (history_length);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef INCLUDE_UNUSED
|
#ifdef INCLUDE_UNUSED
|
||||||
/* Write the existing history out to the history file. */
|
/* Write the existing history out to the history file. */
|
||||||
void
|
void
|
||||||
save_history ()
|
save_history ()
|
||||||
{
|
{
|
||||||
char *hf;
|
char *hf;
|
||||||
struct stat buf;
|
|
||||||
|
|
||||||
hf = get_string_value ("HISTFILE");
|
hf = get_string_value ("HISTFILE");
|
||||||
if (hf && *hf && stat (hf, &buf) == 0)
|
if (hf && *hf && file_exists (hf))
|
||||||
{
|
{
|
||||||
/* Append only the lines that occurred this session to
|
/* Append only the lines that occurred this session to
|
||||||
the history file. */
|
the history file. */
|
||||||
|
|
@ -348,7 +396,6 @@ maybe_save_shell_history ()
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
char *hf;
|
char *hf;
|
||||||
struct stat buf;
|
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
if (history_lines_this_session)
|
if (history_lines_this_session)
|
||||||
|
|
@ -358,7 +405,7 @@ maybe_save_shell_history ()
|
||||||
if (hf && *hf)
|
if (hf && *hf)
|
||||||
{
|
{
|
||||||
/* If the file doesn't exist, then create it. */
|
/* If the file doesn't exist, then create it. */
|
||||||
if (stat (hf, &buf) == -1)
|
if (file_exists (hf) == 0)
|
||||||
{
|
{
|
||||||
int file;
|
int file;
|
||||||
file = open (hf, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
file = open (hf, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
||||||
|
|
|
||||||
27
bashhist.h
27
bashhist.h
|
|
@ -1,22 +1,22 @@
|
||||||
/* bashhist.h -- interface to the bash history functions in bashhist.c. */
|
/* bashhist.h -- interface to the bash history functions in bashhist.c. */
|
||||||
|
|
||||||
/* Copyright (C) 1993 Free Software Foundation, Inc.
|
/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (_BASHHIST_H_)
|
#if !defined (_BASHHIST_H_)
|
||||||
#define _BASHHIST_H_
|
#define _BASHHIST_H_
|
||||||
|
|
@ -51,6 +51,9 @@ extern void bash_initialize_history __P((void));
|
||||||
extern void bash_history_reinit __P((int));
|
extern void bash_history_reinit __P((int));
|
||||||
extern void bash_history_disable __P((void));
|
extern void bash_history_disable __P((void));
|
||||||
extern void bash_history_enable __P((void));
|
extern void bash_history_enable __P((void));
|
||||||
|
extern void bash_clear_history __P((void));
|
||||||
|
extern int bash_delete_histent __P((int));
|
||||||
|
extern int bash_delete_last_history __P((void));
|
||||||
extern void load_history __P((void));
|
extern void load_history __P((void));
|
||||||
extern void save_history __P((void));
|
extern void save_history __P((void));
|
||||||
extern int maybe_append_history __P((char *));
|
extern int maybe_append_history __P((char *));
|
||||||
|
|
|
||||||
28
bashintl.h
28
bashintl.h
|
|
@ -1,22 +1,22 @@
|
||||||
/* bashintl.h -- Internationalization stuff
|
/* bashintl.h -- Internationalization functions and defines. */
|
||||||
|
|
||||||
Copyright (C) 1996-2003 Free Software Foundation, Inc.
|
/* Copyright (C) 1996-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (_BASHINTL_H_)
|
#if !defined (_BASHINTL_H_)
|
||||||
#define _BASHINTL_H_
|
#define _BASHINTL_H_
|
||||||
|
|
@ -37,6 +37,8 @@
|
||||||
#define N_(msgid) msgid
|
#define N_(msgid) msgid
|
||||||
#define D_(d, msgid) dgettext(d, msgid)
|
#define D_(d, msgid) dgettext(d, msgid)
|
||||||
|
|
||||||
|
#define P_(m1, m2, n) ngettext(m1, m2, n)
|
||||||
|
|
||||||
#if defined (HAVE_SETLOCALE) && !defined (LC_ALL)
|
#if defined (HAVE_SETLOCALE) && !defined (LC_ALL)
|
||||||
# undef HAVE_SETLOCALE
|
# undef HAVE_SETLOCALE
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
22
bashjmp.h
22
bashjmp.h
|
|
@ -1,22 +1,22 @@
|
||||||
/* bashjmp.h -- wrapper for setjmp.h with necessary bash definitions. */
|
/* bashjmp.h -- wrapper for setjmp.h with necessary bash definitions. */
|
||||||
|
|
||||||
/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
|
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it
|
Bash is free software: you can redistribute it and/or modify
|
||||||
under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT
|
Bash is distributed in the hope that it will be useful,
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Bash; see the file COPYING. If not, write to the Free
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#ifndef _BASHJMP_H_
|
#ifndef _BASHJMP_H_
|
||||||
#define _BASHJMP_H_
|
#define _BASHJMP_H_
|
||||||
|
|
|
||||||
564
bashline.c
564
bashline.c
|
|
@ -1,22 +1,22 @@
|
||||||
/* bashline.c -- Bash's interface to the readline library. */
|
/* bashline.c -- Bash's interface to the readline library. */
|
||||||
|
|
||||||
/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it
|
Bash is free software: you can redistribute it and/or modify
|
||||||
under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT
|
Bash is distributed in the hope that it will be useful,
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Bash; see the file COPYING. If not, write to the Free
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
|
@ -50,7 +50,10 @@
|
||||||
#include "execute_cmd.h"
|
#include "execute_cmd.h"
|
||||||
#include "findcmd.h"
|
#include "findcmd.h"
|
||||||
#include "pathexp.h"
|
#include "pathexp.h"
|
||||||
|
#include "shmbutil.h"
|
||||||
|
|
||||||
#include "builtins/common.h"
|
#include "builtins/common.h"
|
||||||
|
|
||||||
#include <readline/rlconf.h>
|
#include <readline/rlconf.h>
|
||||||
#include <readline/readline.h>
|
#include <readline/readline.h>
|
||||||
#include <readline/history.h>
|
#include <readline/history.h>
|
||||||
|
|
@ -73,6 +76,8 @@
|
||||||
# define VI_EDITING_MODE 0
|
# define VI_EDITING_MODE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define RL_BOOLEAN_VARIABLE_VALUE(s) ((s)[0] == 'o' && (s)[1] == 'n' && (s)[2] == '\0')
|
||||||
|
|
||||||
#if defined (BRACE_COMPLETION)
|
#if defined (BRACE_COMPLETION)
|
||||||
extern int bash_brace_completion __P((int, int));
|
extern int bash_brace_completion __P((int, int));
|
||||||
#endif /* BRACE_COMPLETION */
|
#endif /* BRACE_COMPLETION */
|
||||||
|
|
@ -99,7 +104,14 @@ static int alias_expand_line __P((int, int));
|
||||||
static int history_and_alias_expand_line __P((int, int));
|
static int history_and_alias_expand_line __P((int, int));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int bash_forward_shellword __P((int, int));
|
||||||
|
static int bash_backward_shellword __P((int, int));
|
||||||
|
static int bash_kill_shellword __P((int, int));
|
||||||
|
static int bash_backward_kill_shellword __P((int, int));
|
||||||
|
|
||||||
/* Helper functions for Readline. */
|
/* Helper functions for Readline. */
|
||||||
|
static char *restore_tilde __P((char *, char *));
|
||||||
|
|
||||||
static void bash_directory_expansion __P((char **));
|
static void bash_directory_expansion __P((char **));
|
||||||
static int bash_directory_completion_hook __P((char **));
|
static int bash_directory_completion_hook __P((char **));
|
||||||
static int filename_completion_ignore __P((char **));
|
static int filename_completion_ignore __P((char **));
|
||||||
|
|
@ -118,6 +130,7 @@ static char *command_subst_completion_function __P((const char *, int));
|
||||||
static void build_history_completion_array __P((void));
|
static void build_history_completion_array __P((void));
|
||||||
static char *history_completion_generator __P((const char *, int));
|
static char *history_completion_generator __P((const char *, int));
|
||||||
static int dynamic_complete_history __P((int, int));
|
static int dynamic_complete_history __P((int, int));
|
||||||
|
static int bash_dabbrev_expand __P((int, int));
|
||||||
|
|
||||||
static void initialize_hostname_list __P((void));
|
static void initialize_hostname_list __P((void));
|
||||||
static void add_host_name __P((char *));
|
static void add_host_name __P((char *));
|
||||||
|
|
@ -158,6 +171,7 @@ extern int hist_verify;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int current_command_line_count, last_command_exit_value;
|
extern int current_command_line_count, last_command_exit_value;
|
||||||
|
extern int array_needs_making;
|
||||||
extern int posixly_correct, no_symbolic_links;
|
extern int posixly_correct, no_symbolic_links;
|
||||||
extern char *current_prompt_string, *ps1_prompt;
|
extern char *current_prompt_string, *ps1_prompt;
|
||||||
extern STRING_INT_ALIST word_token_alist[];
|
extern STRING_INT_ALIST word_token_alist[];
|
||||||
|
|
@ -220,6 +234,9 @@ int no_empty_command_completion;
|
||||||
are the only possible matches, even if FIGNORE says to. */
|
are the only possible matches, even if FIGNORE says to. */
|
||||||
int force_fignore = 1;
|
int force_fignore = 1;
|
||||||
|
|
||||||
|
/* Perform spelling correction on directory names during word completion */
|
||||||
|
int dircomplete_spelling = 0;
|
||||||
|
|
||||||
static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
|
static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
|
||||||
static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
|
static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
|
||||||
/* )) */
|
/* )) */
|
||||||
|
|
@ -254,6 +271,12 @@ posix_readline_initialize (on_or_off)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
reset_completer_word_break_chars ()
|
||||||
|
{
|
||||||
|
rl_completer_word_break_characters = perform_hostname_completion ? savestring (bash_completer_word_break_characters) : savestring (bash_nohostname_word_break_characters);
|
||||||
|
}
|
||||||
|
|
||||||
/* When this function returns, rl_completer_word_break_characters points to
|
/* When this function returns, rl_completer_word_break_characters points to
|
||||||
dynamically allocated memory. */
|
dynamically allocated memory. */
|
||||||
int
|
int
|
||||||
|
|
@ -353,6 +376,11 @@ initialize_readline ()
|
||||||
rl_add_defun ("magic-space", tcsh_magic_space, -1);
|
rl_add_defun ("magic-space", tcsh_magic_space, -1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
rl_add_defun ("shell-forward-word", bash_forward_shellword, -1);
|
||||||
|
rl_add_defun ("shell-backward-word", bash_backward_shellword, -1);
|
||||||
|
rl_add_defun ("shell-kill-word", bash_kill_shellword, -1);
|
||||||
|
rl_add_defun ("shell-backward-kill-word", bash_backward_kill_shellword, -1);
|
||||||
|
|
||||||
#ifdef ALIAS
|
#ifdef ALIAS
|
||||||
rl_add_defun ("alias-expand-line", alias_expand_line, -1);
|
rl_add_defun ("alias-expand-line", alias_expand_line, -1);
|
||||||
# ifdef BANG_HISTORY
|
# ifdef BANG_HISTORY
|
||||||
|
|
@ -388,6 +416,7 @@ initialize_readline ()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rl_add_defun ("dynamic-complete-history", dynamic_complete_history, -1);
|
rl_add_defun ("dynamic-complete-history", dynamic_complete_history, -1);
|
||||||
|
rl_add_defun ("dabbrev-expand", bash_dabbrev_expand, -1);
|
||||||
|
|
||||||
/* Bind defaults before binding our custom shell keybindings. */
|
/* Bind defaults before binding our custom shell keybindings. */
|
||||||
if (RL_ISSTATE(RL_STATE_INITIALIZED) == 0)
|
if (RL_ISSTATE(RL_STATE_INITIALIZED) == 0)
|
||||||
|
|
@ -489,7 +518,11 @@ initialize_readline ()
|
||||||
enable_hostname_completion (perform_hostname_completion);
|
enable_hostname_completion (perform_hostname_completion);
|
||||||
|
|
||||||
/* characters that need to be quoted when appearing in filenames. */
|
/* characters that need to be quoted when appearing in filenames. */
|
||||||
|
#if 0
|
||||||
rl_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{"; /*}*/
|
rl_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{"; /*}*/
|
||||||
|
#else
|
||||||
|
rl_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~"; /*}*/
|
||||||
|
#endif
|
||||||
rl_filename_quoting_function = bash_quote_filename;
|
rl_filename_quoting_function = bash_quote_filename;
|
||||||
rl_filename_dequoting_function = bash_dequote_filename;
|
rl_filename_dequoting_function = bash_dequote_filename;
|
||||||
rl_char_is_quoted_p = char_is_quoted;
|
rl_char_is_quoted_p = char_is_quoted;
|
||||||
|
|
@ -506,13 +539,19 @@ initialize_readline ()
|
||||||
bash_readline_initialized = 1;
|
bash_readline_initialized = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bashline_reinitialize ()
|
||||||
|
{
|
||||||
|
bash_readline_initialized = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* On Sun systems at least, rl_attempted_completion_function can end up
|
/* On Sun systems at least, rl_attempted_completion_function can end up
|
||||||
getting set to NULL, and rl_completion_entry_function set to do command
|
getting set to NULL, and rl_completion_entry_function set to do command
|
||||||
word completion if Bash is interrupted while trying to complete a command
|
word completion if Bash is interrupted while trying to complete a command
|
||||||
word. This just resets all the completion functions to the right thing.
|
word. This just resets all the completion functions to the right thing.
|
||||||
It's called from throw_to_top_level(). */
|
It's called from throw_to_top_level(). */
|
||||||
void
|
void
|
||||||
bashline_reinitialize ()
|
bashline_reset ()
|
||||||
{
|
{
|
||||||
tilde_initialize ();
|
tilde_initialize ();
|
||||||
rl_attempted_completion_function = attempt_shell_completion;
|
rl_attempted_completion_function = attempt_shell_completion;
|
||||||
|
|
@ -812,8 +851,8 @@ edit_and_execute_command (count, c, editing_mode, edit_command)
|
||||||
int count, c, editing_mode;
|
int count, c, editing_mode;
|
||||||
char *edit_command;
|
char *edit_command;
|
||||||
{
|
{
|
||||||
char *command;
|
char *command, *metaval;
|
||||||
int r, cclc, rrs;
|
int r, cclc, rrs, metaflag;
|
||||||
|
|
||||||
rrs = rl_readline_state;
|
rrs = rl_readline_state;
|
||||||
cclc = current_command_line_count;
|
cclc = current_command_line_count;
|
||||||
|
|
@ -840,10 +879,17 @@ edit_and_execute_command (count, c, editing_mode, edit_command)
|
||||||
command = savestring (edit_command);
|
command = savestring (edit_command);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metaval = rl_variable_value ("input-meta");
|
||||||
|
metaflag = RL_BOOLEAN_VARIABLE_VALUE (metaval);
|
||||||
|
|
||||||
/* Now, POSIX.1-2001 and SUSv3 say that the commands executed from the
|
/* Now, POSIX.1-2001 and SUSv3 say that the commands executed from the
|
||||||
temporary file should be placed into the history. We don't do that
|
temporary file should be placed into the history. We don't do that
|
||||||
yet. */
|
yet. */
|
||||||
|
if (rl_deprep_term_function)
|
||||||
|
(*rl_deprep_term_function) ();
|
||||||
r = parse_and_execute (command, (editing_mode == VI_EDITING_MODE) ? "v" : "C-xC-e", SEVAL_NOHIST);
|
r = parse_and_execute (command, (editing_mode == VI_EDITING_MODE) ? "v" : "C-xC-e", SEVAL_NOHIST);
|
||||||
|
if (rl_prep_term_function)
|
||||||
|
(*rl_prep_term_function) (metaflag);
|
||||||
|
|
||||||
current_command_line_count = cclc;
|
current_command_line_count = cclc;
|
||||||
|
|
||||||
|
|
@ -902,6 +948,203 @@ posix_edit_macros (count, key)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Bindable commands that move `shell-words': that is, sequences of
|
||||||
|
non-unquoted-metacharacters. */
|
||||||
|
|
||||||
|
#define WORDDELIM(c) (shellmeta(c) || shellblank(c))
|
||||||
|
|
||||||
|
static int
|
||||||
|
bash_forward_shellword (count, key)
|
||||||
|
int count, key;
|
||||||
|
{
|
||||||
|
size_t slen;
|
||||||
|
int sindex, c, p;
|
||||||
|
DECLARE_MBSTATE;
|
||||||
|
|
||||||
|
if (count < 0)
|
||||||
|
return (bash_backward_shellword (-count, key));
|
||||||
|
|
||||||
|
/* The tricky part of this is deciding whether or not the first character
|
||||||
|
we're on is an unquoted metacharacter. Not completely handled yet. */
|
||||||
|
/* XXX - need to test this stuff with backslash-escaped shell
|
||||||
|
metacharacters and unclosed single- and double-quoted strings. */
|
||||||
|
|
||||||
|
p = rl_point;
|
||||||
|
slen = rl_end;
|
||||||
|
|
||||||
|
while (count)
|
||||||
|
{
|
||||||
|
if (p == rl_end)
|
||||||
|
{
|
||||||
|
rl_point = rl_end;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move forward until we hit a non-metacharacter. */
|
||||||
|
while (p < rl_end && (c = rl_line_buffer[p]) && WORDDELIM (c))
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
ADVANCE_CHAR (rl_line_buffer, slen, p);
|
||||||
|
continue; /* straight back to loop, don't increment p */
|
||||||
|
case '\\':
|
||||||
|
if (p < rl_end && rl_line_buffer[p])
|
||||||
|
ADVANCE_CHAR (rl_line_buffer, slen, p);
|
||||||
|
break;
|
||||||
|
case '\'':
|
||||||
|
p = skip_to_delim (rl_line_buffer, ++p, "'", SD_NOJMP);
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
p = skip_to_delim (rl_line_buffer, ++p, "\"", SD_NOJMP);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p < rl_end)
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rl_line_buffer[p] == 0 || p == rl_end)
|
||||||
|
{
|
||||||
|
rl_point = rl_end;
|
||||||
|
rl_ding ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now move forward until we hit a non-quoted metacharacter or EOL */
|
||||||
|
while (p < rl_end && (c = rl_line_buffer[p]) && WORDDELIM (c) == 0)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
ADVANCE_CHAR (rl_line_buffer, slen, p);
|
||||||
|
continue; /* straight back to loop, don't increment p */
|
||||||
|
case '\\':
|
||||||
|
if (p < rl_end && rl_line_buffer[p])
|
||||||
|
ADVANCE_CHAR (rl_line_buffer, slen, p);
|
||||||
|
break;
|
||||||
|
case '\'':
|
||||||
|
p = skip_to_delim (rl_line_buffer, ++p, "'", SD_NOJMP);
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
p = skip_to_delim (rl_line_buffer, ++p, "\"", SD_NOJMP);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p < rl_end)
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p == rl_end || rl_line_buffer[p] == 0)
|
||||||
|
{
|
||||||
|
rl_point = rl_end;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
|
||||||
|
rl_point = p;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
bash_backward_shellword (count, key)
|
||||||
|
int count, key;
|
||||||
|
{
|
||||||
|
size_t slen;
|
||||||
|
int sindex, c, p;
|
||||||
|
DECLARE_MBSTATE;
|
||||||
|
|
||||||
|
if (count < 0)
|
||||||
|
return (bash_forward_shellword (-count, key));
|
||||||
|
|
||||||
|
p = rl_point;
|
||||||
|
slen = rl_end;
|
||||||
|
|
||||||
|
while (count)
|
||||||
|
{
|
||||||
|
if (p == 0)
|
||||||
|
{
|
||||||
|
rl_point = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move backward until we hit a non-metacharacter. */
|
||||||
|
while (p > 0)
|
||||||
|
{
|
||||||
|
c = rl_line_buffer[p];
|
||||||
|
if (WORDDELIM (c) && char_is_quoted (rl_line_buffer, p) == 0)
|
||||||
|
BACKUP_CHAR (rl_line_buffer, slen, p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p == 0)
|
||||||
|
{
|
||||||
|
rl_point = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now move backward until we hit a metacharacter or BOL. */
|
||||||
|
while (p > 0)
|
||||||
|
{
|
||||||
|
c = rl_line_buffer[p];
|
||||||
|
if (WORDDELIM (c) && char_is_quoted (rl_line_buffer, p) == 0)
|
||||||
|
break;
|
||||||
|
BACKUP_CHAR (rl_line_buffer, slen, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
|
||||||
|
rl_point = p;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
bash_kill_shellword (count, key)
|
||||||
|
int count, key;
|
||||||
|
{
|
||||||
|
int p;
|
||||||
|
|
||||||
|
if (count < 0)
|
||||||
|
return (bash_backward_kill_shellword (-count, key));
|
||||||
|
|
||||||
|
p = rl_point;
|
||||||
|
bash_forward_shellword (count, key);
|
||||||
|
|
||||||
|
if (rl_point != p)
|
||||||
|
rl_kill_text (p, rl_point);
|
||||||
|
|
||||||
|
rl_point = p;
|
||||||
|
if (rl_editing_mode == 1) /* 1 == emacs_mode */
|
||||||
|
rl_mark = rl_point;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
bash_backward_kill_shellword (count, key)
|
||||||
|
int count, key;
|
||||||
|
{
|
||||||
|
int p;
|
||||||
|
|
||||||
|
if (count < 0)
|
||||||
|
return (bash_kill_shellword (-count, key));
|
||||||
|
|
||||||
|
p = rl_point;
|
||||||
|
bash_backward_shellword (count, key);
|
||||||
|
|
||||||
|
if (rl_point != p)
|
||||||
|
rl_kill_text (p, rl_point);
|
||||||
|
|
||||||
|
if (rl_editing_mode == 1) /* 1 == emacs_mode */
|
||||||
|
rl_mark = rl_point;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* **************************************************************** */
|
/* **************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* How To Do Shell Completion */
|
/* How To Do Shell Completion */
|
||||||
|
|
@ -944,7 +1187,7 @@ find_cmd_start (start)
|
||||||
register int s, os;
|
register int s, os;
|
||||||
|
|
||||||
os = 0;
|
os = 0;
|
||||||
while (((s = skip_to_delim (rl_line_buffer, os, COMMAND_SEPARATORS)) <= start) &&
|
while (((s = skip_to_delim (rl_line_buffer, os, COMMAND_SEPARATORS, SD_NOJMP)) <= start) &&
|
||||||
rl_line_buffer[s])
|
rl_line_buffer[s])
|
||||||
os = s+1;
|
os = s+1;
|
||||||
return os;
|
return os;
|
||||||
|
|
@ -956,7 +1199,7 @@ find_cmd_end (end)
|
||||||
{
|
{
|
||||||
register int e;
|
register int e;
|
||||||
|
|
||||||
e = skip_to_delim (rl_line_buffer, end, COMMAND_SEPARATORS);
|
e = skip_to_delim (rl_line_buffer, end, COMMAND_SEPARATORS, SD_NOJMP);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -971,7 +1214,7 @@ find_cmd_name (start)
|
||||||
;
|
;
|
||||||
|
|
||||||
/* skip until a shell break character */
|
/* skip until a shell break character */
|
||||||
e = skip_to_delim (rl_line_buffer, s, "()<>;&| \t\n");
|
e = skip_to_delim (rl_line_buffer, s, "()<>;&| \t\n", SD_NOJMP);
|
||||||
|
|
||||||
name = substring (rl_line_buffer, s, e);
|
name = substring (rl_line_buffer, s, e);
|
||||||
|
|
||||||
|
|
@ -1070,8 +1313,9 @@ attempt_shell_completion (text, start, end)
|
||||||
|
|
||||||
#if defined (PROGRAMMABLE_COMPLETION)
|
#if defined (PROGRAMMABLE_COMPLETION)
|
||||||
/* Attempt programmable completion. */
|
/* Attempt programmable completion. */
|
||||||
if (!matches && in_command_position == 0 && prog_completion_enabled &&
|
if (matches == 0 && (in_command_position == 0 || text[0] == '\0') &&
|
||||||
(progcomp_size () > 0) && current_prompt_string == ps1_prompt)
|
prog_completion_enabled && (progcomp_size () > 0) &&
|
||||||
|
current_prompt_string == ps1_prompt)
|
||||||
{
|
{
|
||||||
int s, e, foundcs;
|
int s, e, foundcs;
|
||||||
char *n;
|
char *n;
|
||||||
|
|
@ -1084,7 +1328,9 @@ attempt_shell_completion (text, start, end)
|
||||||
s = find_cmd_start (start);
|
s = find_cmd_start (start);
|
||||||
e = find_cmd_end (end);
|
e = find_cmd_end (end);
|
||||||
n = find_cmd_name (s);
|
n = find_cmd_name (s);
|
||||||
if (e > s && assignment (n, 0) == 0)
|
if (e == 0 && e == s && text[0] == '\0')
|
||||||
|
prog_complete_matches = programmable_completions ("_EmptycmD_", text, s, e, &foundcs);
|
||||||
|
else if (e > s && assignment (n, 0) == 0)
|
||||||
prog_complete_matches = programmable_completions (n, text, s, e, &foundcs);
|
prog_complete_matches = programmable_completions (n, text, s, e, &foundcs);
|
||||||
else
|
else
|
||||||
foundcs = 0;
|
foundcs = 0;
|
||||||
|
|
@ -1092,16 +1338,11 @@ attempt_shell_completion (text, start, end)
|
||||||
/* XXX - if we found a COMPSPEC for the command, just return whatever
|
/* XXX - if we found a COMPSPEC for the command, just return whatever
|
||||||
the programmable completion code returns, and disable the default
|
the programmable completion code returns, and disable the default
|
||||||
filename completion that readline will do unless the COPT_DEFAULT
|
filename completion that readline will do unless the COPT_DEFAULT
|
||||||
option has been set with the `-o default' option to complete. */
|
option has been set with the `-o default' option to complete or
|
||||||
|
compopt. */
|
||||||
if (foundcs)
|
if (foundcs)
|
||||||
{
|
{
|
||||||
/* If the user specified that the compspec returns filenames, make
|
pcomp_set_readline_variables (foundcs, 1);
|
||||||
sure that readline knows it. */
|
|
||||||
if (foundcs & COPT_FILENAMES)
|
|
||||||
rl_filename_completion_desired = 1;
|
|
||||||
/* If the user doesn't want a space appended, tell readline. */
|
|
||||||
if (foundcs & COPT_NOSPACE)
|
|
||||||
rl_completion_suppress_append = 1;
|
|
||||||
/* Turn what the programmable completion code returns into what
|
/* Turn what the programmable completion code returns into what
|
||||||
readline wants. I should have made compute_lcd_of_matches
|
readline wants. I should have made compute_lcd_of_matches
|
||||||
external... */
|
external... */
|
||||||
|
|
@ -1235,8 +1476,11 @@ command_word_completion_function (hint_text, state)
|
||||||
static char *val = (char *)NULL;
|
static char *val = (char *)NULL;
|
||||||
static char *filename_hint = (char *)NULL;
|
static char *filename_hint = (char *)NULL;
|
||||||
static char *dequoted_hint = (char *)NULL;
|
static char *dequoted_hint = (char *)NULL;
|
||||||
|
static char *directory_part = (char *)NULL;
|
||||||
|
static char **glob_matches = (char **)NULL;
|
||||||
static int path_index, hint_len, dequoted_len, istate, igncase;
|
static int path_index, hint_len, dequoted_len, istate, igncase;
|
||||||
static int mapping_over, local_index, searching_path, hint_is_dir;
|
static int mapping_over, local_index, searching_path, hint_is_dir;
|
||||||
|
static int old_glob_ignore_case, globpat;
|
||||||
static SHELL_VAR **varlist = (SHELL_VAR **)NULL;
|
static SHELL_VAR **varlist = (SHELL_VAR **)NULL;
|
||||||
#if defined (ALIAS)
|
#if defined (ALIAS)
|
||||||
static alias_t **alias_list = (alias_t **)NULL;
|
static alias_t **alias_list = (alias_t **)NULL;
|
||||||
|
|
@ -1245,7 +1489,7 @@ command_word_completion_function (hint_text, state)
|
||||||
|
|
||||||
/* We have to map over the possibilities for command words. If we have
|
/* We have to map over the possibilities for command words. If we have
|
||||||
no state, then make one just for that purpose. */
|
no state, then make one just for that purpose. */
|
||||||
if (!state)
|
if (state == 0)
|
||||||
{
|
{
|
||||||
if (dequoted_hint && dequoted_hint != hint)
|
if (dequoted_hint && dequoted_hint != hint)
|
||||||
free (dequoted_hint);
|
free (dequoted_hint);
|
||||||
|
|
@ -1257,18 +1501,37 @@ command_word_completion_function (hint_text, state)
|
||||||
val = (char *)NULL;
|
val = (char *)NULL;
|
||||||
|
|
||||||
temp = rl_variable_value ("completion-ignore-case");
|
temp = rl_variable_value ("completion-ignore-case");
|
||||||
igncase = strcmp (temp, "on") == 0;
|
igncase = RL_BOOLEAN_VARIABLE_VALUE (temp);
|
||||||
|
|
||||||
|
if (glob_matches)
|
||||||
|
{
|
||||||
|
free (glob_matches);
|
||||||
|
glob_matches = (char **)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
globpat = glob_pattern_p (hint_text);
|
||||||
|
|
||||||
/* If this is an absolute program name, do not check it against
|
/* If this is an absolute program name, do not check it against
|
||||||
aliases, reserved words, functions or builtins. We must check
|
aliases, reserved words, functions or builtins. We must check
|
||||||
whether or not it is unique, and, if so, whether that filename
|
whether or not it is unique, and, if so, whether that filename
|
||||||
is executable. */
|
is executable. */
|
||||||
if (absolute_program (hint_text))
|
if (globpat || absolute_program (hint_text))
|
||||||
{
|
{
|
||||||
/* Perform tilde expansion on what's passed, so we don't end up
|
/* Perform tilde expansion on what's passed, so we don't end up
|
||||||
passing filenames with tildes directly to stat(). */
|
passing filenames with tildes directly to stat(). */
|
||||||
if (*hint_text == '~')
|
if (*hint_text == '~')
|
||||||
|
{
|
||||||
hint = bash_tilde_expand (hint_text, 0);
|
hint = bash_tilde_expand (hint_text, 0);
|
||||||
|
directory_part = savestring (hint_text);
|
||||||
|
temp = strchr (directory_part, '/');
|
||||||
|
if (temp)
|
||||||
|
*temp = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
free (directory_part);
|
||||||
|
directory_part = (char *)NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
hint = savestring (hint_text);
|
hint = savestring (hint_text);
|
||||||
|
|
||||||
|
|
@ -1291,10 +1554,19 @@ command_word_completion_function (hint_text, state)
|
||||||
|
|
||||||
filename_hint = savestring (hint);
|
filename_hint = savestring (hint);
|
||||||
|
|
||||||
mapping_over = 4;
|
|
||||||
istate = 0;
|
istate = 0;
|
||||||
|
|
||||||
|
if (globpat)
|
||||||
|
{
|
||||||
|
mapping_over = 5;
|
||||||
|
goto globword;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mapping_over = 4;
|
||||||
goto inner;
|
goto inner;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dequoted_hint = hint = savestring (hint_text);
|
dequoted_hint = hint = savestring (hint_text);
|
||||||
dequoted_len = hint_len = strlen (hint);
|
dequoted_len = hint_len = strlen (hint);
|
||||||
|
|
@ -1392,6 +1664,50 @@ command_word_completion_function (hint_text, state)
|
||||||
mapping_over++;
|
mapping_over++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
globword:
|
||||||
|
/* Limited support for completing command words with globbing chars. Only
|
||||||
|
a single match (multiple matches that end up reducing the number of
|
||||||
|
characters in the common prefix are bad) will ever be returned on
|
||||||
|
regular completion. */
|
||||||
|
if (glob_pattern_p (hint))
|
||||||
|
{
|
||||||
|
if (state == 0)
|
||||||
|
{
|
||||||
|
glob_ignore_case = igncase;
|
||||||
|
glob_matches = shell_glob_filename (hint);
|
||||||
|
glob_ignore_case = old_glob_ignore_case;
|
||||||
|
|
||||||
|
if (GLOB_FAILED (glob_matches) || glob_matches == 0)
|
||||||
|
{
|
||||||
|
glob_matches = (char **)NULL;
|
||||||
|
return ((char *)NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
local_index = 0;
|
||||||
|
|
||||||
|
if (glob_matches[1] && rl_completion_type == TAB) /* multiple matches are bad */
|
||||||
|
return ((char *)NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (val = glob_matches[local_index++])
|
||||||
|
{
|
||||||
|
if (executable_or_directory (val))
|
||||||
|
{
|
||||||
|
if (*hint_text == '~')
|
||||||
|
{
|
||||||
|
temp = restore_tilde (val, directory_part);
|
||||||
|
free (val);
|
||||||
|
val = temp;
|
||||||
|
}
|
||||||
|
return (val);
|
||||||
|
}
|
||||||
|
free (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
glob_ignore_case = old_glob_ignore_case;
|
||||||
|
return ((char *)NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* If the text passed is a directory in the current directory, return it
|
/* If the text passed is a directory in the current directory, return it
|
||||||
as a possible match. Executables in directories in the current
|
as a possible match. Executables in directories in the current
|
||||||
directory can be specified using relative pathnames and successfully
|
directory can be specified using relative pathnames and successfully
|
||||||
|
|
@ -1409,13 +1725,13 @@ command_word_completion_function (hint_text, state)
|
||||||
|
|
||||||
istate = (val != (char *)NULL);
|
istate = (val != (char *)NULL);
|
||||||
|
|
||||||
if (!istate)
|
if (istate == 0)
|
||||||
{
|
{
|
||||||
char *current_path;
|
char *current_path;
|
||||||
|
|
||||||
/* Get the next directory from the path. If there is none, then we
|
/* Get the next directory from the path. If there is none, then we
|
||||||
are all done. */
|
are all done. */
|
||||||
if (!path || !path[path_index] ||
|
if (path == 0 || path[path_index] == 0 ||
|
||||||
(current_path = extract_colon_unit (path, &path_index)) == 0)
|
(current_path = extract_colon_unit (path, &path_index)) == 0)
|
||||||
return ((char *)NULL);
|
return ((char *)NULL);
|
||||||
|
|
||||||
|
|
@ -1442,7 +1758,7 @@ command_word_completion_function (hint_text, state)
|
||||||
free (filename_hint);
|
free (filename_hint);
|
||||||
|
|
||||||
filename_hint = sh_makepath (current_path, hint, 0);
|
filename_hint = sh_makepath (current_path, hint, 0);
|
||||||
free (current_path);
|
free (current_path); /* XXX */
|
||||||
}
|
}
|
||||||
|
|
||||||
inner:
|
inner:
|
||||||
|
|
@ -1461,9 +1777,6 @@ command_word_completion_function (hint_text, state)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int match, freetemp;
|
int match, freetemp;
|
||||||
#if 0
|
|
||||||
char *temp; /* shadows previous declaration */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (absolute_program (hint))
|
if (absolute_program (hint))
|
||||||
{
|
{
|
||||||
|
|
@ -1475,24 +1788,7 @@ command_word_completion_function (hint_text, state)
|
||||||
/* If we performed tilde expansion, restore the original
|
/* If we performed tilde expansion, restore the original
|
||||||
filename. */
|
filename. */
|
||||||
if (*hint_text == '~')
|
if (*hint_text == '~')
|
||||||
{
|
temp = restore_tilde (val, directory_part);
|
||||||
int l, tl, vl, dl;
|
|
||||||
char *rd;
|
|
||||||
vl = strlen (val);
|
|
||||||
tl = strlen (hint_text);
|
|
||||||
#if 0
|
|
||||||
l = vl - hint_len; /* # of chars added */
|
|
||||||
#else
|
|
||||||
rd = savestring (filename_hint);
|
|
||||||
bash_directory_expansion (&rd);
|
|
||||||
dl = strlen (rd);
|
|
||||||
l = vl - dl; /* # of chars added */
|
|
||||||
free (rd);
|
|
||||||
#endif
|
|
||||||
temp = (char *)xmalloc (l + 2 + tl);
|
|
||||||
strcpy (temp, hint_text);
|
|
||||||
strcpy (temp + tl, val + vl - l);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
temp = savestring (val);
|
temp = savestring (val);
|
||||||
freetemp = 1;
|
freetemp = 1;
|
||||||
|
|
@ -2250,22 +2546,19 @@ filename_completion_ignore (names)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return 1 if NAME is a directory. */
|
/* Return 1 if NAME is a directory. NAME undergoes tilde expansion. */
|
||||||
static int
|
static int
|
||||||
test_for_directory (name)
|
test_for_directory (name)
|
||||||
const char *name;
|
const char *name;
|
||||||
{
|
{
|
||||||
struct stat finfo;
|
|
||||||
char *fn;
|
char *fn;
|
||||||
|
int r;
|
||||||
|
|
||||||
fn = bash_tilde_expand (name, 0);
|
fn = bash_tilde_expand (name, 0);
|
||||||
if (stat (fn, &finfo) != 0)
|
r = file_isdir (fn);
|
||||||
{
|
|
||||||
free (fn);
|
free (fn);
|
||||||
return 0;
|
|
||||||
}
|
return (r);
|
||||||
free (fn);
|
|
||||||
return (S_ISDIR (finfo.st_mode));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove files from NAMES, leaving directories. */
|
/* Remove files from NAMES, leaving directories. */
|
||||||
|
|
@ -2292,6 +2585,45 @@ bash_ignore_everything (names)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Replace a tilde-prefix in VAL with a `~', assuming the user typed it. VAL
|
||||||
|
is an expanded filename. DIRECTORY_PART is the tilde-prefix portion
|
||||||
|
of the un-tilde-expanded version of VAL (what the user typed). */
|
||||||
|
static char *
|
||||||
|
restore_tilde (val, directory_part)
|
||||||
|
char *val, *directory_part;
|
||||||
|
{
|
||||||
|
int l, vl, dl2, xl;
|
||||||
|
char *dh2, *expdir, *ret;
|
||||||
|
|
||||||
|
vl = strlen (val);
|
||||||
|
|
||||||
|
/* We need to duplicate the expansions readline performs on the directory
|
||||||
|
portion before passing it to our completion function. */
|
||||||
|
dh2 = directory_part ? bash_dequote_filename (directory_part, 0) : 0;
|
||||||
|
bash_directory_expansion (&dh2);
|
||||||
|
dl2 = strlen (dh2);
|
||||||
|
|
||||||
|
expdir = bash_tilde_expand (directory_part, 0);
|
||||||
|
xl = strlen (expdir);
|
||||||
|
free (expdir);
|
||||||
|
|
||||||
|
/*
|
||||||
|
dh2 = unexpanded but dequoted tilde-prefix
|
||||||
|
dl2 = length of tilde-prefix
|
||||||
|
expdir = tilde-expanded tilde-prefix
|
||||||
|
xl = length of expanded tilde-prefix
|
||||||
|
l = length of remainder after tilde-prefix
|
||||||
|
*/
|
||||||
|
l = (vl - xl) + 1;
|
||||||
|
|
||||||
|
ret = (char *)xmalloc (dl2 + 2 + l);
|
||||||
|
strcpy (ret, dh2);
|
||||||
|
strcpy (ret + dl2, val + xl);
|
||||||
|
|
||||||
|
free (dh2);
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
/* Simulate the expansions that will be performed by
|
/* Simulate the expansions that will be performed by
|
||||||
rl_filename_completion_function. This must be called with the address of
|
rl_filename_completion_function. This must be called with the address of
|
||||||
a pointer to malloc'd memory. */
|
a pointer to malloc'd memory. */
|
||||||
|
|
@ -2334,9 +2666,6 @@ bash_directory_completion_hook (dirname)
|
||||||
return_value = should_expand_dirname = 0;
|
return_value = should_expand_dirname = 0;
|
||||||
local_dirname = *dirname;
|
local_dirname = *dirname;
|
||||||
|
|
||||||
#if 0
|
|
||||||
should_expand_dirname = xstrchr (local_dirname, '$') || xstrchr (local_dirname, '`');
|
|
||||||
#else
|
|
||||||
if (xstrchr (local_dirname, '$'))
|
if (xstrchr (local_dirname, '$'))
|
||||||
should_expand_dirname = 1;
|
should_expand_dirname = 1;
|
||||||
else
|
else
|
||||||
|
|
@ -2345,7 +2674,6 @@ bash_directory_completion_hook (dirname)
|
||||||
if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 0)
|
if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 0)
|
||||||
should_expand_dirname = 1;
|
should_expand_dirname = 1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (HAVE_LSTAT)
|
#if defined (HAVE_LSTAT)
|
||||||
if (should_expand_dirname && lstat (local_dirname, &sb) == 0)
|
if (should_expand_dirname && lstat (local_dirname, &sb) == 0)
|
||||||
|
|
@ -2386,7 +2714,7 @@ bash_directory_completion_hook (dirname)
|
||||||
local_dirname = *dirname = new_dirname;
|
local_dirname = *dirname = new_dirname;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!no_symbolic_links && (local_dirname[0] != '.' || local_dirname[1]))
|
if (no_symbolic_links == 0 && (local_dirname[0] != '.' || local_dirname[1]))
|
||||||
{
|
{
|
||||||
char *temp1, *temp2;
|
char *temp1, *temp2;
|
||||||
int len1, len2;
|
int len1, len2;
|
||||||
|
|
@ -2395,6 +2723,19 @@ bash_directory_completion_hook (dirname)
|
||||||
temp1 = make_absolute (local_dirname, t);
|
temp1 = make_absolute (local_dirname, t);
|
||||||
free (t);
|
free (t);
|
||||||
temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);
|
temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);
|
||||||
|
|
||||||
|
/* Try spelling correction if initial canonicalization fails. */
|
||||||
|
if (temp2 == 0 && dircomplete_spelling)
|
||||||
|
{
|
||||||
|
temp2 = dirspell (temp1);
|
||||||
|
if (temp2)
|
||||||
|
{
|
||||||
|
free (temp1);
|
||||||
|
temp1 = temp2;
|
||||||
|
temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);
|
||||||
|
return_value = temp2 != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* If we can't canonicalize, bail. */
|
/* If we can't canonicalize, bail. */
|
||||||
if (temp2 == 0)
|
if (temp2 == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -2497,12 +2838,12 @@ dynamic_complete_history (count, key)
|
||||||
int count, key;
|
int count, key;
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
rl_compentry_func_t *orig_func;
|
rl_compentry_func_t *orig_func;
|
||||||
rl_completion_func_t *orig_attempt_func;
|
rl_completion_func_t *orig_attempt_func;
|
||||||
|
|
||||||
orig_func = rl_completion_entry_function;
|
orig_func = rl_completion_entry_function;
|
||||||
orig_attempt_func = rl_attempted_completion_function;
|
orig_attempt_func = rl_attempted_completion_function;
|
||||||
|
|
||||||
rl_completion_entry_function = history_completion_generator;
|
rl_completion_entry_function = history_completion_generator;
|
||||||
rl_attempted_completion_function = (rl_completion_func_t *)NULL;
|
rl_attempted_completion_function = (rl_completion_func_t *)NULL;
|
||||||
|
|
||||||
|
|
@ -2517,6 +2858,33 @@ dynamic_complete_history (count, key)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
bash_dabbrev_expand (count, key)
|
||||||
|
int count, key;
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
rl_compentry_func_t *orig_func;
|
||||||
|
rl_completion_func_t *orig_attempt_func;
|
||||||
|
|
||||||
|
orig_func = rl_menu_completion_entry_function;
|
||||||
|
orig_attempt_func = rl_attempted_completion_function;
|
||||||
|
|
||||||
|
rl_menu_completion_entry_function = history_completion_generator;
|
||||||
|
rl_attempted_completion_function = (rl_completion_func_t *)NULL;
|
||||||
|
rl_filename_completion_desired = 0;
|
||||||
|
|
||||||
|
/* XXX - use rl_completion_mode here? */
|
||||||
|
if (rl_last_func == bash_dabbrev_expand)
|
||||||
|
rl_last_func = rl_menu_complete;
|
||||||
|
r = rl_menu_complete (count, key);
|
||||||
|
|
||||||
|
rl_last_func = bash_dabbrev_expand;
|
||||||
|
rl_menu_completion_entry_function = orig_func;
|
||||||
|
rl_attempted_completion_function = orig_attempt_func;
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
|
#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
|
||||||
static int
|
static int
|
||||||
bash_complete_username (ignore, ignore2)
|
bash_complete_username (ignore, ignore2)
|
||||||
|
|
@ -2844,9 +3212,17 @@ bash_dequote_filename (text, quote_char)
|
||||||
ret = (char *)xmalloc (l + 1);
|
ret = (char *)xmalloc (l + 1);
|
||||||
for (quoted = quote_char, p = text, r = ret; p && *p; p++)
|
for (quoted = quote_char, p = text, r = ret; p && *p; p++)
|
||||||
{
|
{
|
||||||
/* Allow backslash-quoted characters to pass through unscathed. */
|
/* Allow backslash-escaped characters to pass through unscathed. */
|
||||||
if (*p == '\\')
|
if (*p == '\\')
|
||||||
{
|
{
|
||||||
|
/* Backslashes are preserved within single quotes. */
|
||||||
|
if (quoted == '\'')
|
||||||
|
*r++ = *p;
|
||||||
|
/* Backslashes are preserved within double quotes unless the
|
||||||
|
character is one that is defined to be escaped */
|
||||||
|
else if (quoted == '"' && ((sh_syntaxtab[p[1]] & CBSDQUOTE) == 0))
|
||||||
|
*r++ = *p;
|
||||||
|
|
||||||
*r++ = *++p;
|
*r++ = *++p;
|
||||||
if (*p == '\0')
|
if (*p == '\0')
|
||||||
break;
|
break;
|
||||||
|
|
@ -2897,6 +3273,9 @@ quote_word_break_chars (text)
|
||||||
rl_completer_word_break_characters. */
|
rl_completer_word_break_characters. */
|
||||||
if (xstrchr (rl_completer_word_break_characters, *s))
|
if (xstrchr (rl_completer_word_break_characters, *s))
|
||||||
*r++ = '\\';
|
*r++ = '\\';
|
||||||
|
/* XXX -- check for standalone tildes here and backslash-quote them */
|
||||||
|
if (s == text && *s == '~' && file_exists (text))
|
||||||
|
*r++ = '\\';
|
||||||
*r++ = *s;
|
*r++ = *s;
|
||||||
}
|
}
|
||||||
*r = '\0';
|
*r = '\0';
|
||||||
|
|
@ -3008,8 +3387,12 @@ bash_execute_unix_command (count, key)
|
||||||
Keymap ckmap; /* current keymap */
|
Keymap ckmap; /* current keymap */
|
||||||
Keymap xkmap; /* unix command executing keymap */
|
Keymap xkmap; /* unix command executing keymap */
|
||||||
register int i;
|
register int i;
|
||||||
char *cmd;
|
intmax_t mi;
|
||||||
|
int save_point;
|
||||||
sh_parser_state_t ps;
|
sh_parser_state_t ps;
|
||||||
|
char *cmd, *value, *l;
|
||||||
|
SHELL_VAR *v;
|
||||||
|
char ibuf[INT_STRLEN_BOUND(int) + 1];
|
||||||
|
|
||||||
/* First, we need to find the right command to execute. This is tricky,
|
/* First, we need to find the right command to execute. This is tricky,
|
||||||
because we might have already indirected into another keymap. */
|
because we might have already indirected into another keymap. */
|
||||||
|
|
@ -3045,13 +3428,42 @@ bash_execute_unix_command (count, key)
|
||||||
|
|
||||||
rl_crlf (); /* move to a new line */
|
rl_crlf (); /* move to a new line */
|
||||||
|
|
||||||
|
v = bind_variable ("READLINE_LINE", rl_line_buffer, 0);
|
||||||
|
if (v)
|
||||||
|
VSETATTR (v, att_exported);
|
||||||
|
l = value_cell (v);
|
||||||
|
save_point = rl_point;
|
||||||
|
value = inttostr (rl_point, ibuf, sizeof (ibuf));
|
||||||
|
v = bind_int_variable ("READLINE_POINT", value);
|
||||||
|
if (v)
|
||||||
|
VSETATTR (v, att_exported);
|
||||||
|
array_needs_making = 1;
|
||||||
|
|
||||||
save_parser_state (&ps);
|
save_parser_state (&ps);
|
||||||
|
parse_and_execute (cmd, "bash_execute_unix_command", SEVAL_NOHIST|SEVAL_NOFREE);
|
||||||
cmd = savestring (cmd);
|
|
||||||
parse_and_execute (cmd, "bash_execute_unix_command", SEVAL_NOHIST);
|
|
||||||
|
|
||||||
restore_parser_state (&ps);
|
restore_parser_state (&ps);
|
||||||
|
|
||||||
|
v = find_variable ("READLINE_LINE");
|
||||||
|
if (value_cell (v) != l)
|
||||||
|
maybe_make_readline_line (value_cell (v));
|
||||||
|
v = find_variable ("READLINE_POINT");
|
||||||
|
if (v && legal_number (value_cell (v), &mi))
|
||||||
|
{
|
||||||
|
i = mi;
|
||||||
|
if (i != save_point)
|
||||||
|
{
|
||||||
|
rl_point = i;
|
||||||
|
if (rl_point > rl_end)
|
||||||
|
rl_point = rl_end;
|
||||||
|
else if (rl_point < 0)
|
||||||
|
rl_point = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unbind_variable ("READLINE_LINE");
|
||||||
|
unbind_variable ("READLINE_POINT");
|
||||||
|
array_needs_making = 1;
|
||||||
|
|
||||||
/* and restore the readline buffer and display after command execution. */
|
/* and restore the readline buffer and display after command execution. */
|
||||||
rl_forced_update_display ();
|
rl_forced_update_display ();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
26
bashline.h
26
bashline.h
|
|
@ -1,22 +1,22 @@
|
||||||
/* bashline.h -- interface to the bash readline functions in bashline.c. */
|
/* bashline.h -- interface to the bash readline functions in bashline.c. */
|
||||||
|
|
||||||
/* Copyright (C) 1993 Free Software Foundation, Inc.
|
/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (_BASHLINE_H_)
|
#if !defined (_BASHLINE_H_)
|
||||||
#define _BASHLINE_H_
|
#define _BASHLINE_H_
|
||||||
|
|
@ -26,8 +26,10 @@
|
||||||
extern int bash_readline_initialized;
|
extern int bash_readline_initialized;
|
||||||
|
|
||||||
extern void posix_readline_initialize __P((int));
|
extern void posix_readline_initialize __P((int));
|
||||||
|
extern void reset_completer_word_break_chars __P((void));
|
||||||
extern int enable_hostname_completion __P((int));
|
extern int enable_hostname_completion __P((int));
|
||||||
extern void initialize_readline __P((void));
|
extern void initialize_readline __P((void));
|
||||||
|
extern void bashline_reset __P((void));
|
||||||
extern void bashline_reinitialize __P((void));
|
extern void bashline_reinitialize __P((void));
|
||||||
extern int bash_re_edit __P((char *));
|
extern int bash_re_edit __P((char *));
|
||||||
|
|
||||||
|
|
|
||||||
24
bashtypes.h
24
bashtypes.h
|
|
@ -1,22 +1,22 @@
|
||||||
/* bashtypes.h -- Bash system types. */
|
/* bashtypes.h -- Bash system types. */
|
||||||
|
|
||||||
/* Copyright (C) 1993 Free Software Foundation, Inc.
|
/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (_BASHTYPES_H_)
|
#if !defined (_BASHTYPES_H_)
|
||||||
# define _BASHTYPES_H_
|
# define _BASHTYPES_H_
|
||||||
|
|
|
||||||
47
bracecomp.c
47
bracecomp.c
|
|
@ -4,25 +4,26 @@
|
||||||
|
|
||||||
/* Original version by tromey@cns.caltech.edu, Fri Feb 7 1992. */
|
/* Original version by tromey@cns.caltech.edu, Fri Feb 7 1992. */
|
||||||
|
|
||||||
/* Copyright (C) 1993 Free Software Foundation, Inc.
|
/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#if defined (BRACE_EXPANSION) && defined (READLINE)
|
#if defined (BRACE_EXPANSION) && defined (READLINE)
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
@ -35,10 +36,13 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "bashansi.h"
|
#include "bashansi.h"
|
||||||
|
#include "shmbutil.h"
|
||||||
|
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
#include <readline/readline.h>
|
#include <readline/readline.h>
|
||||||
|
|
||||||
|
static int _strcompare __P((char **, char **));
|
||||||
|
|
||||||
/* Find greatest common prefix of two strings. */
|
/* Find greatest common prefix of two strings. */
|
||||||
static int
|
static int
|
||||||
string_gcd (s1, s2)
|
string_gcd (s1, s2)
|
||||||
|
|
@ -145,6 +149,19 @@ really_munge_braces (array, real_start, real_end, gcd_zero)
|
||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_strcompare (s1, s2)
|
||||||
|
char **s1, **s2;
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = **s1 - **s2;
|
||||||
|
if (result == 0)
|
||||||
|
result = strcmp (*s1, *s2);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
hack_braces_completion (names)
|
hack_braces_completion (names)
|
||||||
char **names;
|
char **names;
|
||||||
|
|
@ -152,7 +169,11 @@ hack_braces_completion (names)
|
||||||
register int i;
|
register int i;
|
||||||
char *temp;
|
char *temp;
|
||||||
|
|
||||||
temp = really_munge_braces (names, 1, strvec_len (names), 0);
|
i = strvec_len (names);
|
||||||
|
if (MB_CUR_MAX > 1 && i > 2)
|
||||||
|
qsort (names+1, i-1, sizeof (char *), (QSFUNC *)_strcompare);
|
||||||
|
|
||||||
|
temp = really_munge_braces (names, 1, i, 0);
|
||||||
|
|
||||||
for (i = 0; names[i]; ++i)
|
for (i = 0; names[i]; ++i)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
106
braces.c
106
braces.c
|
|
@ -1,22 +1,22 @@
|
||||||
/* braces.c -- code for doing word expansion in curly braces. */
|
/* braces.c -- code for doing word expansion in curly braces. */
|
||||||
|
|
||||||
/* Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it
|
Bash is free software: you can redistribute it and/or modify
|
||||||
under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT
|
Bash is distributed in the hope that it will be useful,
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Bash; see the file COPYING. If not, write to the Free
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
/* Stuff in curly braces gets expanded before all other shell expansions. */
|
/* Stuff in curly braces gets expanded before all other shell expansions. */
|
||||||
|
|
||||||
|
|
@ -45,6 +45,8 @@
|
||||||
|
|
||||||
#define BRACE_SEQ_SPECIFIER ".."
|
#define BRACE_SEQ_SPECIFIER ".."
|
||||||
|
|
||||||
|
extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3)));
|
||||||
|
|
||||||
/* Basic idea:
|
/* Basic idea:
|
||||||
|
|
||||||
Segregate the text into 3 sections: preamble (stuff before an open brace),
|
Segregate the text into 3 sections: preamble (stuff before an open brace),
|
||||||
|
|
@ -55,13 +57,13 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* The character which is used to separate arguments. */
|
/* The character which is used to separate arguments. */
|
||||||
int brace_arg_separator = ',';
|
static const int brace_arg_separator = ',';
|
||||||
|
|
||||||
#if defined (__P)
|
#if defined (__P)
|
||||||
static int brace_gobbler __P((char *, size_t, int *, int));
|
static int brace_gobbler __P((char *, size_t, int *, int));
|
||||||
static char **expand_amble __P((char *, size_t, int));
|
static char **expand_amble __P((char *, size_t, int));
|
||||||
static char **expand_seqterm __P((char *, size_t));
|
static char **expand_seqterm __P((char *, size_t));
|
||||||
static char **mkseq __P((int, int, int, int));
|
static char **mkseq __P((int, int, int, int, int));
|
||||||
static char **array_concat __P((char **, char **));
|
static char **array_concat __P((char **, char **));
|
||||||
#else
|
#else
|
||||||
static int brace_gobbler ();
|
static int brace_gobbler ();
|
||||||
|
|
@ -301,10 +303,11 @@ expand_amble (text, tlen, flags)
|
||||||
#define ST_BAD 0
|
#define ST_BAD 0
|
||||||
#define ST_INT 1
|
#define ST_INT 1
|
||||||
#define ST_CHAR 2
|
#define ST_CHAR 2
|
||||||
|
#define ST_ZINT 3
|
||||||
|
|
||||||
static char **
|
static char **
|
||||||
mkseq (start, end, incr, type)
|
mkseq (start, end, incr, type, width)
|
||||||
int start, end, incr, type;
|
int start, end, incr, type, width;
|
||||||
{
|
{
|
||||||
int n, i;
|
int n, i;
|
||||||
char **result, *t;
|
char **result, *t;
|
||||||
|
|
@ -330,6 +333,12 @@ mkseq (start, end, incr, type)
|
||||||
#endif
|
#endif
|
||||||
if (type == ST_INT)
|
if (type == ST_INT)
|
||||||
result[i++] = itos (n);
|
result[i++] = itos (n);
|
||||||
|
else if (type == ST_ZINT)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
len = asprintf (&t, "%0*d", width, n);
|
||||||
|
result[i++] = t;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
t = (char *)xmalloc (2);
|
t = (char *)xmalloc (2);
|
||||||
|
|
@ -337,9 +346,9 @@ mkseq (start, end, incr, type)
|
||||||
t[1] = '\0';
|
t[1] = '\0';
|
||||||
result[i++] = t;
|
result[i++] = t;
|
||||||
}
|
}
|
||||||
if (n == end)
|
|
||||||
break;
|
|
||||||
n += incr;
|
n += incr;
|
||||||
|
if ((incr < 0 && n < end) || (incr > 0 && n > end))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
while (1);
|
while (1);
|
||||||
|
|
||||||
|
|
@ -353,17 +362,17 @@ expand_seqterm (text, tlen)
|
||||||
size_t tlen;
|
size_t tlen;
|
||||||
{
|
{
|
||||||
char *t, *lhs, *rhs;
|
char *t, *lhs, *rhs;
|
||||||
int i, lhs_t, rhs_t, lhs_v, rhs_v;
|
int i, lhs_t, rhs_t, lhs_v, rhs_v, incr, lhs_l, rhs_l, width;
|
||||||
intmax_t tl, tr;
|
intmax_t tl, tr;
|
||||||
char **result;
|
char **result, *ep;
|
||||||
|
|
||||||
t = strstr (text, BRACE_SEQ_SPECIFIER);
|
t = strstr (text, BRACE_SEQ_SPECIFIER);
|
||||||
if (t == 0)
|
if (t == 0)
|
||||||
return ((char **)NULL);
|
return ((char **)NULL);
|
||||||
|
|
||||||
i = t - text; /* index of start of BRACE_SEQ_SPECIFIER */
|
lhs_l = t - text; /* index of start of BRACE_SEQ_SPECIFIER */
|
||||||
lhs = substring (text, 0, i);
|
lhs = substring (text, 0, lhs_l);
|
||||||
rhs = substring (text, i + sizeof(BRACE_SEQ_SPECIFIER) - 1, tlen);
|
rhs = substring (text, lhs_l + sizeof(BRACE_SEQ_SPECIFIER) - 1, tlen);
|
||||||
|
|
||||||
if (lhs[0] == 0 || rhs[0] == 0)
|
if (lhs[0] == 0 || rhs[0] == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -376,8 +385,36 @@ expand_seqterm (text, tlen)
|
||||||
sides have to match. */
|
sides have to match. */
|
||||||
lhs_t = (legal_number (lhs, &tl)) ? ST_INT :
|
lhs_t = (legal_number (lhs, &tl)) ? ST_INT :
|
||||||
((ISALPHA (lhs[0]) && lhs[1] == 0) ? ST_CHAR : ST_BAD);
|
((ISALPHA (lhs[0]) && lhs[1] == 0) ? ST_CHAR : ST_BAD);
|
||||||
rhs_t = (legal_number (rhs, &tr)) ? ST_INT :
|
|
||||||
((ISALPHA (rhs[0]) && rhs[1] == 0) ? ST_CHAR : ST_BAD);
|
/* Decide on rhs and whether or not it looks like the user specified
|
||||||
|
an increment */
|
||||||
|
ep = 0;
|
||||||
|
if (ISDIGIT (rhs[0]) || ((rhs[0] == '+' || rhs[0] == '-') && ISDIGIT (rhs[1])))
|
||||||
|
{
|
||||||
|
rhs_t = ST_INT;
|
||||||
|
tr = strtoimax (rhs, &ep, 10);
|
||||||
|
if (ep && *ep != 0 && *ep != '.')
|
||||||
|
rhs_t = ST_BAD; /* invalid */
|
||||||
|
}
|
||||||
|
else if (ISALPHA (rhs[0]) && (rhs[1] == 0 || rhs[1] == '.'))
|
||||||
|
{
|
||||||
|
rhs_t = ST_CHAR;
|
||||||
|
ep = rhs + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rhs_t = ST_BAD;
|
||||||
|
ep = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
incr = 1;
|
||||||
|
if (rhs_t != ST_BAD)
|
||||||
|
{
|
||||||
|
if (ep && *ep == '.' && ep[1] == '.' && ep[2])
|
||||||
|
incr = strtoimax (ep + 2, &ep, 10);
|
||||||
|
if (*ep != 0)
|
||||||
|
rhs_t = ST_BAD; /* invalid incr */
|
||||||
|
}
|
||||||
|
|
||||||
if (lhs_t != rhs_t || lhs_t == ST_BAD || rhs_t == ST_BAD)
|
if (lhs_t != rhs_t || lhs_t == ST_BAD || rhs_t == ST_BAD)
|
||||||
{
|
{
|
||||||
|
|
@ -394,14 +431,27 @@ expand_seqterm (text, tlen)
|
||||||
{
|
{
|
||||||
lhs_v = (unsigned char)lhs[0];
|
lhs_v = (unsigned char)lhs[0];
|
||||||
rhs_v = (unsigned char)rhs[0];
|
rhs_v = (unsigned char)rhs[0];
|
||||||
|
width = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lhs_v = tl; /* integer truncation */
|
lhs_v = tl; /* integer truncation */
|
||||||
rhs_v = tr;
|
rhs_v = tr;
|
||||||
|
|
||||||
|
/* Decide whether or not the terms need zero-padding */
|
||||||
|
rhs_l = tlen - lhs_l - sizeof (BRACE_SEQ_SPECIFIER) + 1;
|
||||||
|
width = 0;
|
||||||
|
if (lhs_l > 1 && lhs[0] == '0')
|
||||||
|
width = lhs_l, lhs_t = ST_ZINT;
|
||||||
|
if (lhs_l > 2 && lhs[0] == '-' && lhs[1] == '0')
|
||||||
|
width = lhs_l, lhs_t = ST_ZINT;
|
||||||
|
if (rhs_l > 1 && rhs[0] == '0' && width < rhs_l)
|
||||||
|
width = rhs_l, lhs_t = ST_ZINT;
|
||||||
|
if (rhs_l > 2 && rhs[0] == '-' && rhs[1] == '0' && width < rhs_l)
|
||||||
|
width = rhs_l, lhs_t = ST_ZINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = mkseq (lhs_v, rhs_v, 1, lhs_t);
|
result = mkseq (lhs_v, rhs_v, incr, lhs_t, width);
|
||||||
|
|
||||||
free (lhs);
|
free (lhs);
|
||||||
free (rhs);
|
free (rhs);
|
||||||
|
|
@ -486,11 +536,11 @@ brace_gobbler (text, tlen, indx, satisfy)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (SHELL)
|
#if defined (SHELL)
|
||||||
/* Pass new-style command substitutions through unchanged. */
|
/* Pass new-style command and process substitutions through unchanged. */
|
||||||
if (c == '$' && text[i+1] == '(') /* ) */
|
if ((c == '$' || c == '<' || c == '>') && text[i+1] == '(') /* ) */
|
||||||
{
|
{
|
||||||
si = i + 2;
|
si = i + 2;
|
||||||
t = extract_command_subst (text, &si);
|
t = extract_command_subst (text, &si, 0);
|
||||||
i = si;
|
i = si;
|
||||||
free (t);
|
free (t);
|
||||||
i++;
|
i++;
|
||||||
|
|
|
||||||
31
builtins.h
31
builtins.h
|
|
@ -1,22 +1,22 @@
|
||||||
/* builtins.h -- What a builtin looks like, and where to find them. */
|
/* builtins.h -- What a builtin looks like, and where to find them. */
|
||||||
|
|
||||||
/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
|
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it
|
Bash is free software: you can redistribute it and/or modify
|
||||||
under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT
|
Bash is distributed in the hope that it will be useful,
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Bash; see the file COPYING. If not, write to the Free
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
|
@ -35,11 +35,12 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Flags describing various things about a builtin. */
|
/* Flags describing various things about a builtin. */
|
||||||
#define BUILTIN_ENABLED 0x1 /* This builtin is enabled. */
|
#define BUILTIN_ENABLED 0x01 /* This builtin is enabled. */
|
||||||
#define BUILTIN_DELETED 0x2 /* This has been deleted with enable -d. */
|
#define BUILTIN_DELETED 0x02 /* This has been deleted with enable -d. */
|
||||||
#define STATIC_BUILTIN 0x4 /* This builtin is not dynamically loaded. */
|
#define STATIC_BUILTIN 0x04 /* This builtin is not dynamically loaded. */
|
||||||
#define SPECIAL_BUILTIN 0x8 /* This is a Posix `special' builtin. */
|
#define SPECIAL_BUILTIN 0x08 /* This is a Posix `special' builtin. */
|
||||||
#define ASSIGNMENT_BUILTIN 0x10 /* This builtin takes assignment statements. */
|
#define ASSIGNMENT_BUILTIN 0x10 /* This builtin takes assignment statements. */
|
||||||
|
#define POSIX_BUILTIN 0x20 /* This builtins is special in the Posix command search order. */
|
||||||
|
|
||||||
#define BASE_INDENT 4
|
#define BASE_INDENT 4
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
# This Makefile for building libbuiltins.a is in -*- text -*- for Emacs.
|
# This Makefile for building libbuiltins.a is in -*- text -*- for Emacs.
|
||||||
#
|
#
|
||||||
# Copyright (C) 1996-2005 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
# any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
@ -13,8 +13,7 @@
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
PACKAGE = @PACKAGE_NAME@
|
PACKAGE = @PACKAGE_NAME@
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
|
@ -39,9 +38,12 @@ prefix = @prefix@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
VPATH = .:@srcdir@
|
VPATH = .:@srcdir@
|
||||||
topdir = @top_srcdir@
|
topdir = @top_srcdir@
|
||||||
|
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
|
||||||
includedir = @includedir@
|
includedir = @includedir@
|
||||||
datadir = @datadir@
|
datadir = @datadir@
|
||||||
localedir = $(datadir)/locale
|
localedir = @localedir@
|
||||||
|
|
||||||
# Support an alternate destination root directory for package building
|
# Support an alternate destination root directory for package building
|
||||||
DESTDIR =
|
DESTDIR =
|
||||||
|
|
@ -63,7 +65,7 @@ LOCAL_DEFS = @LOCAL_DEFS@
|
||||||
|
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
LDFLAGS = @LDFLAGS@ $(LOCAL_LDFLAGS) $(CFLAGS)
|
LDFLAGS = @LDFLAGS@ $(LOCAL_LDFLAGS) $(CFLAGS)
|
||||||
LDFLAGS_FOR_BUILD = $(LDFLAGS)
|
LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@ $(LOCAL_LDFLAGS) $(CFLAGS_FOR_BUILD)
|
||||||
LOCAL_LDFLAGS = @LOCAL_LDFLAGS@
|
LOCAL_LDFLAGS = @LOCAL_LDFLAGS@
|
||||||
#LIBS_FOR_BUILD = @LIBS_FOR_BUILD@
|
#LIBS_FOR_BUILD = @LIBS_FOR_BUILD@
|
||||||
LIBS_FOR_BUILD = $(LIBS)
|
LIBS_FOR_BUILD = $(LIBS)
|
||||||
|
|
@ -74,7 +76,10 @@ RL_INCLUDEDIR = @RL_INCLUDEDIR@
|
||||||
|
|
||||||
INTL_LIBSRC = ${topdir}/lib/intl
|
INTL_LIBSRC = ${topdir}/lib/intl
|
||||||
INTL_BUILDDIR = ${LIBBUILD}/intl
|
INTL_BUILDDIR = ${LIBBUILD}/intl
|
||||||
|
INTL_LIBDIR = ${INTL_BUILDDIR}
|
||||||
|
INTL_LIBRARY = ${INTL_BUILDDIR}/libintl.a
|
||||||
INTL_INC = @INTL_INC@
|
INTL_INC = @INTL_INC@
|
||||||
|
INTL_DEP = @INTL_DEP@
|
||||||
LIBINTL_H = @LIBINTL_H@
|
LIBINTL_H = @LIBINTL_H@
|
||||||
|
|
||||||
HELPDIR = @HELPDIR@
|
HELPDIR = @HELPDIR@
|
||||||
|
|
@ -134,7 +139,7 @@ DEFSRC = $(srcdir)/alias.def $(srcdir)/bind.def $(srcdir)/break.def \
|
||||||
$(srcdir)/times.def $(srcdir)/trap.def $(srcdir)/type.def \
|
$(srcdir)/times.def $(srcdir)/trap.def $(srcdir)/type.def \
|
||||||
$(srcdir)/ulimit.def $(srcdir)/umask.def $(srcdir)/wait.def \
|
$(srcdir)/ulimit.def $(srcdir)/umask.def $(srcdir)/wait.def \
|
||||||
$(srcdir)/reserved.def $(srcdir)/pushd.def $(srcdir)/shopt.def \
|
$(srcdir)/reserved.def $(srcdir)/pushd.def $(srcdir)/shopt.def \
|
||||||
$(srcdir)/printf.def $(srcdir)/complete.def
|
$(srcdir)/printf.def $(srcdir)/complete.def $(srcdir)/mapfile.def
|
||||||
|
|
||||||
STATIC_SOURCE = common.c evalstring.c evalfile.c getopt.c bashgetopt.c \
|
STATIC_SOURCE = common.c evalstring.c evalfile.c getopt.c bashgetopt.c \
|
||||||
getopt.h
|
getopt.h
|
||||||
|
|
@ -142,8 +147,8 @@ STATIC_SOURCE = common.c evalstring.c evalfile.c getopt.c bashgetopt.c \
|
||||||
OFILES = builtins.o \
|
OFILES = builtins.o \
|
||||||
alias.o bind.o break.o builtin.o caller.o cd.o colon.o command.o \
|
alias.o bind.o break.o builtin.o caller.o cd.o colon.o command.o \
|
||||||
common.o declare.o echo.o enable.o eval.o evalfile.o \
|
common.o declare.o echo.o enable.o eval.o evalfile.o \
|
||||||
evalstring.o exec.o \
|
evalstring.o exec.o exit.o fc.o fg_bg.o hash.o help.o history.o \
|
||||||
exit.o fc.o fg_bg.o hash.o help.o history.o jobs.o kill.o let.o \
|
jobs.o kill.o let.o mapfile.o \
|
||||||
pushd.o read.o return.o set.o setattr.o shift.o source.o \
|
pushd.o read.o return.o set.o setattr.o shift.o source.o \
|
||||||
suspend.o test.o times.o trap.o type.o ulimit.o umask.o \
|
suspend.o test.o times.o trap.o type.o ulimit.o umask.o \
|
||||||
wait.o getopts.o shopt.o printf.o getopt.o bashgetopt.o complete.o
|
wait.o getopts.o shopt.o printf.o getopt.o bashgetopt.o complete.o
|
||||||
|
|
@ -236,6 +241,11 @@ $(OFILES): $(MKBUILTINS) ../config.h
|
||||||
po: builtins.c
|
po: builtins.c
|
||||||
xgettext -L C -o $(topdir)/po/builtins.pot --keyword='N_' builtins.c 2>/dev/null
|
xgettext -L C -o $(topdir)/po/builtins.pot --keyword='N_' builtins.c 2>/dev/null
|
||||||
|
|
||||||
|
${LIBINTL_H}:
|
||||||
|
@echo making $@ in ${INTL_BUILDDIR}
|
||||||
|
@(cd ${INTL_BUILDDIR} && \
|
||||||
|
$(MAKE) $(MFLAGS) libintl.h) || exit 1
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
|
|
||||||
alias.o: alias.def
|
alias.o: alias.def
|
||||||
|
|
@ -260,6 +270,7 @@ history.o: history.def
|
||||||
jobs.o: jobs.def
|
jobs.o: jobs.def
|
||||||
kill.o: kill.def
|
kill.o: kill.def
|
||||||
let.o: let.def
|
let.o: let.def
|
||||||
|
mapfile.o: mapfile.def
|
||||||
printf.o: printf.def
|
printf.o: printf.def
|
||||||
pushd.o: pushd.def
|
pushd.o: pushd.def
|
||||||
read.o: read.def
|
read.o: read.def
|
||||||
|
|
@ -584,6 +595,12 @@ complete.o: ${topdir}/bashtypes.h ${topdir}/bashansi.h ${BASHINCDIR}/ansi_stdlib
|
||||||
complete.o: ${topdir}/builtins.h
|
complete.o: ${topdir}/builtins.h
|
||||||
complete.o: ${topdir}/pcomplete.h
|
complete.o: ${topdir}/pcomplete.h
|
||||||
complete.o: ${srcdir}/common.h ${srcdir}/bashgetopt.h
|
complete.o: ${srcdir}/common.h ${srcdir}/bashgetopt.h
|
||||||
|
mapfile.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
|
||||||
|
mapfile.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
|
||||||
|
mapfile.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
|
||||||
|
mapfile.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
|
||||||
|
mapfile.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/variables.h $(topdir)/conftypes.h
|
||||||
|
mapfile.o: $(topdir)/arrayfunc.h
|
||||||
|
|
||||||
#bind.o: $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)readline.h $(RL_LIBSRC)keymaps.h
|
#bind.o: $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)readline.h $(RL_LIBSRC)keymaps.h
|
||||||
|
|
||||||
|
|
@ -609,7 +626,8 @@ inlib.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
jobs.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
jobs.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
kill.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
kill.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
let.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
let.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
mkbuiltins.c: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
mapfile.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
|
mkbuiltins.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
printf.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
printf.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
pushd.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
pushd.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
read.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
read.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,43 @@
|
||||||
This file is alias.def, from which is created alias.c
|
This file is alias.def, from which is created alias.c
|
||||||
It implements the builtins "alias" and "unalias" in Bash.
|
It implements the builtins "alias" and "unalias" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2004 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$BUILTIN alias
|
$BUILTIN alias
|
||||||
$FUNCTION alias_builtin
|
$FUNCTION alias_builtin
|
||||||
$DEPENDS_ON ALIAS
|
$DEPENDS_ON ALIAS
|
||||||
$PRODUCES alias.c
|
$PRODUCES alias.c
|
||||||
$SHORT_DOC alias [-p] [name[=value] ... ]
|
$SHORT_DOC alias [-p] [name[=value] ... ]
|
||||||
`alias' with no arguments or with the -p option prints the list
|
Define or display aliases.
|
||||||
of aliases in the form alias NAME=VALUE on standard output.
|
|
||||||
|
Without arguments, `alias' prints the list of aliases in the reusable
|
||||||
|
form `alias NAME=VALUE' on standard output.
|
||||||
|
|
||||||
Otherwise, an alias is defined for each NAME whose VALUE is given.
|
Otherwise, an alias is defined for each NAME whose VALUE is given.
|
||||||
A trailing space in VALUE causes the next word to be checked for
|
A trailing space in VALUE causes the next word to be checked for
|
||||||
alias substitution when the alias is expanded. Alias returns
|
alias substitution when the alias is expanded.
|
||||||
true unless a NAME is given for which no alias has been defined.
|
|
||||||
|
Options:
|
||||||
|
-p Print all defined aliases in a reusable format
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
alias returns true unless a NAME is supplied for which no alias has been
|
||||||
|
defined.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -103,7 +111,7 @@ alias_builtin (list)
|
||||||
free (alias_list); /* XXX - Do not free the strings. */
|
free (alias_list); /* XXX - Do not free the strings. */
|
||||||
|
|
||||||
if (list == 0)
|
if (list == 0)
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
any_failed = 0;
|
any_failed = 0;
|
||||||
|
|
@ -149,8 +157,12 @@ $BUILTIN unalias
|
||||||
$FUNCTION unalias_builtin
|
$FUNCTION unalias_builtin
|
||||||
$DEPENDS_ON ALIAS
|
$DEPENDS_ON ALIAS
|
||||||
$SHORT_DOC unalias [-a] name [name ...]
|
$SHORT_DOC unalias [-a] name [name ...]
|
||||||
Remove NAMEs from the list of defined aliases. If the -a option is given,
|
Remove each NAME from the list of defined aliases.
|
||||||
then remove all alias definitions.
|
|
||||||
|
Options:
|
||||||
|
-a remove all alias definitions.
|
||||||
|
|
||||||
|
Return success unless a NAME is not an existing alias.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#if defined (ALIAS)
|
#if defined (ALIAS)
|
||||||
|
|
|
||||||
|
|
@ -2,21 +2,21 @@
|
||||||
|
|
||||||
/* Copyright (C) 1992-2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1992-2002 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,19 +4,19 @@
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
/* See getopt.h for the explanation of these variables. */
|
/* See getopt.h for the explanation of these variables. */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
This file is bind.def, from which is created bind.c.
|
This file is bind.def, from which is created bind.c.
|
||||||
It implements the builtin "bind" in Bash.
|
It implements the builtin "bind" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES bind.c
|
$PRODUCES bind.c
|
||||||
|
|
||||||
|
|
@ -27,12 +26,15 @@ $BUILTIN bind
|
||||||
$DEPENDS_ON READLINE
|
$DEPENDS_ON READLINE
|
||||||
$FUNCTION bind_builtin
|
$FUNCTION bind_builtin
|
||||||
$SHORT_DOC bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function or readline-command]
|
$SHORT_DOC bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function or readline-command]
|
||||||
Bind a key sequence to a Readline function or a macro, or set
|
Set Readline key bindings and variables.
|
||||||
a Readline variable. The non-option argument syntax is equivalent
|
|
||||||
to that found in ~/.inputrc, but must be passed as a single argument:
|
Bind a key sequence to a Readline function or a macro, or set a
|
||||||
bind '"\C-x\C-r": re-read-init-file'.
|
Readline variable. The non-option argument syntax is equivalent to
|
||||||
bind accepts the following options:
|
that found in ~/.inputrc, but must be passed as a single argument:
|
||||||
-m keymap Use `keymap' as the keymap for the duration of this
|
e.g., bind '"\C-x\C-r": re-read-init-file'.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-m keymap Use KEYMAP as the keymap for the duration of this
|
||||||
command. Acceptable keymap names are emacs,
|
command. Acceptable keymap names are emacs,
|
||||||
emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
|
emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
|
||||||
vi-command, and vi-insert.
|
vi-command, and vi-insert.
|
||||||
|
|
@ -40,18 +42,21 @@ bind accepts the following options:
|
||||||
-P List function names and bindings.
|
-P List function names and bindings.
|
||||||
-p List functions and bindings in a form that can be
|
-p List functions and bindings in a form that can be
|
||||||
reused as input.
|
reused as input.
|
||||||
-r keyseq Remove the binding for KEYSEQ.
|
|
||||||
-x keyseq:shell-command Cause SHELL-COMMAND to be executed when
|
|
||||||
KEYSEQ is entered.
|
|
||||||
-f filename Read key bindings from FILENAME.
|
|
||||||
-q function-name Query about which keys invoke the named function.
|
|
||||||
-u function-name Unbind all keys which are bound to the named function.
|
|
||||||
-V List variable names and values
|
|
||||||
-v List variable names and values in a form that can
|
|
||||||
be reused as input.
|
|
||||||
-S List key sequences that invoke macros and their values
|
-S List key sequences that invoke macros and their values
|
||||||
-s List key sequences that invoke macros and their values
|
-s List key sequences that invoke macros and their values
|
||||||
in a form that can be reused as input.
|
in a form that can be reused as input.
|
||||||
|
-V List variable names and values
|
||||||
|
-v List variable names and values in a form that can
|
||||||
|
be reused as input.
|
||||||
|
-q function-name Query about which keys invoke the named function.
|
||||||
|
-u function-name Unbind all keys which are bound to the named function.
|
||||||
|
-r keyseq Remove the binding for KEYSEQ.
|
||||||
|
-f filename Read key bindings from FILENAME.
|
||||||
|
-x keyseq:shell-command Cause SHELL-COMMAND to be executed when
|
||||||
|
KEYSEQ is entered.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
bind returns 0 unless an unrecognized option is given or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#if defined (READLINE)
|
#if defined (READLINE)
|
||||||
|
|
@ -110,14 +115,21 @@ bind_builtin (list)
|
||||||
char *initfile, *map_name, *fun_name, *unbind_name, *remove_seq, *cmd_seq;
|
char *initfile, *map_name, *fun_name, *unbind_name, *remove_seq, *cmd_seq;
|
||||||
|
|
||||||
if (no_line_editing)
|
if (no_line_editing)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
builtin_error (_("line editing not enabled"));
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
|
#else
|
||||||
|
builtin_warning (_("line editing not enabled"));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
kmap = saved_keymap = (Keymap) NULL;
|
kmap = saved_keymap = (Keymap) NULL;
|
||||||
flags = 0;
|
flags = 0;
|
||||||
initfile = map_name = fun_name = unbind_name = remove_seq = (char *)NULL;
|
initfile = map_name = fun_name = unbind_name = remove_seq = (char *)NULL;
|
||||||
return_code = EXECUTION_SUCCESS;
|
return_code = EXECUTION_SUCCESS;
|
||||||
|
|
||||||
if (!bash_readline_initialized)
|
if (bash_readline_initialized == 0)
|
||||||
initialize_readline ();
|
initialize_readline ();
|
||||||
|
|
||||||
begin_unwind_frame ("bind_builtin");
|
begin_unwind_frame ("bind_builtin");
|
||||||
|
|
@ -266,7 +278,7 @@ bind_builtin (list)
|
||||||
|
|
||||||
run_unwind_frame ("bind_builtin");
|
run_unwind_frame ("bind_builtin");
|
||||||
|
|
||||||
return (return_code);
|
return (sh_chkwrite (return_code));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -310,7 +322,7 @@ unbind_command (name)
|
||||||
function = rl_named_function (name);
|
function = rl_named_function (name);
|
||||||
if (function == 0)
|
if (function == 0)
|
||||||
{
|
{
|
||||||
builtin_error ("`%s': unknown function name", name);
|
builtin_error (_("`%s': unknown function name"), name);
|
||||||
return EXECUTION_FAILURE;
|
return EXECUTION_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,31 +1,35 @@
|
||||||
This file is break.def, from which is created break.c.
|
This file is break.def, from which is created break.c.
|
||||||
It implements the builtins "break" and "continue" in Bash.
|
It implements the builtins "break" and "continue" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES break.c
|
$PRODUCES break.c
|
||||||
|
|
||||||
$BUILTIN break
|
$BUILTIN break
|
||||||
$FUNCTION break_builtin
|
$FUNCTION break_builtin
|
||||||
$SHORT_DOC break [n]
|
$SHORT_DOC break [n]
|
||||||
Exit from within a FOR, WHILE or UNTIL loop. If N is specified,
|
Exit for, while, or until loops.
|
||||||
break N levels.
|
|
||||||
|
Exit a FOR, WHILE or UNTIL loop. If N is specified, break N enclosing
|
||||||
|
loops.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
The exit status is 0 unless N is not greater than or equal to 1.
|
||||||
$END
|
$END
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
@ -66,11 +70,11 @@ break_builtin (list)
|
||||||
if (check_loop_level () == 0)
|
if (check_loop_level () == 0)
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
||||||
newbreak = get_numeric_arg (list, 1);
|
(void)get_numeric_arg (list, 1, &newbreak);
|
||||||
|
|
||||||
if (newbreak <= 0)
|
if (newbreak <= 0)
|
||||||
{
|
{
|
||||||
sh_erange (list->word->word, "loop count");
|
sh_erange (list->word->word, _("loop count"));
|
||||||
breaking = loop_level;
|
breaking = loop_level;
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
@ -86,8 +90,13 @@ break_builtin (list)
|
||||||
$BUILTIN continue
|
$BUILTIN continue
|
||||||
$FUNCTION continue_builtin
|
$FUNCTION continue_builtin
|
||||||
$SHORT_DOC continue [n]
|
$SHORT_DOC continue [n]
|
||||||
Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop.
|
Resume for, while, or until loops.
|
||||||
If N is specified, resume at the N-th enclosing loop.
|
|
||||||
|
Resumes the next iteration of the enclosing FOR, WHILE or UNTIL loop.
|
||||||
|
If N is specified, resumes the Nth enclosing loop.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
The exit status is 0 unless N is not greater than or equal to 1.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
/* Set up to continue x levels, where x defaults to 1, but can be specified
|
/* Set up to continue x levels, where x defaults to 1, but can be specified
|
||||||
|
|
@ -101,11 +110,11 @@ continue_builtin (list)
|
||||||
if (check_loop_level () == 0)
|
if (check_loop_level () == 0)
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
||||||
newcont = get_numeric_arg (list, 1);
|
(void)get_numeric_arg (list, 1, &newcont);
|
||||||
|
|
||||||
if (newcont <= 0)
|
if (newcont <= 0)
|
||||||
{
|
{
|
||||||
sh_erange (list->word->word, "loop count");
|
sh_erange (list->word->word, _("loop count"));
|
||||||
breaking = loop_level;
|
breaking = loop_level;
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,37 @@
|
||||||
This file is builtin.def, from which is created builtin.c.
|
This file is builtin.def, from which is created builtin.c.
|
||||||
It implements the builtin "builtin" in Bash.
|
It implements the builtin "builtin" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2002 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES builtin.c
|
$PRODUCES builtin.c
|
||||||
|
|
||||||
$BUILTIN builtin
|
$BUILTIN builtin
|
||||||
$FUNCTION builtin_builtin
|
$FUNCTION builtin_builtin
|
||||||
$SHORT_DOC builtin [shell-builtin [arg ...]]
|
$SHORT_DOC builtin [shell-builtin [arg ...]]
|
||||||
Run a shell builtin. This is useful when you wish to rename a
|
Execute shell builtins.
|
||||||
shell builtin to be a function, but need the functionality of the
|
|
||||||
builtin within the function itself.
|
Execute SHELL-BUILTIN with arguments ARGs without performing command
|
||||||
|
lookup. This is useful when you wish to reimplement a shell builtin
|
||||||
|
as a shell function, but need to execute the builtin within the function.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the exit status of SHELL-BUILTIN, or false if SHELL-BUILTIN is
|
||||||
|
not a shell builtin..
|
||||||
$END
|
$END
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,39 +1,41 @@
|
||||||
This file is caller.def, from which is created caller.c. It implements the
|
This file is caller.def, from which is created caller.c. It implements the
|
||||||
builtin "caller" in Bash.
|
builtin "caller" in Bash.
|
||||||
|
|
||||||
Copyright (C) 2002-2003 Rocky Bernstein for Free Software Foundation, Inc.
|
Copyright (C) 2002-2008 Rocky Bernstein for Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES caller.c
|
$PRODUCES caller.c
|
||||||
|
|
||||||
$BUILTIN caller
|
$BUILTIN caller
|
||||||
$FUNCTION caller_builtin
|
$FUNCTION caller_builtin
|
||||||
$DEPENDS_ON DEBUGGER
|
$DEPENDS_ON DEBUGGER
|
||||||
$SHORT_DOC caller [EXPR]
|
$SHORT_DOC caller [expr]
|
||||||
|
Return the context of the current subroutine call.
|
||||||
|
|
||||||
Returns the context of the current subroutine call.
|
Without EXPR, returns "$line $filename". With EXPR, returns
|
||||||
|
"$line $subroutine $filename"; this extra information can be used to
|
||||||
Without EXPR, returns "$line $filename". With EXPR,
|
provide a stack trace.
|
||||||
returns "$line $subroutine $filename"; this extra information
|
|
||||||
can be used to provide a stack trace.
|
|
||||||
|
|
||||||
The value of EXPR indicates how many call frames to go back before the
|
The value of EXPR indicates how many call frames to go back before the
|
||||||
current one; the top frame is frame 0.
|
current one; the top frame is frame 0.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns 0 unless the shell is not executing a shell function or EXPR
|
||||||
|
is invalid.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -128,14 +130,14 @@ caller_builtin (list)
|
||||||
|
|
||||||
#ifdef LOADABLE_BUILTIN
|
#ifdef LOADABLE_BUILTIN
|
||||||
static char *caller_doc[] = {
|
static char *caller_doc[] = {
|
||||||
N_("Returns the context of the current subroutine call."),
|
N_("Returns the context of the current subroutine call.\n\
|
||||||
N_(" "),
|
\n\
|
||||||
N_("Without EXPR, returns returns \"$line $filename\". With EXPR,"),
|
Without EXPR, returns "$line $filename". With EXPR, returns\n\
|
||||||
N_("returns \"$line $subroutine $filename\"; this extra information"),
|
"$line $subroutine $filename"; this extra information can be used to\n\
|
||||||
N_("can be used used to provide a stack trace."),
|
provide a stack trace.\n\
|
||||||
N_(" "),
|
\n\
|
||||||
N_("The value of EXPR indicates how many call frames to go back before the"),
|
The value of EXPR indicates how many call frames to go back before the\n\
|
||||||
N_("current one; the top frame is frame 0."),
|
current one; the top frame is frame 0."),
|
||||||
(char *)NULL
|
(char *)NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
121
builtins/cd.def
121
builtins/cd.def
|
|
@ -1,23 +1,22 @@
|
||||||
This file is cd.def, from which is created cd.c. It implements the
|
This file is cd.def, from which is created cd.c. It implements the
|
||||||
builtins "cd" and "pwd" in Bash.
|
builtins "cd" and "pwd" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES cd.c
|
$PRODUCES cd.c
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -56,15 +55,13 @@ extern int errno;
|
||||||
|
|
||||||
extern int posixly_correct;
|
extern int posixly_correct;
|
||||||
extern int array_needs_making;
|
extern int array_needs_making;
|
||||||
extern char *bash_getcwd_errstr;
|
extern const char * const bash_getcwd_errstr;
|
||||||
|
|
||||||
static int bindpwd __P((int));
|
static int bindpwd __P((int));
|
||||||
static void setpwd __P((char *));
|
static void setpwd __P((char *));
|
||||||
static char *resetpwd __P((char *));
|
static char *resetpwd __P((char *));
|
||||||
static int change_to_directory __P((char *, int));
|
static int change_to_directory __P((char *, int));
|
||||||
|
|
||||||
static char *cdspell __P((char *));
|
|
||||||
|
|
||||||
/* Change this to 1 to get cd spelling correction by default. */
|
/* Change this to 1 to get cd spelling correction by default. */
|
||||||
int cdspelling = 0;
|
int cdspelling = 0;
|
||||||
|
|
||||||
|
|
@ -73,17 +70,29 @@ int cdable_vars;
|
||||||
$BUILTIN cd
|
$BUILTIN cd
|
||||||
$FUNCTION cd_builtin
|
$FUNCTION cd_builtin
|
||||||
$SHORT_DOC cd [-L|-P] [dir]
|
$SHORT_DOC cd [-L|-P] [dir]
|
||||||
Change the current directory to DIR. The variable $HOME is the
|
Change the shell working directory.
|
||||||
default DIR. The variable CDPATH defines the search path for
|
|
||||||
the directory containing DIR. Alternative directory names in CDPATH
|
Change the current directory to DIR. The default DIR is the value of the
|
||||||
are separated by a colon (:). A null directory name is the same as
|
HOME shell variable.
|
||||||
the current directory, i.e. `.'. If DIR begins with a slash (/),
|
|
||||||
then CDPATH is not used. If the directory is not found, and the
|
The variable CDPATH defines the search path for the directory containing
|
||||||
shell option `cdable_vars' is set, then try the word as a variable
|
DIR. Alternative directory names in CDPATH are separated by a colon (:).
|
||||||
name. If that variable has a value, then cd to the value of that
|
A null directory name is the same as the current directory. If DIR begins
|
||||||
variable. The -P option says to use the physical directory structure
|
with a slash (/), then CDPATH is not used.
|
||||||
instead of following symbolic links; the -L option forces symbolic links
|
|
||||||
to be followed.
|
If the directory is not found, and the shell option `cdable_vars' is set,
|
||||||
|
the word is assumed to be a variable name. If that variable has a value,
|
||||||
|
its value is used for DIR.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-L force symbolic links to be followed
|
||||||
|
-P use the physical directory structure without following symbolic
|
||||||
|
links
|
||||||
|
|
||||||
|
The default is to follow symbolic links, as if `-L' were specified.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns 0 if the directory is changed; non-zero otherwise.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
/* Just set $PWD, don't change OLDPWD. Used by `pwd -P' in posix mode. */
|
/* Just set $PWD, don't change OLDPWD. Used by `pwd -P' in posix mode. */
|
||||||
|
|
@ -108,9 +117,11 @@ bindpwd (no_symlinks)
|
||||||
int no_symlinks;
|
int no_symlinks;
|
||||||
{
|
{
|
||||||
char *dirname, *pwdvar;
|
char *dirname, *pwdvar;
|
||||||
int old_anm;
|
int old_anm, r;
|
||||||
SHELL_VAR *tvar;
|
SHELL_VAR *tvar;
|
||||||
|
|
||||||
|
r = sh_chkwrite (EXECUTION_SUCCESS);
|
||||||
|
|
||||||
#define tcwd the_current_working_directory
|
#define tcwd the_current_working_directory
|
||||||
dirname = tcwd ? (no_symlinks ? sh_physpath (tcwd, 0) : tcwd)
|
dirname = tcwd ? (no_symlinks ? sh_physpath (tcwd, 0) : tcwd)
|
||||||
: get_working_directory ("cd");
|
: get_working_directory ("cd");
|
||||||
|
|
@ -131,7 +142,7 @@ bindpwd (no_symlinks)
|
||||||
if (dirname && dirname != the_current_working_directory)
|
if (dirname && dirname != the_current_working_directory)
|
||||||
free (dirname);
|
free (dirname);
|
||||||
|
|
||||||
return (EXECUTION_SUCCESS);
|
return (r);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call get_working_directory to reset the value of
|
/* Call get_working_directory to reset the value of
|
||||||
|
|
@ -224,7 +235,7 @@ cd_builtin (list)
|
||||||
}
|
}
|
||||||
else if (absolute_pathname (list->word->word))
|
else if (absolute_pathname (list->word->word))
|
||||||
dirname = list->word->word;
|
dirname = list->word->word;
|
||||||
else if (cdpath = get_string_value ("CDPATH"))
|
else if (privileged_mode == 0 && (cdpath = get_string_value ("CDPATH")))
|
||||||
{
|
{
|
||||||
dirname = list->word->word;
|
dirname = list->word->word;
|
||||||
|
|
||||||
|
|
@ -300,7 +311,7 @@ cd_builtin (list)
|
||||||
typo. This is similar to the UNIX 8th and 9th Edition shells. */
|
typo. This is similar to the UNIX 8th and 9th Edition shells. */
|
||||||
if (lflag & LCD_DOSPELL)
|
if (lflag & LCD_DOSPELL)
|
||||||
{
|
{
|
||||||
temp = cdspell (dirname);
|
temp = dirspell (dirname);
|
||||||
if (temp && change_to_directory (temp, no_symlinks))
|
if (temp && change_to_directory (temp, no_symlinks))
|
||||||
{
|
{
|
||||||
printf ("%s\n", temp);
|
printf ("%s\n", temp);
|
||||||
|
|
@ -317,9 +328,18 @@ cd_builtin (list)
|
||||||
$BUILTIN pwd
|
$BUILTIN pwd
|
||||||
$FUNCTION pwd_builtin
|
$FUNCTION pwd_builtin
|
||||||
$SHORT_DOC pwd [-LP]
|
$SHORT_DOC pwd [-LP]
|
||||||
Print the current working directory. With the -P option, pwd prints
|
Print the name of the current working directory.
|
||||||
the physical directory, without any symbolic links; the -L option
|
|
||||||
makes pwd follow symbolic links.
|
Options:
|
||||||
|
-L print the value of $PWD if it names the current working
|
||||||
|
directory
|
||||||
|
-P print the physical directory, without any symbolic links
|
||||||
|
|
||||||
|
By default, `pwd' behaves as if `-L' were specified.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns 0 unless an invalid option is given or the current directory
|
||||||
|
cannot be read.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
/* Non-zero means that pwd always prints the physical directory, without
|
/* Non-zero means that pwd always prints the physical directory, without
|
||||||
|
|
@ -375,15 +395,7 @@ pwd_builtin (list)
|
||||||
setpwd (directory);
|
setpwd (directory);
|
||||||
if (directory != the_current_working_directory)
|
if (directory != the_current_working_directory)
|
||||||
free (directory);
|
free (directory);
|
||||||
fflush (stdout);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
if (ferror (stdout))
|
|
||||||
{
|
|
||||||
sh_wrerror ();
|
|
||||||
clearerr (stdout);
|
|
||||||
return (EXECUTION_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (EXECUTION_SUCCESS);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
|
|
@ -499,28 +511,3 @@ change_to_directory (newdir, nolinks)
|
||||||
free (tdir);
|
free (tdir);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Code for cd spelling correction. Original patch submitted by
|
|
||||||
Neil Russel (caret@c-side.com). */
|
|
||||||
|
|
||||||
static char *
|
|
||||||
cdspell (dirname)
|
|
||||||
char *dirname;
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
char *guess;
|
|
||||||
|
|
||||||
n = (strlen (dirname) * 3 + 1) / 2 + 1;
|
|
||||||
guess = (char *)xmalloc (n);
|
|
||||||
|
|
||||||
switch (spname (dirname, guess))
|
|
||||||
{
|
|
||||||
case -1:
|
|
||||||
default:
|
|
||||||
free (guess);
|
|
||||||
return (char *)NULL;
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
return guess;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
This file is colon.def, from which is created colon.c.
|
This file is colon.def, from which is created colon.c.
|
||||||
It implements the builtin ":" in Bash.
|
It implements the builtin ":" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2002 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES colon.c
|
$PRODUCES colon.c
|
||||||
|
|
||||||
|
|
@ -25,19 +24,30 @@ $BUILTIN :
|
||||||
$DOCNAME colon
|
$DOCNAME colon
|
||||||
$FUNCTION colon_builtin
|
$FUNCTION colon_builtin
|
||||||
$SHORT_DOC :
|
$SHORT_DOC :
|
||||||
No effect; the command does nothing. A zero exit code is returned.
|
Null command.
|
||||||
|
|
||||||
|
No effect; the command does nothing.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Always succeeds.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN true
|
$BUILTIN true
|
||||||
$FUNCTION colon_builtin
|
$FUNCTION colon_builtin
|
||||||
$SHORT_DOC true
|
$SHORT_DOC true
|
||||||
Return a successful result.
|
Return a successful result.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Always succeeds.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN false
|
$BUILTIN false
|
||||||
$FUNCTION false_builtin
|
$FUNCTION false_builtin
|
||||||
$SHORT_DOC false
|
$SHORT_DOC false
|
||||||
Return an unsuccessful result.
|
Return an unsuccessful result.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Always fails.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
/* Return a successful result. */
|
/* Return a successful result. */
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,42 @@
|
||||||
This file is command.def, from which is created command.c.
|
This file is command.def, from which is created command.c.
|
||||||
It implements the builtin "command" in Bash.
|
It implements the builtin "command" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2004 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES command.c
|
$PRODUCES command.c
|
||||||
|
|
||||||
$BUILTIN command
|
$BUILTIN command
|
||||||
$FUNCTION command_builtin
|
$FUNCTION command_builtin
|
||||||
$SHORT_DOC command [-pVv] command [arg ...]
|
$SHORT_DOC command [-pVv] command [arg ...]
|
||||||
Runs COMMAND with ARGS ignoring shell functions. If you have a shell
|
Execute a simple command or display information about commands.
|
||||||
function called `ls', and you wish to call the command `ls', you can
|
|
||||||
say "command ls". If the -p option is given, a default value is used
|
Runs COMMAND with ARGS suppressing shell function lookup, or display
|
||||||
for PATH that is guaranteed to find all of the standard utilities. If
|
information about the specified COMMANDs. Can be used to invoke commands
|
||||||
the -V or -v option is given, a string is printed describing COMMAND.
|
on disk when a function with the same name exists.
|
||||||
The -V option produces a more verbose description.
|
|
||||||
|
Options:
|
||||||
|
-p use a default value for PATH that is guaranteed to find all of
|
||||||
|
the standard utilities
|
||||||
|
-v print a description of COMMAND similar to the `type' builtin
|
||||||
|
-V print a more verbose description of each COMMAND
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns exit status of COMMAND, or failure if COMMAND is not found.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,22 @@
|
||||||
/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
|
/* common.c - utility functions for all builtins */
|
||||||
|
|
||||||
|
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
@ -42,6 +44,8 @@
|
||||||
#include "../bashansi.h"
|
#include "../bashansi.h"
|
||||||
#include "../bashintl.h"
|
#include "../bashintl.h"
|
||||||
|
|
||||||
|
#define NEED_FPURGE_DECL
|
||||||
|
|
||||||
#include "../shell.h"
|
#include "../shell.h"
|
||||||
#include "maxpath.h"
|
#include "maxpath.h"
|
||||||
#include "../flags.h"
|
#include "../flags.h"
|
||||||
|
|
@ -69,7 +73,7 @@ extern int last_command_exit_value;
|
||||||
extern int running_trap;
|
extern int running_trap;
|
||||||
extern int posixly_correct;
|
extern int posixly_correct;
|
||||||
extern char *this_command_name, *shell_name;
|
extern char *this_command_name, *shell_name;
|
||||||
extern char *bash_getcwd_errstr;
|
extern const char * const bash_getcwd_errstr;
|
||||||
|
|
||||||
/* Used by some builtins and the mainline code. */
|
/* Used by some builtins and the mainline code. */
|
||||||
sh_builtin_func_t *last_shell_builtin = (sh_builtin_func_t *)NULL;
|
sh_builtin_func_t *last_shell_builtin = (sh_builtin_func_t *)NULL;
|
||||||
|
|
@ -84,6 +88,22 @@ sh_builtin_func_t *this_shell_builtin = (sh_builtin_func_t *)NULL;
|
||||||
/* This is a lot like report_error (), but it is for shell builtins
|
/* This is a lot like report_error (), but it is for shell builtins
|
||||||
instead of shell control structures, and it won't ever exit the
|
instead of shell control structures, and it won't ever exit the
|
||||||
shell. */
|
shell. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
builtin_error_prolog ()
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
name = get_name_for_error ();
|
||||||
|
fprintf (stderr, "%s: ", name);
|
||||||
|
|
||||||
|
if (interactive_shell == 0)
|
||||||
|
fprintf (stderr, _("line %d: "), executing_line_number ());
|
||||||
|
|
||||||
|
if (this_command_name && *this_command_name)
|
||||||
|
fprintf (stderr, "%s: ", this_command_name);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
#if defined (PREFER_STDARG)
|
#if defined (PREFER_STDARG)
|
||||||
builtin_error (const char *format, ...)
|
builtin_error (const char *format, ...)
|
||||||
|
|
@ -94,16 +114,29 @@ builtin_error (format, va_alist)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
char *name;
|
|
||||||
|
|
||||||
name = get_name_for_error ();
|
builtin_error_prolog ();
|
||||||
fprintf (stderr, "%s: ", name);
|
|
||||||
|
|
||||||
if (interactive_shell == 0)
|
SH_VA_START (args, format);
|
||||||
fprintf (stderr, "line %d: ", executing_line_number ());
|
|
||||||
|
|
||||||
if (this_command_name && *this_command_name)
|
vfprintf (stderr, format, args);
|
||||||
fprintf (stderr, "%s: ", this_command_name);
|
va_end (args);
|
||||||
|
fprintf (stderr, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
#if defined (PREFER_STDARG)
|
||||||
|
builtin_warning (const char *format, ...)
|
||||||
|
#else
|
||||||
|
builtin_warning (format, va_alist)
|
||||||
|
const char *format;
|
||||||
|
va_dcl
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
builtin_error_prolog ();
|
||||||
|
fprintf (stderr, _("warning: "));
|
||||||
|
|
||||||
SH_VA_START (args, format);
|
SH_VA_START (args, format);
|
||||||
|
|
||||||
|
|
@ -117,7 +150,7 @@ void
|
||||||
builtin_usage ()
|
builtin_usage ()
|
||||||
{
|
{
|
||||||
if (this_command_name && *this_command_name)
|
if (this_command_name && *this_command_name)
|
||||||
fprintf (stderr, "%s: usage: ", this_command_name);
|
fprintf (stderr, _("%s: usage: "), this_command_name);
|
||||||
fprintf (stderr, "%s\n", current_builtin->short_doc);
|
fprintf (stderr, "%s\n", current_builtin->short_doc);
|
||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
}
|
}
|
||||||
|
|
@ -199,7 +232,15 @@ void
|
||||||
sh_invalidnum (s)
|
sh_invalidnum (s)
|
||||||
char *s;
|
char *s;
|
||||||
{
|
{
|
||||||
builtin_error (_("%s: invalid number"), s);
|
char *msg;
|
||||||
|
|
||||||
|
if (*s == '0' && isdigit (s[1]))
|
||||||
|
msg = _("invalid octal number");
|
||||||
|
else if (*s == '0' && s[1] == 'x')
|
||||||
|
msg = _("invalid hex number");
|
||||||
|
else
|
||||||
|
msg = _("invalid number");
|
||||||
|
builtin_error ("%s: %s", s, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -274,9 +315,27 @@ sh_notbuiltin (s)
|
||||||
void
|
void
|
||||||
sh_wrerror ()
|
sh_wrerror ()
|
||||||
{
|
{
|
||||||
|
#if defined (DONT_REPORT_BROKEN_PIPE_WRITE_ERRORS) && defined (EPIPE)
|
||||||
|
if (errno != EPIPE)
|
||||||
|
#endif /* DONT_REPORT_BROKEN_PIPE_WRITE_ERRORS && EPIPE */
|
||||||
builtin_error (_("write error: %s"), strerror (errno));
|
builtin_error (_("write error: %s"), strerror (errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
sh_chkwrite (s)
|
||||||
|
int s;
|
||||||
|
{
|
||||||
|
fflush (stdout);
|
||||||
|
if (ferror (stdout))
|
||||||
|
{
|
||||||
|
sh_wrerror ();
|
||||||
|
fpurge (stdout);
|
||||||
|
clearerr (stdout);
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
return (s);
|
||||||
|
}
|
||||||
|
|
||||||
/* **************************************************************** */
|
/* **************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* Shell positional parameter manipulation */
|
/* Shell positional parameter manipulation */
|
||||||
|
|
@ -372,30 +431,35 @@ set_dollar_vars_changed ()
|
||||||
/* Read a numeric arg for this_command_name, the name of the shell builtin
|
/* Read a numeric arg for this_command_name, the name of the shell builtin
|
||||||
that wants it. LIST is the word list that the arg is to come from.
|
that wants it. LIST is the word list that the arg is to come from.
|
||||||
Accept only the numeric argument; report an error if other arguments
|
Accept only the numeric argument; report an error if other arguments
|
||||||
follow. If FATAL is true, call throw_to_top_level, which exits the
|
follow. If FATAL is 1, call throw_to_top_level, which exits the
|
||||||
shell; if not, call jump_to_top_level (DISCARD), which aborts the
|
shell; if it's 2, call jump_to_top_level (DISCARD), which aborts the
|
||||||
current command. */
|
current command; if FATAL is 0, return an indication of an invalid
|
||||||
intmax_t
|
number by setting *NUMOK == 0 and return -1. */
|
||||||
get_numeric_arg (list, fatal)
|
int
|
||||||
|
get_numeric_arg (list, fatal, count)
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
int fatal;
|
int fatal;
|
||||||
|
intmax_t *count;
|
||||||
{
|
{
|
||||||
intmax_t count = 1;
|
char *arg;
|
||||||
|
|
||||||
|
if (count)
|
||||||
|
*count = 1;
|
||||||
|
|
||||||
if (list && list->word && ISOPTION (list->word->word, '-'))
|
if (list && list->word && ISOPTION (list->word->word, '-'))
|
||||||
list = list->next;
|
list = list->next;
|
||||||
|
|
||||||
if (list)
|
if (list)
|
||||||
{
|
{
|
||||||
register char *arg;
|
|
||||||
|
|
||||||
arg = list->word->word;
|
arg = list->word->word;
|
||||||
if (arg == 0 || (legal_number (arg, &count) == 0))
|
if (arg == 0 || (legal_number (arg, count) == 0))
|
||||||
{
|
{
|
||||||
sh_neednumarg (list->word->word);
|
sh_neednumarg (list->word->word ? list->word->word : "`'");
|
||||||
if (fatal)
|
if (fatal == 0)
|
||||||
|
return 0;
|
||||||
|
else if (fatal == 1) /* fatal == 1; abort */
|
||||||
throw_to_top_level ();
|
throw_to_top_level ();
|
||||||
else
|
else /* fatal == 2; discard current command */
|
||||||
{
|
{
|
||||||
top_level_cleanup ();
|
top_level_cleanup ();
|
||||||
jump_to_top_level (DISCARD);
|
jump_to_top_level (DISCARD);
|
||||||
|
|
@ -404,7 +468,7 @@ get_numeric_arg (list, fatal)
|
||||||
no_args (list->next);
|
no_args (list->next);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (count);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get an eight-bit status value from LIST */
|
/* Get an eight-bit status value from LIST */
|
||||||
|
|
@ -647,7 +711,7 @@ display_signal_list (list, forcecols)
|
||||||
{
|
{
|
||||||
printf ("%2d) %s", i, name);
|
printf ("%2d) %s", i, name);
|
||||||
|
|
||||||
if (++column < 4)
|
if (++column < 5)
|
||||||
printf ("\t");
|
printf ("\t");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -4,19 +4,19 @@
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (__COMMON_H)
|
#if !defined (__COMMON_H)
|
||||||
# define __COMMON_H
|
# define __COMMON_H
|
||||||
|
|
@ -31,6 +31,8 @@
|
||||||
#define SEVAL_NOHIST 0x004
|
#define SEVAL_NOHIST 0x004
|
||||||
#define SEVAL_NOFREE 0x008
|
#define SEVAL_NOFREE 0x008
|
||||||
#define SEVAL_RESETLINE 0x010
|
#define SEVAL_RESETLINE 0x010
|
||||||
|
#define SEVAL_PARSEONLY 0x020
|
||||||
|
#define SEVAL_NOLONGJMP 0x040
|
||||||
|
|
||||||
/* Flags for describe_command, shared between type.def and command.def */
|
/* Flags for describe_command, shared between type.def and command.def */
|
||||||
#define CDESC_ALL 0x001 /* type -a */
|
#define CDESC_ALL 0x001 /* type -a */
|
||||||
|
|
@ -57,6 +59,7 @@
|
||||||
|
|
||||||
/* Functions from common.c */
|
/* Functions from common.c */
|
||||||
extern void builtin_error __P((const char *, ...)) __attribute__((__format__ (printf, 1, 2)));
|
extern void builtin_error __P((const char *, ...)) __attribute__((__format__ (printf, 1, 2)));
|
||||||
|
extern void builtin_warning __P((const char *, ...)) __attribute__((__format__ (printf, 1, 2)));
|
||||||
extern void builtin_usage __P((void));
|
extern void builtin_usage __P((void));
|
||||||
extern void no_args __P((WORD_LIST *));
|
extern void no_args __P((WORD_LIST *));
|
||||||
extern int no_options __P((WORD_LIST *));
|
extern int no_options __P((WORD_LIST *));
|
||||||
|
|
@ -78,6 +81,7 @@ extern void sh_nojobs __P((char *));
|
||||||
extern void sh_restricted __P((char *));
|
extern void sh_restricted __P((char *));
|
||||||
extern void sh_notbuiltin __P((char *));
|
extern void sh_notbuiltin __P((char *));
|
||||||
extern void sh_wrerror __P((void));
|
extern void sh_wrerror __P((void));
|
||||||
|
extern int sh_chkwrite __P((int));
|
||||||
|
|
||||||
extern char **make_builtin_argv __P((WORD_LIST *, int *));
|
extern char **make_builtin_argv __P((WORD_LIST *, int *));
|
||||||
extern void remember_args __P((WORD_LIST *, int));
|
extern void remember_args __P((WORD_LIST *, int));
|
||||||
|
|
@ -86,7 +90,7 @@ extern int dollar_vars_changed __P((void));
|
||||||
extern void set_dollar_vars_unchanged __P((void));
|
extern void set_dollar_vars_unchanged __P((void));
|
||||||
extern void set_dollar_vars_changed __P((void));
|
extern void set_dollar_vars_changed __P((void));
|
||||||
|
|
||||||
extern intmax_t get_numeric_arg __P((WORD_LIST *, int));
|
extern int get_numeric_arg __P((WORD_LIST *, int, intmax_t *));
|
||||||
extern int get_exitstat __P((WORD_LIST *));
|
extern int get_exitstat __P((WORD_LIST *));
|
||||||
extern int read_octal __P((char *));
|
extern int read_octal __P((char *));
|
||||||
|
|
||||||
|
|
@ -141,6 +145,7 @@ extern int describe_command __P((char *, int));
|
||||||
|
|
||||||
/* Functions from setattr.def */
|
/* Functions from setattr.def */
|
||||||
extern int set_or_show_attributes __P((WORD_LIST *, int, int));
|
extern int set_or_show_attributes __P((WORD_LIST *, int, int));
|
||||||
|
extern int show_all_var_attributes __P((int, int));
|
||||||
extern int show_var_attributes __P((SHELL_VAR *, int, int));
|
extern int show_var_attributes __P((SHELL_VAR *, int, int));
|
||||||
extern int show_name_attributes __P((char *, int));
|
extern int show_name_attributes __P((char *, int));
|
||||||
extern void set_var_attribute __P((char *, int, int));
|
extern void set_var_attribute __P((char *, int, int));
|
||||||
|
|
@ -154,6 +159,7 @@ extern WORD_LIST *get_directory_stack __P((int));
|
||||||
/* Functions from evalstring.c */
|
/* Functions from evalstring.c */
|
||||||
extern int parse_and_execute __P((char *, const char *, int));
|
extern int parse_and_execute __P((char *, const char *, int));
|
||||||
extern void parse_and_execute_cleanup __P((void));
|
extern void parse_and_execute_cleanup __P((void));
|
||||||
|
extern int parse_string __P((char *, const char *, int, char **));
|
||||||
|
|
||||||
/* Functions from evalfile.c */
|
/* Functions from evalfile.c */
|
||||||
extern int maybe_execute_file __P((const char *, int));
|
extern int maybe_execute_file __P((const char *, int));
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,45 @@
|
||||||
This file is complete.def, from which is created complete.c.
|
This file is complete.def, from which is created complete.c.
|
||||||
It implements the builtins "complete" and "compgen" in Bash.
|
It implements the builtins "complete", "compgen", and "compopt" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1999-2003 Free Software Foundation, Inc.
|
Copyright (C) 1999-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES complete.c
|
$PRODUCES complete.c
|
||||||
|
|
||||||
$BUILTIN complete
|
$BUILTIN complete
|
||||||
$DEPENDS_ON PROGRAMMABLE_COMPLETION
|
$DEPENDS_ON PROGRAMMABLE_COMPLETION
|
||||||
$FUNCTION complete_builtin
|
$FUNCTION complete_builtin
|
||||||
$SHORT_DOC complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...]
|
$SHORT_DOC complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
|
||||||
For each NAME, specify how arguments are to be completed.
|
Specify how arguments are to be completed by Readline.
|
||||||
If the -p option is supplied, or if no options are supplied, existing
|
|
||||||
completion specifications are printed in a way that allows them to be
|
For each NAME, specify how arguments are to be completed. If no options
|
||||||
reused as input. The -r option removes a completion specification for
|
are supplied, existing completion specifications are printed in a way that
|
||||||
each NAME, or, if no NAMEs are supplied, all completion specifications.
|
allows them to be reused as input.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-p print existing completion specifications in a reusable format
|
||||||
|
-r remove a completion specification for each NAME, or, if no
|
||||||
|
NAMEs are supplied, all completion specifications
|
||||||
|
|
||||||
|
When completion is attempted, the actions are applied in the order the
|
||||||
|
uppercase-letter options are listed above.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is supplied or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -57,22 +67,31 @@ $END
|
||||||
|
|
||||||
#define STRDUP(x) ((x) ? savestring (x) : (char *)NULL)
|
#define STRDUP(x) ((x) ? savestring (x) : (char *)NULL)
|
||||||
|
|
||||||
|
/* Structure containing all the non-action (binary) options; filled in by
|
||||||
|
build_actions(). */
|
||||||
|
struct _optflags {
|
||||||
|
int pflag;
|
||||||
|
int rflag;
|
||||||
|
int Eflag;
|
||||||
|
};
|
||||||
|
|
||||||
static int find_compact __P((char *));
|
static int find_compact __P((char *));
|
||||||
static int find_compopt __P((char *));
|
static int find_compopt __P((char *));
|
||||||
|
|
||||||
static int build_actions __P((WORD_LIST *, int *, int *, unsigned long *, unsigned long *));
|
static int build_actions __P((WORD_LIST *, struct _optflags *, unsigned long *, unsigned long *));
|
||||||
|
|
||||||
static int remove_cmd_completions __P((WORD_LIST *));
|
static int remove_cmd_completions __P((WORD_LIST *));
|
||||||
|
|
||||||
static int print_one_completion __P((char *, COMPSPEC *));
|
static int print_one_completion __P((char *, COMPSPEC *));
|
||||||
static int print_compitem __P((BUCKET_CONTENTS *));
|
static int print_compitem __P((BUCKET_CONTENTS *));
|
||||||
|
static void print_compopts __P((const char *, COMPSPEC *, int));
|
||||||
static void print_all_completions __P((void));
|
static void print_all_completions __P((void));
|
||||||
static int print_cmd_completions __P((WORD_LIST *));
|
static int print_cmd_completions __P((WORD_LIST *));
|
||||||
|
|
||||||
static char *Garg, *Warg, *Parg, *Sarg, *Xarg, *Farg, *Carg;
|
static char *Garg, *Warg, *Parg, *Sarg, *Xarg, *Farg, *Carg;
|
||||||
|
|
||||||
static struct _compacts {
|
static const struct _compacts {
|
||||||
char *actname;
|
const char * const actname;
|
||||||
int actflag;
|
int actflag;
|
||||||
int actopt;
|
int actopt;
|
||||||
} compacts[] = {
|
} compacts[] = {
|
||||||
|
|
@ -104,8 +123,8 @@ static struct _compacts {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This should be a STRING_INT_ALIST */
|
/* This should be a STRING_INT_ALIST */
|
||||||
static struct _compopt {
|
const static struct _compopt {
|
||||||
char *optname;
|
const char * const optname;
|
||||||
int optflag;
|
int optflag;
|
||||||
} compopts[] = {
|
} compopts[] = {
|
||||||
{ "bashdefault", COPT_BASHDEFAULT },
|
{ "bashdefault", COPT_BASHDEFAULT },
|
||||||
|
|
@ -156,9 +175,9 @@ find_compopt (name)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
build_actions (list, pp, rp, actp, optp)
|
build_actions (list, flagp, actp, optp)
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
int *pp, *rp;
|
struct _optflags *flagp;
|
||||||
unsigned long *actp, *optp;
|
unsigned long *actp, *optp;
|
||||||
{
|
{
|
||||||
int opt, ind, opt_given;
|
int opt, ind, opt_given;
|
||||||
|
|
@ -168,15 +187,15 @@ build_actions (list, pp, rp, actp, optp)
|
||||||
opt_given = 0;
|
opt_given = 0;
|
||||||
|
|
||||||
reset_internal_getopt ();
|
reset_internal_getopt ();
|
||||||
while ((opt = internal_getopt (list, "abcdefgjko:prsuvA:G:W:P:S:X:F:C:")) != -1)
|
while ((opt = internal_getopt (list, "abcdefgjko:prsuvA:G:W:P:S:X:F:C:E")) != -1)
|
||||||
{
|
{
|
||||||
opt_given = 1;
|
opt_given = 1;
|
||||||
switch (opt)
|
switch (opt)
|
||||||
{
|
{
|
||||||
case 'r':
|
case 'r':
|
||||||
if (rp)
|
if (flagp)
|
||||||
{
|
{
|
||||||
*rp = 1;
|
flagp->rflag = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -187,9 +206,9 @@ build_actions (list, pp, rp, actp, optp)
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'p':
|
case 'p':
|
||||||
if (pp)
|
if (flagp)
|
||||||
{
|
{
|
||||||
*pp = 1;
|
flagp->pflag = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -256,6 +275,18 @@ build_actions (list, pp, rp, actp, optp)
|
||||||
case 'C':
|
case 'C':
|
||||||
Carg = list_optarg;
|
Carg = list_optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'E':
|
||||||
|
if (flagp)
|
||||||
|
{
|
||||||
|
flagp->Eflag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sh_invalidopt ("-E");
|
||||||
|
builtin_usage ();
|
||||||
|
return (EX_USAGE);
|
||||||
|
}
|
||||||
case 'F':
|
case 'F':
|
||||||
Farg = list_optarg;
|
Farg = list_optarg;
|
||||||
break;
|
break;
|
||||||
|
|
@ -291,9 +322,11 @@ int
|
||||||
complete_builtin (list)
|
complete_builtin (list)
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
{
|
{
|
||||||
int opt_given, pflag, rflag, rval;
|
int opt_given, rval;
|
||||||
unsigned long acts, copts;
|
unsigned long acts, copts;
|
||||||
COMPSPEC *cs;
|
COMPSPEC *cs;
|
||||||
|
struct _optflags oflags;
|
||||||
|
WORD_LIST *l, *wl;
|
||||||
|
|
||||||
if (list == 0)
|
if (list == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -301,24 +334,33 @@ complete_builtin (list)
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
opt_given = pflag = rflag = 0;
|
opt_given = oflags.pflag = oflags.rflag = oflags.Eflag = 0;
|
||||||
|
|
||||||
acts = copts = (unsigned long)0L;
|
acts = copts = (unsigned long)0L;
|
||||||
Garg = Warg = Parg = Sarg = Xarg = Farg = Carg = (char *)NULL;
|
Garg = Warg = Parg = Sarg = Xarg = Farg = Carg = (char *)NULL;
|
||||||
cs = (COMPSPEC *)NULL;
|
cs = (COMPSPEC *)NULL;
|
||||||
|
|
||||||
/* Build the actions from the arguments. Also sets the [A-Z]arg variables
|
/* Build the actions from the arguments. Also sets the [A-Z]arg variables
|
||||||
as a side effect if they are supplied as options. */
|
as a side effect if they are supplied as options. */
|
||||||
rval = build_actions (list, &pflag, &rflag, &acts, &copts);
|
rval = build_actions (list, &oflags, &acts, &copts);
|
||||||
if (rval == EX_USAGE)
|
if (rval == EX_USAGE)
|
||||||
return (rval);
|
return (rval);
|
||||||
opt_given = rval != EXECUTION_FAILURE;
|
opt_given = rval != EXECUTION_FAILURE;
|
||||||
|
|
||||||
list = loptend;
|
list = loptend;
|
||||||
|
|
||||||
|
wl = oflags.Eflag ? make_word_list (make_bare_word ("_EmptycmD_"), (WORD_LIST *)NULL) : 0;
|
||||||
|
|
||||||
/* -p overrides everything else */
|
/* -p overrides everything else */
|
||||||
if (pflag || (list == 0 && opt_given == 0))
|
if (oflags.pflag || (list == 0 && opt_given == 0))
|
||||||
{
|
{
|
||||||
if (list == 0)
|
if (wl)
|
||||||
|
{
|
||||||
|
rval = print_cmd_completions (wl);
|
||||||
|
dispose_words (wl);
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
else if (list == 0)
|
||||||
{
|
{
|
||||||
print_all_completions ();
|
print_all_completions ();
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
@ -327,9 +369,15 @@ complete_builtin (list)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* next, -r overrides everything else. */
|
/* next, -r overrides everything else. */
|
||||||
if (rflag)
|
if (oflags.rflag)
|
||||||
{
|
{
|
||||||
if (list == 0)
|
if (wl)
|
||||||
|
{
|
||||||
|
rval = remove_cmd_completions (wl);
|
||||||
|
dispose_words (wl);
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
else if (list == 0)
|
||||||
{
|
{
|
||||||
progcomp_flush ();
|
progcomp_flush ();
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
@ -337,7 +385,7 @@ complete_builtin (list)
|
||||||
return (remove_cmd_completions (list));
|
return (remove_cmd_completions (list));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list == 0 && opt_given)
|
if (wl == 0 && list == 0 && opt_given)
|
||||||
{
|
{
|
||||||
builtin_usage ();
|
builtin_usage ();
|
||||||
return (EX_USAGE);
|
return (EX_USAGE);
|
||||||
|
|
@ -357,13 +405,14 @@ complete_builtin (list)
|
||||||
cs->command = STRDUP (Carg);
|
cs->command = STRDUP (Carg);
|
||||||
cs->filterpat = STRDUP (Xarg);
|
cs->filterpat = STRDUP (Xarg);
|
||||||
|
|
||||||
for (rval = EXECUTION_SUCCESS ; list; list = list->next)
|
for (rval = EXECUTION_SUCCESS, l = wl ? wl : list ; l; l = l->next)
|
||||||
{
|
{
|
||||||
/* Add CS as the compspec for the specified commands. */
|
/* Add CS as the compspec for the specified commands. */
|
||||||
if (progcomp_insert (list->word->word, cs) == 0)
|
if (progcomp_insert (l->word->word, cs) == 0)
|
||||||
rval = EXECUTION_FAILURE;
|
rval = EXECUTION_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dispose_words (wl);
|
||||||
return (rval);
|
return (rval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -419,6 +468,14 @@ remove_cmd_completions (list)
|
||||||
printf ("-o %s ", f); \
|
printf ("-o %s ", f); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define XPRINTCOMPOPT(a, f) \
|
||||||
|
do { \
|
||||||
|
if (copts & a) \
|
||||||
|
printf ("-o %s ", f); \
|
||||||
|
else \
|
||||||
|
printf ("+o %s ", f); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
print_one_completion (cmd, cs)
|
print_one_completion (cmd, cs)
|
||||||
char *cmd;
|
char *cmd;
|
||||||
|
|
@ -478,15 +535,49 @@ print_one_completion (cmd, cs)
|
||||||
SQPRINTARG (cs->suffix, "-S");
|
SQPRINTARG (cs->suffix, "-S");
|
||||||
SQPRINTARG (cs->filterpat, "-X");
|
SQPRINTARG (cs->filterpat, "-X");
|
||||||
|
|
||||||
|
SQPRINTARG (cs->command, "-C");
|
||||||
|
|
||||||
/* simple arguments that don't require quoting */
|
/* simple arguments that don't require quoting */
|
||||||
PRINTARG (cs->funcname, "-F");
|
PRINTARG (cs->funcname, "-F");
|
||||||
PRINTARG (cs->command, "-C");
|
|
||||||
|
|
||||||
printf ("%s\n", cmd);
|
printf ("%s\n", cmd);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_compopts (cmd, cs, full)
|
||||||
|
const char *cmd;
|
||||||
|
COMPSPEC *cs;
|
||||||
|
int full;
|
||||||
|
{
|
||||||
|
int copts;
|
||||||
|
|
||||||
|
printf ("compopt ");
|
||||||
|
copts = cs->options;
|
||||||
|
|
||||||
|
if (full)
|
||||||
|
{
|
||||||
|
XPRINTCOMPOPT (COPT_BASHDEFAULT, "bashdefault");
|
||||||
|
XPRINTCOMPOPT (COPT_DEFAULT, "default");
|
||||||
|
XPRINTCOMPOPT (COPT_DIRNAMES, "dirnames");
|
||||||
|
XPRINTCOMPOPT (COPT_FILENAMES, "filenames");
|
||||||
|
XPRINTCOMPOPT (COPT_NOSPACE, "nospace");
|
||||||
|
XPRINTCOMPOPT (COPT_PLUSDIRS, "plusdirs");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PRINTCOMPOPT (COPT_BASHDEFAULT, "bashdefault");
|
||||||
|
PRINTCOMPOPT (COPT_DEFAULT, "default");
|
||||||
|
PRINTCOMPOPT (COPT_DIRNAMES, "dirnames");
|
||||||
|
PRINTCOMPOPT (COPT_FILENAMES, "filenames");
|
||||||
|
PRINTCOMPOPT (COPT_NOSPACE, "nospace");
|
||||||
|
PRINTCOMPOPT (COPT_PLUSDIRS, "plusdirs");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf ("%s\n", cmd);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
print_compitem (item)
|
print_compitem (item)
|
||||||
BUCKET_CONTENTS *item;
|
BUCKET_CONTENTS *item;
|
||||||
|
|
@ -525,17 +616,22 @@ print_cmd_completions (list)
|
||||||
ret = EXECUTION_FAILURE;
|
ret = EXECUTION_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (ret);
|
|
||||||
|
return (sh_chkwrite (ret));
|
||||||
}
|
}
|
||||||
|
|
||||||
$BUILTIN compgen
|
$BUILTIN compgen
|
||||||
$DEPENDS_ON PROGRAMMABLE_COMPLETION
|
$DEPENDS_ON PROGRAMMABLE_COMPLETION
|
||||||
$FUNCTION compgen_builtin
|
$FUNCTION compgen_builtin
|
||||||
$SHORT_DOC compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [word]
|
$SHORT_DOC compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
|
||||||
Display the possible completions depending on the options. Intended
|
Display possible completions depending on the options.
|
||||||
to be used from within a shell function generating possible completions.
|
|
||||||
If the optional WORD argument is supplied, matches against WORD are
|
Intended to be used from within a shell function generating possible
|
||||||
generated.
|
completions. If the optional WORD argument is supplied, matches against
|
||||||
|
WORD are generated.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is supplied or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
@ -557,7 +653,7 @@ compgen_builtin (list)
|
||||||
|
|
||||||
/* Build the actions from the arguments. Also sets the [A-Z]arg variables
|
/* Build the actions from the arguments. Also sets the [A-Z]arg variables
|
||||||
as a side effect if they are supplied as options. */
|
as a side effect if they are supplied as options. */
|
||||||
rval = build_actions (list, (int *)NULL, (int *)NULL, &acts, &copts);
|
rval = build_actions (list, (struct _optflags *)NULL, &acts, &copts);
|
||||||
if (rval == EX_USAGE)
|
if (rval == EX_USAGE)
|
||||||
return (rval);
|
return (rval);
|
||||||
if (rval == EXECUTION_FAILURE)
|
if (rval == EXECUTION_FAILURE)
|
||||||
|
|
@ -620,3 +716,114 @@ compgen_builtin (list)
|
||||||
compspec_dispose (cs);
|
compspec_dispose (cs);
|
||||||
return (rval);
|
return (rval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$BUILTIN compopt
|
||||||
|
$DEPENDS_ON PROGRAMMABLE_COMPLETION
|
||||||
|
$FUNCTION compopt_builtin
|
||||||
|
$SHORT_DOC compopt [-o|+o option] [name ...]
|
||||||
|
Modify or display completion options.
|
||||||
|
|
||||||
|
Modify the completion options for each NAME, or, if no NAMEs are supplied,
|
||||||
|
the completion currently begin executed. If no OPTIONs are givenm, print
|
||||||
|
the completion options for each NAME or the current completion specification.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-o option Set completion option OPTION for each NAME
|
||||||
|
|
||||||
|
Using `+o' instead of `-o' turns off the specified option.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
Each NAME refers to a command for which a completion specification must
|
||||||
|
have previously been defined using the `complete' builtin. If no NAMEs
|
||||||
|
are supplied, compopt must be called by a function currently generating
|
||||||
|
completions, and the options for that currently-executing completion
|
||||||
|
generator are modified.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is supplied or NAME does not
|
||||||
|
have a completion specification defined.
|
||||||
|
$END
|
||||||
|
|
||||||
|
int
|
||||||
|
compopt_builtin (list)
|
||||||
|
WORD_LIST *list;
|
||||||
|
{
|
||||||
|
int opts_on, opts_off, *opts, opt, oind, ret, Eflag;
|
||||||
|
WORD_LIST *l;
|
||||||
|
COMPSPEC *cs;
|
||||||
|
|
||||||
|
opts_on = opts_off = 0;
|
||||||
|
ret = EXECUTION_SUCCESS;
|
||||||
|
|
||||||
|
reset_internal_getopt ();
|
||||||
|
while ((opt = internal_getopt (list, "+o:")) != EOF)
|
||||||
|
{
|
||||||
|
opts = (list_opttype == '-') ? &opts_on : &opts_off;
|
||||||
|
|
||||||
|
switch (opt)
|
||||||
|
{
|
||||||
|
case 'o':
|
||||||
|
oind = find_compopt (list_optarg);
|
||||||
|
if (oind < 0)
|
||||||
|
{
|
||||||
|
sh_invalidoptname (list_optarg);
|
||||||
|
return (EX_USAGE);
|
||||||
|
}
|
||||||
|
*opts |= compopts[oind].optflag;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
builtin_usage ();
|
||||||
|
return (EX_USAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
list = loptend;
|
||||||
|
|
||||||
|
if (list == 0)
|
||||||
|
{
|
||||||
|
if (RL_ISSTATE (RL_STATE_COMPLETING) == 0 || pcomp_curcs == 0)
|
||||||
|
{
|
||||||
|
builtin_error (_("not currently executing completion function"));
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
cs = pcomp_curcs;
|
||||||
|
|
||||||
|
if (opts_on == 0 && opts_off == 0)
|
||||||
|
{
|
||||||
|
print_compopts (pcomp_curcmd, cs, 1);
|
||||||
|
return (sh_chkwrite (ret));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the compspec options */
|
||||||
|
pcomp_set_compspec_options (cs, opts_on, 1);
|
||||||
|
pcomp_set_compspec_options (cs, opts_off, 0);
|
||||||
|
|
||||||
|
/* And change the readline variables the options control */
|
||||||
|
pcomp_set_readline_variables (opts_on, 1);
|
||||||
|
pcomp_set_readline_variables (opts_off, 0);
|
||||||
|
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (l = list; l; l = l->next)
|
||||||
|
{
|
||||||
|
cs = progcomp_search (l->word->word);
|
||||||
|
if (cs == 0)
|
||||||
|
{
|
||||||
|
builtin_error (_("%s: no completion specification"), l->word->word);
|
||||||
|
ret = EXECUTION_FAILURE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (opts_on == 0 && opts_off == 0)
|
||||||
|
{
|
||||||
|
print_compopts (l->word->word, cs, 1);
|
||||||
|
continue; /* XXX -- fill in later */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the compspec options */
|
||||||
|
pcomp_set_compspec_options (cs, opts_on, 1);
|
||||||
|
pcomp_set_compspec_options (cs, opts_off, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,59 +1,67 @@
|
||||||
This file is declare.def, from which is created declare.c.
|
This file is declare.def, from which is created declare.c.
|
||||||
It implements the builtins "declare" and "local" in Bash.
|
It implements the builtins "declare" and "local" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2004 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES declare.c
|
$PRODUCES declare.c
|
||||||
|
|
||||||
$BUILTIN declare
|
$BUILTIN declare
|
||||||
$FUNCTION declare_builtin
|
$FUNCTION declare_builtin
|
||||||
$SHORT_DOC declare [-afFirtx] [-p] [name[=value] ...]
|
$SHORT_DOC declare [-aAfFilrtux] [-p] [name[=value] ...]
|
||||||
Declare variables and/or give them attributes. If no NAMEs are
|
Set variable values and attributes.
|
||||||
given, then display the values of variables instead. The -p option
|
|
||||||
will display the attributes and values of each NAME.
|
|
||||||
|
|
||||||
The flags are:
|
Declare variables and give them attributes. If no NAMEs are given,
|
||||||
|
display the attributes and values of all variables.
|
||||||
|
|
||||||
-a to make NAMEs arrays (if supported)
|
Options:
|
||||||
-f to select from among function names only
|
-f restrict action or display to function names and definitions
|
||||||
-F to display function names (and line number and source file name if
|
-F restrict display to function names only (plus line number and
|
||||||
debugging) without definitions
|
source file when debugging)
|
||||||
|
-p display the attributes and value of each NAME
|
||||||
|
|
||||||
|
Options which set attributes:
|
||||||
|
-a to make NAMEs indexed arrays (if supported)
|
||||||
|
-A to make NAMEs associative arrays (if supported)
|
||||||
-i to make NAMEs have the `integer' attribute
|
-i to make NAMEs have the `integer' attribute
|
||||||
|
-l to convert NAMEs to lower case on assignment
|
||||||
-r to make NAMEs readonly
|
-r to make NAMEs readonly
|
||||||
-t to make NAMEs have the `trace' attribute
|
-t to make NAMEs have the `trace' attribute
|
||||||
|
-u to convert NAMEs to upper case on assignment
|
||||||
-x to make NAMEs export
|
-x to make NAMEs export
|
||||||
|
|
||||||
|
Using `+' instead of `-' turns off the given attribute.
|
||||||
|
|
||||||
Variables with the integer attribute have arithmetic evaluation (see
|
Variables with the integer attribute have arithmetic evaluation (see
|
||||||
`let') done when the variable is assigned to.
|
the `let' command) performed when the variable is assigned a value.
|
||||||
|
|
||||||
When displaying values of variables, -f displays a function's name
|
When used in a function, `declare' makes NAMEs local, as with the `local'
|
||||||
and definition. The -F option restricts the display to function
|
command.
|
||||||
name only.
|
|
||||||
|
|
||||||
Using `+' instead of `-' turns off the given attribute instead. When
|
Exit Status:
|
||||||
used in a function, makes NAMEs local, as with the `local' command.
|
Returns success unless an invalid option is supplied or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN typeset
|
$BUILTIN typeset
|
||||||
$FUNCTION declare_builtin
|
$FUNCTION declare_builtin
|
||||||
$SHORT_DOC typeset [-afFirtx] [-p] name[=value] ...
|
$SHORT_DOC typeset [-aAfFilrtux] [-p] name[=value] ...
|
||||||
Obsolete. See `declare'.
|
Set variable values and attributes.
|
||||||
|
|
||||||
|
Obsolete. See `help declare'.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -90,10 +98,18 @@ declare_builtin (list)
|
||||||
|
|
||||||
$BUILTIN local
|
$BUILTIN local
|
||||||
$FUNCTION local_builtin
|
$FUNCTION local_builtin
|
||||||
$SHORT_DOC local name[=value] ...
|
$SHORT_DOC local [option] name[=value] ...
|
||||||
Create a local variable called NAME, and give it VALUE. LOCAL
|
Define local variables.
|
||||||
can only be used within a function; it makes the variable NAME
|
|
||||||
have a visible scope restricted to that function and its children.
|
Create a local variable called NAME, and give it VALUE. OPTION can
|
||||||
|
be any option accepted by `declare'.
|
||||||
|
|
||||||
|
Local variables can only be used within a function; they are visible
|
||||||
|
only to the function where they are defined and its children.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is supplied, an error occurs,
|
||||||
|
or the shell is not executing a function.
|
||||||
$END
|
$END
|
||||||
int
|
int
|
||||||
local_builtin (list)
|
local_builtin (list)
|
||||||
|
|
@ -109,9 +125,9 @@ local_builtin (list)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
# define DECLARE_OPTS "+afiprtxF"
|
# define DECLARE_OPTS "+acfilprtuxAF"
|
||||||
#else
|
#else
|
||||||
# define DECLARE_OPTS "+fiprtxF"
|
# define DECLARE_OPTS "+cfilprtuxF"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The workhorse function. */
|
/* The workhorse function. */
|
||||||
|
|
@ -120,7 +136,8 @@ declare_internal (list, local_var)
|
||||||
register WORD_LIST *list;
|
register WORD_LIST *list;
|
||||||
int local_var;
|
int local_var;
|
||||||
{
|
{
|
||||||
int flags_on, flags_off, *flags, any_failed, assign_error, pflag, nodefs, opt;
|
int flags_on, flags_off, *flags;
|
||||||
|
int any_failed, assign_error, pflag, nodefs, opt;
|
||||||
char *t, *subscript_start;
|
char *t, *subscript_start;
|
||||||
SHELL_VAR *var;
|
SHELL_VAR *var;
|
||||||
FUNCTION_DEF *shell_fn;
|
FUNCTION_DEF *shell_fn;
|
||||||
|
|
@ -136,8 +153,19 @@ declare_internal (list, local_var)
|
||||||
case 'a':
|
case 'a':
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
*flags |= att_array;
|
*flags |= att_array;
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
|
#else
|
||||||
|
builtin_usage ();
|
||||||
|
return (EX_USAGE);
|
||||||
|
#endif
|
||||||
|
case 'A':
|
||||||
|
#if defined (ARRAY_VARS)
|
||||||
|
*flags |= att_assoc;
|
||||||
|
break;
|
||||||
|
#else
|
||||||
|
builtin_usage ();
|
||||||
|
return (EX_USAGE);
|
||||||
|
#endif
|
||||||
case 'p':
|
case 'p':
|
||||||
if (local_var == 0)
|
if (local_var == 0)
|
||||||
pflag++;
|
pflag++;
|
||||||
|
|
@ -162,6 +190,25 @@ declare_internal (list, local_var)
|
||||||
*flags |= att_exported;
|
*flags |= att_exported;
|
||||||
array_needs_making = 1;
|
array_needs_making = 1;
|
||||||
break;
|
break;
|
||||||
|
#if defined (CASEMOD_ATTRS)
|
||||||
|
# if defined (CASEMOD_CAPCASE)
|
||||||
|
case 'c':
|
||||||
|
*flags |= att_capcase;
|
||||||
|
if (flags == &flags_on)
|
||||||
|
flags_off |= att_uppercase|att_lowercase;
|
||||||
|
break;
|
||||||
|
# endif
|
||||||
|
case 'l':
|
||||||
|
*flags |= att_lowercase;
|
||||||
|
if (flags == &flags_on)
|
||||||
|
flags_off |= att_capcase|att_uppercase;
|
||||||
|
break;
|
||||||
|
case 'u':
|
||||||
|
*flags |= att_uppercase;
|
||||||
|
if (flags == &flags_on)
|
||||||
|
flags_off |= att_capcase|att_lowercase;
|
||||||
|
break;
|
||||||
|
#endif /* CASEMOD_ATTRS */
|
||||||
default:
|
default:
|
||||||
builtin_usage ();
|
builtin_usage ();
|
||||||
return (EX_USAGE);
|
return (EX_USAGE);
|
||||||
|
|
@ -172,7 +219,7 @@ declare_internal (list, local_var)
|
||||||
|
|
||||||
/* If there are no more arguments left, then we just want to show
|
/* If there are no more arguments left, then we just want to show
|
||||||
some variables. */
|
some variables. */
|
||||||
if (list == 0) /* declare -[afFirtx] */
|
if (list == 0) /* declare -[aAfFirtx] */
|
||||||
{
|
{
|
||||||
/* Show local variables defined at this context level if this is
|
/* Show local variables defined at this context level if this is
|
||||||
the `local' builtin. */
|
the `local' builtin. */
|
||||||
|
|
@ -191,19 +238,17 @@ declare_internal (list, local_var)
|
||||||
free (vlist);
|
free (vlist);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (pflag && (flags_on == 0 || flags_on == att_function))
|
||||||
{
|
show_all_var_attributes (flags_on == 0, nodefs);
|
||||||
if (flags_on == 0)
|
else if (flags_on == 0)
|
||||||
set_builtin ((WORD_LIST *)NULL);
|
return (set_builtin ((WORD_LIST *)NULL));
|
||||||
else
|
else
|
||||||
set_or_show_attributes ((WORD_LIST *)NULL, flags_on, nodefs);
|
set_or_show_attributes ((WORD_LIST *)NULL, flags_on, nodefs);
|
||||||
|
|
||||||
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
fflush (stdout);
|
if (pflag) /* declare -p [-aAfFirtx] name [name...] */
|
||||||
return (EXECUTION_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pflag) /* declare -p [-afFirtx] name [name...] */
|
|
||||||
{
|
{
|
||||||
for (any_failed = 0; list; list = list->next)
|
for (any_failed = 0; list; list = list->next)
|
||||||
{
|
{
|
||||||
|
|
@ -214,13 +259,13 @@ declare_internal (list, local_var)
|
||||||
any_failed++;
|
any_failed++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
|
return (sh_chkwrite (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NEXT_VARIABLE() free (name); list = list->next; continue
|
#define NEXT_VARIABLE() free (name); list = list->next; continue
|
||||||
|
|
||||||
/* There are arguments left, so we are making variables. */
|
/* There are arguments left, so we are making variables. */
|
||||||
while (list) /* declare [-afFirx] name [name ...] */
|
while (list) /* declare [-aAfFirx] name [name ...] */
|
||||||
{
|
{
|
||||||
char *value, *name;
|
char *value, *name;
|
||||||
int offset, aflags;
|
int offset, aflags;
|
||||||
|
|
@ -232,7 +277,7 @@ declare_internal (list, local_var)
|
||||||
offset = assignment (name, 0);
|
offset = assignment (name, 0);
|
||||||
aflags = 0;
|
aflags = 0;
|
||||||
|
|
||||||
if (offset) /* declare [-afFirx] name=value */
|
if (offset) /* declare [-aAfFirx] name=value */
|
||||||
{
|
{
|
||||||
name[offset] = '\0';
|
name[offset] = '\0';
|
||||||
value = name + offset + 1;
|
value = name + offset + 1;
|
||||||
|
|
@ -279,7 +324,9 @@ declare_internal (list, local_var)
|
||||||
if (variable_context && ((flags_on & att_function) == 0))
|
if (variable_context && ((flags_on & att_function) == 0))
|
||||||
{
|
{
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
if ((flags_on & att_array) || making_array_special)
|
if (flags_on & att_assoc)
|
||||||
|
var = make_local_assoc_variable (name);
|
||||||
|
else if ((flags_on & att_array) || making_array_special)
|
||||||
var = make_local_array_variable (name);
|
var = make_local_array_variable (name);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -336,8 +383,9 @@ declare_internal (list, local_var)
|
||||||
#endif /* DEBUGGER */
|
#endif /* DEBUGGER */
|
||||||
{
|
{
|
||||||
t = nodefs ? var->name
|
t = nodefs ? var->name
|
||||||
: named_function_string (name, function_cell (var), 1);
|
: named_function_string (name, function_cell (var), FUNC_MULTILINE|FUNC_EXTERNAL);
|
||||||
printf ("%s\n", t);
|
printf ("%s\n", t);
|
||||||
|
any_failed = sh_chkwrite (any_failed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* declare -[fF] -[rx] name [name...] */
|
else /* declare -[fF] -[rx] name [name...] */
|
||||||
|
|
@ -351,7 +399,7 @@ declare_internal (list, local_var)
|
||||||
NEXT_VARIABLE ();
|
NEXT_VARIABLE ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* declare -[airx] name [name...] */
|
else /* declare -[aAirx] name [name...] */
|
||||||
{
|
{
|
||||||
/* Non-null if we just created or fetched a local variable. */
|
/* Non-null if we just created or fetched a local variable. */
|
||||||
if (var == 0)
|
if (var == 0)
|
||||||
|
|
@ -360,11 +408,20 @@ declare_internal (list, local_var)
|
||||||
if (var == 0)
|
if (var == 0)
|
||||||
{
|
{
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
if ((flags_on & att_array) || making_array_special)
|
if (flags_on & att_assoc)
|
||||||
|
var = make_new_assoc_variable (name);
|
||||||
|
else if ((flags_on & att_array) || making_array_special)
|
||||||
var = make_new_array_variable (name);
|
var = make_new_array_variable (name);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (offset)
|
||||||
var = bind_variable (name, "", 0);
|
var = bind_variable (name, "", 0);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var = bind_variable (name, (char *)NULL, 0);
|
||||||
|
VSETATTR (var, att_invisible);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cannot use declare +r to turn off readonly attribute. */
|
/* Cannot use declare +r to turn off readonly attribute. */
|
||||||
|
|
@ -386,30 +443,48 @@ declare_internal (list, local_var)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
if ((making_array_special || (flags_on & att_array) || array_p (var)) && offset)
|
if ((making_array_special || (flags_on & (att_array|att_assoc)) || array_p (var) || assoc_p (var)) && offset)
|
||||||
{
|
{
|
||||||
int vlen;
|
int vlen;
|
||||||
vlen = STRLEN (value);
|
vlen = STRLEN (value);
|
||||||
#if 0
|
|
||||||
if (value[0] == '(' && strchr (value, ')'))
|
|
||||||
#else
|
|
||||||
if (value[0] == '(' && value[vlen-1] == ')')
|
if (value[0] == '(' && value[vlen-1] == ')')
|
||||||
#endif
|
|
||||||
compound_array_assign = 1;
|
compound_array_assign = 1;
|
||||||
else
|
else
|
||||||
simple_array_assign = 1;
|
simple_array_assign = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cannot use declare +a name to remove an array variable. */
|
/* Cannot use declare +a name or declare +A name to remove an
|
||||||
if ((flags_off & att_array) && array_p (var))
|
array variable. */
|
||||||
|
if (((flags_off & att_array) && array_p (var)) || ((flags_off & att_assoc) && assoc_p (var)))
|
||||||
{
|
{
|
||||||
builtin_error (_("%s: cannot destroy array variables in this way"), name);
|
builtin_error (_("%s: cannot destroy array variables in this way"), name);
|
||||||
any_failed++;
|
any_failed++;
|
||||||
NEXT_VARIABLE ();
|
NEXT_VARIABLE ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* declare -a name makes name an array variable. */
|
if ((flags_on & att_array) && assoc_p (var))
|
||||||
if ((making_array_special || (flags_on & att_array)) && array_p (var) == 0)
|
{
|
||||||
|
builtin_error (_("%s: cannot convert associative to indexed array"), name);
|
||||||
|
any_failed++;
|
||||||
|
NEXT_VARIABLE ();
|
||||||
|
}
|
||||||
|
if ((flags_on & att_assoc) && array_p (var))
|
||||||
|
{
|
||||||
|
builtin_error (_("%s: cannot convert indexed to associative array"), name);
|
||||||
|
any_failed++;
|
||||||
|
NEXT_VARIABLE ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* declare -A name[[n]] makes name an associative array variable. */
|
||||||
|
if (flags_on & att_assoc)
|
||||||
|
{
|
||||||
|
if (assoc_p (var) == 0)
|
||||||
|
var = convert_var_to_assoc (var);
|
||||||
|
}
|
||||||
|
/* declare -a name[[n]] or declare name[n] makes name an indexed
|
||||||
|
array variable. */
|
||||||
|
else if ((making_array_special || (flags_on & att_array)) && array_p (var) == 0)
|
||||||
var = convert_var_to_array (var);
|
var = convert_var_to_array (var);
|
||||||
#endif /* ARRAY_VARS */
|
#endif /* ARRAY_VARS */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
This file is echo.def, from which is created echo.c.
|
This file is echo.def, from which is created echo.c.
|
||||||
It implements the builtin "echo" in Bash.
|
It implements the builtin "echo" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2002 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES echo.c
|
$PRODUCES echo.c
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -37,13 +36,20 @@ $BUILTIN echo
|
||||||
$FUNCTION echo_builtin
|
$FUNCTION echo_builtin
|
||||||
$DEPENDS_ON V9_ECHO
|
$DEPENDS_ON V9_ECHO
|
||||||
$SHORT_DOC echo [-neE] [arg ...]
|
$SHORT_DOC echo [-neE] [arg ...]
|
||||||
Output the ARGs. If -n is specified, the trailing newline is
|
Write arguments to the standard output.
|
||||||
suppressed. If the -e option is given, interpretation of the
|
|
||||||
following backslash-escaped characters is turned on:
|
Display the ARGs on the standard output followed by a newline.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-n do not append a newline
|
||||||
|
-e enable interpretation of the following backslash escapes
|
||||||
|
-E explicitly suppress interpretation of backslash escapes
|
||||||
|
|
||||||
|
`echo' interprets the following backslash-escaped characters:
|
||||||
\a alert (bell)
|
\a alert (bell)
|
||||||
\b backspace
|
\b backspace
|
||||||
\c suppress trailing newline
|
\c suppress further output
|
||||||
\E escape character
|
\e escape character
|
||||||
\f form feed
|
\f form feed
|
||||||
\n new line
|
\n new line
|
||||||
\r carriage return
|
\r carriage return
|
||||||
|
|
@ -52,16 +58,26 @@ following backslash-escaped characters is turned on:
|
||||||
\\ backslash
|
\\ backslash
|
||||||
\0nnn the character whose ASCII code is NNN (octal). NNN can be
|
\0nnn the character whose ASCII code is NNN (octal). NNN can be
|
||||||
0 to 3 octal digits
|
0 to 3 octal digits
|
||||||
|
\xHH the eight-bit character whose value is HH (hexadecimal). HH
|
||||||
|
can be one or two hex digits
|
||||||
|
|
||||||
You can explicitly turn off the interpretation of the above characters
|
Exit Status:
|
||||||
with the -E option.
|
Returns success unless a write error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN echo
|
$BUILTIN echo
|
||||||
$FUNCTION echo_builtin
|
$FUNCTION echo_builtin
|
||||||
$DEPENDS_ON !V9_ECHO
|
$DEPENDS_ON !V9_ECHO
|
||||||
$SHORT_DOC echo [-n] [arg ...]
|
$SHORT_DOC echo [-n] [arg ...]
|
||||||
Output the ARGs. If -n is specified, the trailing newline is suppressed.
|
Write arguments to the standard output.
|
||||||
|
|
||||||
|
Display the ARGs on the standard output followed by a newline.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-n do not append a newline
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless a write error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#if defined (V9_ECHO)
|
#if defined (V9_ECHO)
|
||||||
|
|
@ -143,6 +159,7 @@ just_echo:
|
||||||
|
|
||||||
clearerr (stdout); /* clear error before writing and testing success */
|
clearerr (stdout); /* clear error before writing and testing success */
|
||||||
|
|
||||||
|
terminate_immediately++;
|
||||||
while (list)
|
while (list)
|
||||||
{
|
{
|
||||||
i = len = 0;
|
i = len = 0;
|
||||||
|
|
@ -175,12 +192,7 @@ just_echo:
|
||||||
|
|
||||||
if (display_return)
|
if (display_return)
|
||||||
putchar ('\n');
|
putchar ('\n');
|
||||||
fflush (stdout);
|
|
||||||
if (ferror (stdout))
|
terminate_immediately--;
|
||||||
{
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
sh_wrerror ();
|
|
||||||
clearerr (stdout);
|
|
||||||
return (EXECUTION_FAILURE);
|
|
||||||
}
|
|
||||||
return (EXECUTION_SUCCESS);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,51 @@
|
||||||
This file is enable.def, from which is created enable.c.
|
This file is enable.def, from which is created enable.c.
|
||||||
It implements the builtin "enable" in Bash.
|
It implements the builtin "enable" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES enable.c
|
$PRODUCES enable.c
|
||||||
|
|
||||||
$BUILTIN enable
|
$BUILTIN enable
|
||||||
$FUNCTION enable_builtin
|
$FUNCTION enable_builtin
|
||||||
$SHORT_DOC enable [-pnds] [-a] [-f filename] [name ...]
|
$SHORT_DOC enable [-a] [-dnps] [-f filename] [name ...]
|
||||||
Enable and disable builtin shell commands. This allows
|
Enable and disable shell builtins.
|
||||||
you to use a disk command which has the same name as a shell
|
|
||||||
builtin without specifying a full pathname. If -n is used, the
|
Enables and disables builtin shell commands. Disabling allows you to
|
||||||
NAMEs become disabled; otherwise NAMEs are enabled. For example,
|
execute a disk command which has the same name as a shell builtin
|
||||||
to use the `test' found in $PATH instead of the shell builtin
|
without using a full pathname.
|
||||||
version, type `enable -n test'. On systems supporting dynamic
|
|
||||||
loading, the -f option may be used to load new builtins from the
|
Options:
|
||||||
shared object FILENAME. The -d option will delete a builtin
|
-a print a list of builtins showing whether or not each is enabled
|
||||||
previously loaded with -f. If no non-option names are given, or
|
-n disable each NAME or display a list of disabled builtins
|
||||||
the -p option is supplied, a list of builtins is printed. The
|
-p print the list of builtins in a reusable format
|
||||||
-a option means to print every builtin with an indication of whether
|
-s print only the names of Posix `special' builtins
|
||||||
or not it is enabled. The -s option restricts the output to the POSIX.2
|
|
||||||
`special' builtins. The -n option displays a list of all disabled builtins.
|
Options controlling dynamic loading:
|
||||||
|
-f Load builtin NAME from shared object FILENAME
|
||||||
|
-d Remove a builtin loaded with -f
|
||||||
|
|
||||||
|
Without options, each NAME is enabled.
|
||||||
|
|
||||||
|
To use the `test' found in $PATH instead of the shell builtin
|
||||||
|
version, type `enable -n test'.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless NAME is not a shell builtin or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
|
||||||
|
|
@ -1,30 +1,35 @@
|
||||||
This file is eval.def, from which is created eval.c.
|
This file is eval.def, from which is created eval.c.
|
||||||
It implements the builtin "eval" in Bash.
|
It implements the builtin "eval" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2002 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES eval.c
|
$PRODUCES eval.c
|
||||||
|
|
||||||
$BUILTIN eval
|
$BUILTIN eval
|
||||||
$FUNCTION eval_builtin
|
$FUNCTION eval_builtin
|
||||||
$SHORT_DOC eval [arg ...]
|
$SHORT_DOC eval [arg ...]
|
||||||
Read ARGs as input to the shell and execute the resulting command(s).
|
Execute arguments as a shell command.
|
||||||
|
|
||||||
|
Combine ARGs into a single string, use the result as input to the shell,
|
||||||
|
and execute the resulting commands.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns exit status of command or success if command is null.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,22 @@
|
||||||
/* Copyright (C) 1996-2003 Free Software Foundation, Inc.
|
/* evalfile.c - read and evaluate commands from a file or file descriptor */
|
||||||
|
|
||||||
|
/* Copyright (C) 1996-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
@ -45,6 +47,8 @@
|
||||||
# include "../bashhist.h"
|
# include "../bashhist.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <typemax.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#if !defined (errno)
|
#if !defined (errno)
|
||||||
|
|
@ -78,6 +82,7 @@ _evalfile (filename, flags)
|
||||||
volatile int old_interactive;
|
volatile int old_interactive;
|
||||||
procenv_t old_return_catch;
|
procenv_t old_return_catch;
|
||||||
int return_val, fd, result, pflags;
|
int return_val, fd, result, pflags;
|
||||||
|
ssize_t nr; /* return value from read(2) */
|
||||||
char *string;
|
char *string;
|
||||||
struct stat finfo;
|
struct stat finfo;
|
||||||
size_t file_size;
|
size_t file_size;
|
||||||
|
|
@ -147,31 +152,37 @@ file_error_and_exit:
|
||||||
setmode (fd, O_TEXT);
|
setmode (fd, O_TEXT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (S_ISREG (finfo.st_mode) && file_size <= SSIZE_MAX)
|
||||||
|
{
|
||||||
string = (char *)xmalloc (1 + file_size);
|
string = (char *)xmalloc (1 + file_size);
|
||||||
result = read (fd, string, file_size);
|
nr = read (fd, string, file_size);
|
||||||
string[result] = '\0';
|
if (nr >= 0)
|
||||||
|
string[nr] = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nr = zmapfd (fd, &string, 0);
|
||||||
|
|
||||||
return_val = errno;
|
return_val = errno;
|
||||||
close (fd);
|
close (fd);
|
||||||
errno = return_val;
|
errno = return_val;
|
||||||
|
|
||||||
if (result < 0) /* XXX was != file_size, not < 0 */
|
if (nr < 0) /* XXX was != file_size, not < 0 */
|
||||||
{
|
{
|
||||||
free (string);
|
free (string);
|
||||||
goto file_error_and_exit;
|
goto file_error_and_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == 0)
|
if (nr == 0)
|
||||||
{
|
{
|
||||||
free (string);
|
free (string);
|
||||||
return ((flags & FEVAL_BUILTIN) ? EXECUTION_SUCCESS : 1);
|
return ((flags & FEVAL_BUILTIN) ? EXECUTION_SUCCESS : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & FEVAL_CHECKBINARY) &&
|
if ((flags & FEVAL_CHECKBINARY) &&
|
||||||
check_binary_file (string, (result > 80) ? 80 : result))
|
check_binary_file (string, (nr > 80) ? 80 : nr))
|
||||||
{
|
{
|
||||||
free (string);
|
free (string);
|
||||||
(*errfunc) ("%s: cannot execute binary file", filename);
|
(*errfunc) (_("%s: cannot execute binary file"), filename);
|
||||||
return ((flags & FEVAL_BUILTIN) ? EX_BINARY_FILE : -1);
|
return ((flags & FEVAL_BUILTIN) ? EX_BINARY_FILE : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,22 @@
|
||||||
/* Evaluate a string as one or more shell commands.
|
/* evalstring.c - evaluate a string as one or more shell commands.
|
||||||
|
|
||||||
Copyright (C) 1996-2005 Free Software Foundation, Inc.
|
/* Copyright (C) 1996-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
@ -44,6 +44,8 @@
|
||||||
#include "../redir.h"
|
#include "../redir.h"
|
||||||
#include "../trap.h"
|
#include "../trap.h"
|
||||||
|
|
||||||
|
#include <y.tab.h>
|
||||||
|
|
||||||
#if defined (HISTORY)
|
#if defined (HISTORY)
|
||||||
# include "../bashhist.h"
|
# include "../bashhist.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -58,15 +60,21 @@ extern int errno;
|
||||||
|
|
||||||
extern int indirection_level, subshell_environment;
|
extern int indirection_level, subshell_environment;
|
||||||
extern int line_number;
|
extern int line_number;
|
||||||
|
extern int current_token, shell_eof_token;
|
||||||
extern int last_command_exit_value;
|
extern int last_command_exit_value;
|
||||||
extern int running_trap;
|
extern int running_trap;
|
||||||
extern int loop_level;
|
extern int loop_level;
|
||||||
|
extern int executing_list;
|
||||||
|
extern int comsub_ignore_return;
|
||||||
extern int posixly_correct;
|
extern int posixly_correct;
|
||||||
|
|
||||||
int parse_and_execute_level = 0;
|
int parse_and_execute_level = 0;
|
||||||
|
|
||||||
static int cat_file __P((REDIRECT *));
|
static int cat_file __P((REDIRECT *));
|
||||||
|
|
||||||
|
#define PE_TAG "parse_and_execute top"
|
||||||
|
#define PS_TAG "parse_string top"
|
||||||
|
|
||||||
#if defined (HISTORY)
|
#if defined (HISTORY)
|
||||||
static void
|
static void
|
||||||
set_history_remembering ()
|
set_history_remembering ()
|
||||||
|
|
@ -84,7 +92,64 @@ parse_and_execute_cleanup ()
|
||||||
run_trap_cleanup (running_trap - 1);
|
run_trap_cleanup (running_trap - 1);
|
||||||
unfreeze_jobs_list ();
|
unfreeze_jobs_list ();
|
||||||
}
|
}
|
||||||
run_unwind_frame ("parse_and_execute_top");
|
|
||||||
|
if (have_unwind_protects ())
|
||||||
|
run_unwind_frame (PE_TAG);
|
||||||
|
else
|
||||||
|
parse_and_execute_level = 0; /* XXX */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
parse_prologue (string, flags, tag)
|
||||||
|
char *string;
|
||||||
|
int flags;
|
||||||
|
char *tag;
|
||||||
|
{
|
||||||
|
char *orig_string;
|
||||||
|
int x;
|
||||||
|
|
||||||
|
orig_string = string;
|
||||||
|
/* Unwind protect this invocation of parse_and_execute (). */
|
||||||
|
begin_unwind_frame (tag);
|
||||||
|
unwind_protect_int (parse_and_execute_level);
|
||||||
|
unwind_protect_jmp_buf (top_level);
|
||||||
|
unwind_protect_int (indirection_level);
|
||||||
|
unwind_protect_int (line_number);
|
||||||
|
unwind_protect_int (loop_level);
|
||||||
|
unwind_protect_int (executing_list);
|
||||||
|
unwind_protect_int (comsub_ignore_return);
|
||||||
|
if (flags & (SEVAL_NONINT|SEVAL_INTERACT))
|
||||||
|
unwind_protect_int (interactive);
|
||||||
|
|
||||||
|
#if defined (HISTORY)
|
||||||
|
if (parse_and_execute_level == 0)
|
||||||
|
add_unwind_protect (set_history_remembering, (char *)NULL);
|
||||||
|
else
|
||||||
|
unwind_protect_int (remember_on_history); /* can be used in scripts */
|
||||||
|
# if defined (BANG_HISTORY)
|
||||||
|
if (interactive_shell)
|
||||||
|
unwind_protect_int (history_expansion_inhibited);
|
||||||
|
# endif /* BANG_HISTORY */
|
||||||
|
#endif /* HISTORY */
|
||||||
|
|
||||||
|
if (interactive_shell)
|
||||||
|
{
|
||||||
|
x = get_current_prompt_level ();
|
||||||
|
add_unwind_protect (set_current_prompt_level, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
add_unwind_protect (pop_stream, (char *)NULL);
|
||||||
|
if (orig_string && ((flags & SEVAL_NOFREE) == 0))
|
||||||
|
add_unwind_protect (xfree, orig_string);
|
||||||
|
end_unwind_frame ();
|
||||||
|
|
||||||
|
if (flags & (SEVAL_NONINT|SEVAL_INTERACT))
|
||||||
|
interactive = (flags & SEVAL_NONINT) ? 0 : 1;
|
||||||
|
|
||||||
|
#if defined (HISTORY)
|
||||||
|
if (flags & SEVAL_NOHIST)
|
||||||
|
bash_history_disable ();
|
||||||
|
#endif /* HISTORY */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse and execute the commands in STRING. Returns whatever
|
/* Parse and execute the commands in STRING. Returns whatever
|
||||||
|
|
@ -104,50 +169,16 @@ parse_and_execute (string, from_file, flags)
|
||||||
const char *from_file;
|
const char *from_file;
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
int code, x, lreset;
|
int code, lreset;
|
||||||
volatile int should_jump_to_top_level, last_result;
|
volatile int should_jump_to_top_level, last_result;
|
||||||
char *orig_string;
|
|
||||||
COMMAND *volatile command;
|
COMMAND *volatile command;
|
||||||
|
|
||||||
orig_string = string;
|
parse_prologue (string, flags, PE_TAG);
|
||||||
/* Unwind protect this invocation of parse_and_execute (). */
|
|
||||||
begin_unwind_frame ("parse_and_execute_top");
|
|
||||||
unwind_protect_int (parse_and_execute_level);
|
|
||||||
unwind_protect_jmp_buf (top_level);
|
|
||||||
unwind_protect_int (indirection_level);
|
|
||||||
unwind_protect_int (line_number);
|
|
||||||
unwind_protect_int (loop_level);
|
|
||||||
if (flags & (SEVAL_NONINT|SEVAL_INTERACT))
|
|
||||||
unwind_protect_int (interactive);
|
|
||||||
|
|
||||||
lreset = flags & SEVAL_RESETLINE;
|
|
||||||
|
|
||||||
#if defined (HISTORY)
|
|
||||||
if (parse_and_execute_level == 0)
|
|
||||||
add_unwind_protect (set_history_remembering, (char *)NULL);
|
|
||||||
else
|
|
||||||
unwind_protect_int (remember_on_history); /* can be used in scripts */
|
|
||||||
# if defined (BANG_HISTORY)
|
|
||||||
if (interactive_shell)
|
|
||||||
{
|
|
||||||
unwind_protect_int (history_expansion_inhibited);
|
|
||||||
}
|
|
||||||
# endif /* BANG_HISTORY */
|
|
||||||
#endif /* HISTORY */
|
|
||||||
|
|
||||||
if (interactive_shell)
|
|
||||||
{
|
|
||||||
x = get_current_prompt_level ();
|
|
||||||
add_unwind_protect (set_current_prompt_level, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
add_unwind_protect (pop_stream, (char *)NULL);
|
|
||||||
if (orig_string && ((flags & SEVAL_NOFREE) == 0))
|
|
||||||
add_unwind_protect (xfree, orig_string);
|
|
||||||
end_unwind_frame ();
|
|
||||||
|
|
||||||
parse_and_execute_level++;
|
parse_and_execute_level++;
|
||||||
|
|
||||||
|
lreset = flags & SEVAL_RESETLINE;
|
||||||
|
|
||||||
/* Reset the line number if the caller wants us to. If we don't reset the
|
/* Reset the line number if the caller wants us to. If we don't reset the
|
||||||
line number, we have to subtract one, because we will add one just
|
line number, we have to subtract one, because we will add one just
|
||||||
before executing the next command (resetting the line number sets it to
|
before executing the next command (resetting the line number sets it to
|
||||||
|
|
@ -157,13 +188,6 @@ parse_and_execute (string, from_file, flags)
|
||||||
line_number--;
|
line_number--;
|
||||||
|
|
||||||
indirection_level++;
|
indirection_level++;
|
||||||
if (flags & (SEVAL_NONINT|SEVAL_INTERACT))
|
|
||||||
interactive = (flags & SEVAL_NONINT) ? 0 : 1;
|
|
||||||
|
|
||||||
#if defined (HISTORY)
|
|
||||||
if (flags & SEVAL_NOHIST)
|
|
||||||
bash_history_disable ();
|
|
||||||
#endif /* HISTORY */
|
|
||||||
|
|
||||||
code = should_jump_to_top_level = 0;
|
code = should_jump_to_top_level = 0;
|
||||||
last_result = EXECUTION_SUCCESS;
|
last_result = EXECUTION_SUCCESS;
|
||||||
|
|
@ -224,7 +248,7 @@ parse_and_execute (string, from_file, flags)
|
||||||
|
|
||||||
if (parse_command () == 0)
|
if (parse_command () == 0)
|
||||||
{
|
{
|
||||||
if (interactive_shell == 0 && read_but_dont_execute)
|
if ((flags & SEVAL_PARSEONLY) || (interactive_shell == 0 && read_but_dont_execute))
|
||||||
{
|
{
|
||||||
last_result = EXECUTION_SUCCESS;
|
last_result = EXECUTION_SUCCESS;
|
||||||
dispose_command (global_command);
|
dispose_command (global_command);
|
||||||
|
|
@ -241,6 +265,12 @@ parse_and_execute (string, from_file, flags)
|
||||||
|
|
||||||
global_command = (COMMAND *)NULL;
|
global_command = (COMMAND *)NULL;
|
||||||
|
|
||||||
|
if ((subshell_environment & SUBSHELL_COMSUB) && comsub_ignore_return)
|
||||||
|
{
|
||||||
|
command->flags |= CMD_IGNORE_RETURN;
|
||||||
|
itrace("parse_and_execute: turned on CMD_IGNORE_RETURN from comsub_ignore_return");
|
||||||
|
}
|
||||||
|
|
||||||
#if defined (ONESHOT)
|
#if defined (ONESHOT)
|
||||||
/*
|
/*
|
||||||
* IF
|
* IF
|
||||||
|
|
@ -305,7 +335,7 @@ parse_and_execute (string, from_file, flags)
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
run_unwind_frame ("parse_and_execute_top");
|
run_unwind_frame (PE_TAG);
|
||||||
|
|
||||||
if (interrupt_state && parse_and_execute_level == 0)
|
if (interrupt_state && parse_and_execute_level == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -322,6 +352,110 @@ parse_and_execute (string, from_file, flags)
|
||||||
return (last_result);
|
return (last_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Parse a command contained in STRING according to FLAGS and return the
|
||||||
|
number of characters consumed from the string. If non-NULL, set *ENDP
|
||||||
|
to the position in the string where the parse ended. Used to validate
|
||||||
|
command substitutions during parsing to obey Posix rules about finding
|
||||||
|
the end of the command and balancing parens. */
|
||||||
|
int
|
||||||
|
parse_string (string, from_file, flags, endp)
|
||||||
|
char *string;
|
||||||
|
const char *from_file;
|
||||||
|
int flags;
|
||||||
|
char **endp;
|
||||||
|
{
|
||||||
|
int code, nc;
|
||||||
|
volatile int should_jump_to_top_level;
|
||||||
|
COMMAND *volatile command, *oglobal;
|
||||||
|
char *ostring;
|
||||||
|
|
||||||
|
parse_prologue (string, flags, PS_TAG);
|
||||||
|
|
||||||
|
/* Reset the line number if the caller wants us to. If we don't reset the
|
||||||
|
line number, we have to subtract one, because we will add one just
|
||||||
|
before executing the next command (resetting the line number sets it to
|
||||||
|
0; the first line number is 1). */
|
||||||
|
push_stream (0);
|
||||||
|
|
||||||
|
code = should_jump_to_top_level = 0;
|
||||||
|
oglobal = global_command;
|
||||||
|
ostring = string;
|
||||||
|
|
||||||
|
with_input_from_string (string, from_file);
|
||||||
|
while (*(bash_input.location.string))
|
||||||
|
{
|
||||||
|
command = (COMMAND *)NULL;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (interrupt_state)
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Provide a location for functions which `longjmp (top_level)' to
|
||||||
|
jump to. */
|
||||||
|
code = setjmp (top_level);
|
||||||
|
|
||||||
|
if (code)
|
||||||
|
{
|
||||||
|
#if defined (DEBUG)
|
||||||
|
itrace("parse_string: longjmp executed: code = %d", code);
|
||||||
|
#endif
|
||||||
|
should_jump_to_top_level = 0;
|
||||||
|
switch (code)
|
||||||
|
{
|
||||||
|
case FORCE_EOF:
|
||||||
|
case ERREXIT:
|
||||||
|
case EXITPROG:
|
||||||
|
case DISCARD: /* XXX */
|
||||||
|
if (command)
|
||||||
|
dispose_command (command);
|
||||||
|
/* Remember to call longjmp (top_level) after the old
|
||||||
|
value for it is restored. */
|
||||||
|
should_jump_to_top_level = 1;
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
default:
|
||||||
|
command_error ("parse_string", CMDERR_BADJUMP, code, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parse_command () == 0)
|
||||||
|
{
|
||||||
|
dispose_command (global_command);
|
||||||
|
global_command = (COMMAND *)NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((flags & SEVAL_NOLONGJMP) == 0)
|
||||||
|
{
|
||||||
|
should_jump_to_top_level = 1;
|
||||||
|
code = DISCARD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
reset_parser (); /* XXX - sets token_to_read */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_token == yacc_EOF || current_token == shell_eof_token)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
|
||||||
|
global_command = oglobal;
|
||||||
|
nc = bash_input.location.string - ostring;
|
||||||
|
if (endp)
|
||||||
|
*endp = bash_input.location.string;
|
||||||
|
|
||||||
|
run_unwind_frame (PS_TAG);
|
||||||
|
|
||||||
|
if (should_jump_to_top_level)
|
||||||
|
jump_to_top_level (code);
|
||||||
|
|
||||||
|
return (nc);
|
||||||
|
}
|
||||||
|
|
||||||
/* Handle a $( < file ) command substitution. This expands the filename,
|
/* Handle a $( < file ) command substitution. This expands the filename,
|
||||||
returning errors as appropriate, then just cats the file to the standard
|
returning errors as appropriate, then just cats the file to the standard
|
||||||
output. */
|
output. */
|
||||||
|
|
|
||||||
|
|
@ -1,37 +1,44 @@
|
||||||
This file is exec.def, from which is created exec.c.
|
This file is exec.def, from which is created exec.c.
|
||||||
It implements the builtin "exec" in Bash.
|
It implements the builtin "exec" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES exec.c
|
$PRODUCES exec.c
|
||||||
|
|
||||||
$BUILTIN exec
|
$BUILTIN exec
|
||||||
$FUNCTION exec_builtin
|
$FUNCTION exec_builtin
|
||||||
$SHORT_DOC exec [-cl] [-a name] file [redirection ...]
|
$SHORT_DOC exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
|
||||||
Exec FILE, replacing this shell with the specified program.
|
Replace the shell with the given command.
|
||||||
If FILE is not specified, the redirections take effect in this
|
|
||||||
shell. If the first argument is `-l', then place a dash in the
|
Execute COMMAND, replacing this shell with the specified program.
|
||||||
zeroth arg passed to FILE, as login does. If the `-c' option
|
ARGUMENTS become the arguments to COMMAND. If COMMAND is not specified,
|
||||||
is supplied, FILE is executed with a null environment. The `-a'
|
any redirections take effect in the current shell.
|
||||||
option means to make set argv[0] of the executed process to NAME.
|
|
||||||
If the file cannot be executed and the shell is not interactive,
|
Options:
|
||||||
then the shell exits, unless the shell option `execfail' is set.
|
-a name pass NAME as the zeroth argument to COMMAND
|
||||||
|
-c execute COMMAND with an empty environment
|
||||||
|
-l place a dash in the zeroth argument to COMMAND
|
||||||
|
|
||||||
|
If the command cannot be executed, a non-interactive shell exits, unless
|
||||||
|
the shell option `execfail' is set.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless COMMAND is not found or a redirection error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
|
||||||
|
|
@ -1,30 +1,31 @@
|
||||||
This file is exit.def, from which is created exit.c.
|
This file is exit.def, from which is created exit.c.
|
||||||
It implements the builtins "exit", and "logout" in Bash.
|
It implements the builtins "exit", and "logout" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES exit.c
|
$PRODUCES exit.c
|
||||||
|
|
||||||
$BUILTIN exit
|
$BUILTIN exit
|
||||||
$FUNCTION exit_builtin
|
$FUNCTION exit_builtin
|
||||||
$SHORT_DOC exit [n]
|
$SHORT_DOC exit [n]
|
||||||
Exit the shell with a status of N. If N is omitted, the exit status
|
Exit the shell.
|
||||||
|
|
||||||
|
Exits the shell with a status of N. If N is omitted, the exit status
|
||||||
is that of the last command executed.
|
is that of the last command executed.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
|
|
@ -45,6 +46,7 @@ $END
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "builtext.h" /* for jobs_builtin */
|
#include "builtext.h" /* for jobs_builtin */
|
||||||
|
|
||||||
|
extern int check_jobs_at_exit;
|
||||||
extern int last_command_exit_value;
|
extern int last_command_exit_value;
|
||||||
extern int running_trap, trap_saved_exit_value;
|
extern int running_trap, trap_saved_exit_value;
|
||||||
extern int subshell_environment;
|
extern int subshell_environment;
|
||||||
|
|
@ -60,7 +62,7 @@ exit_builtin (list)
|
||||||
{
|
{
|
||||||
if (interactive)
|
if (interactive)
|
||||||
{
|
{
|
||||||
fprintf (stderr, login_shell ? "logout\n" : "exit\n");
|
fprintf (stderr, login_shell ? _("logout\n") : "exit\n");
|
||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -69,8 +71,11 @@ exit_builtin (list)
|
||||||
|
|
||||||
$BUILTIN logout
|
$BUILTIN logout
|
||||||
$FUNCTION logout_builtin
|
$FUNCTION logout_builtin
|
||||||
$SHORT_DOC logout
|
$SHORT_DOC logout [n]
|
||||||
Logout of a login shell.
|
Exit a login shell.
|
||||||
|
|
||||||
|
Exits a login shell with exit status N. Returns an error if not executed
|
||||||
|
in a login shell.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
/* How to logout. */
|
/* How to logout. */
|
||||||
|
|
@ -94,7 +99,7 @@ exit_or_logout (list)
|
||||||
int exit_value;
|
int exit_value;
|
||||||
|
|
||||||
#if defined (JOB_CONTROL)
|
#if defined (JOB_CONTROL)
|
||||||
int exit_immediate_okay;
|
int exit_immediate_okay, stopmsg;
|
||||||
|
|
||||||
exit_immediate_okay = (interactive == 0 ||
|
exit_immediate_okay = (interactive == 0 ||
|
||||||
last_shell_builtin == exit_builtin ||
|
last_shell_builtin == exit_builtin ||
|
||||||
|
|
@ -102,14 +107,25 @@ exit_or_logout (list)
|
||||||
last_shell_builtin == jobs_builtin);
|
last_shell_builtin == jobs_builtin);
|
||||||
|
|
||||||
/* Check for stopped jobs if the user wants to. */
|
/* Check for stopped jobs if the user wants to. */
|
||||||
if (!exit_immediate_okay)
|
if (exit_immediate_okay == 0)
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
for (i = 0; i < js.j_jobslots; i++)
|
for (i = stopmsg = 0; i < js.j_jobslots; i++)
|
||||||
if (jobs[i] && STOPPED (i))
|
if (jobs[i] && STOPPED (i))
|
||||||
{
|
stopmsg = JSTOPPED;
|
||||||
fprintf (stderr, _("There are stopped jobs.\n"));
|
else if (check_jobs_at_exit && stopmsg == 0 && RUNNING (i))
|
||||||
|
stopmsg = JRUNNING;
|
||||||
|
|
||||||
|
if (stopmsg == JSTOPPED)
|
||||||
|
fprintf (stderr, _("There are stopped jobs.\n"));
|
||||||
|
else if (stopmsg == JRUNNING)
|
||||||
|
fprintf (stderr, _("There are running jobs.\n"));
|
||||||
|
|
||||||
|
if (stopmsg && check_jobs_at_exit)
|
||||||
|
list_all_jobs (JLIST_STANDARD);
|
||||||
|
|
||||||
|
if (stopmsg)
|
||||||
|
{
|
||||||
/* This is NOT superfluous because EOF can get here without
|
/* This is NOT superfluous because EOF can get here without
|
||||||
going through the command parser. Set both last and this
|
going through the command parser. Set both last and this
|
||||||
so that either `exit', `logout', or ^D will work to exit
|
so that either `exit', `logout', or ^D will work to exit
|
||||||
|
|
|
||||||
|
|
@ -1,48 +1,52 @@
|
||||||
This file is fc.def, from which is created fc.c.
|
This file is fc.def, from which is created fc.c.
|
||||||
It implements the builtin "fc" in Bash.
|
It implements the builtin "fc" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES fc.c
|
$PRODUCES fc.c
|
||||||
|
|
||||||
$BUILTIN fc
|
$BUILTIN fc
|
||||||
$FUNCTION fc_builtin
|
$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] [-lnr] [first] [last] or fc -s [pat=rep] [command]
|
||||||
|
Display or execute commands from the history list.
|
||||||
|
|
||||||
fc is used to list or edit and re-execute commands from the history list.
|
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,
|
Options:
|
||||||
then vi.
|
-e ENAME select which editor to use. Default is FCEDIT, then EDITOR,
|
||||||
|
then vi
|
||||||
|
-l list lines instead of editing
|
||||||
|
-n omit line numbers when listing
|
||||||
|
-r reverse the order of the lines (newest listed first)
|
||||||
|
|
||||||
-l means list lines instead of editing.
|
With the `fc -s [pat=rep ...] [command]' format, COMMAND is
|
||||||
-n means no line numbers listed.
|
|
||||||
-r means reverse the order of the lines (making it newest listed first).
|
|
||||||
|
|
||||||
With the `fc -s [pat=rep ...] [command]' format, the command is
|
|
||||||
re-executed after the substitution OLD=NEW is performed.
|
re-executed after the substitution OLD=NEW is performed.
|
||||||
|
|
||||||
A useful alias to use with this is r='fc -s', so that typing `r cc'
|
A useful alias to use with this is r='fc -s', so that typing `r cc'
|
||||||
runs the last command beginning with `cc' and typing `r' re-executes
|
runs the last command beginning with `cc' and typing `r' re-executes
|
||||||
the last command.
|
the last command.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success or status of executed command; non-zero if an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -88,7 +92,6 @@ extern int posixly_correct;
|
||||||
extern int unlink __P((const char *));
|
extern int unlink __P((const char *));
|
||||||
|
|
||||||
extern FILE *sh_mktmpfp __P((char *, int, char **));
|
extern FILE *sh_mktmpfp __P((char *, int, char **));
|
||||||
extern int delete_last_history __P((void));
|
|
||||||
|
|
||||||
/* **************************************************************** */
|
/* **************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
|
|
@ -290,12 +293,7 @@ fc_builtin (list)
|
||||||
line was actually added (HISTIGNORE may have caused it to not be),
|
line was actually added (HISTIGNORE may have caused it to not be),
|
||||||
so we check hist_last_line_added. */
|
so we check hist_last_line_added. */
|
||||||
|
|
||||||
/* "When not listing, he fc command that caused the editing shall not be
|
last_hist = i - remember_on_history - hist_last_line_added;
|
||||||
entered into the history list." */
|
|
||||||
if (listing == 0 && hist_last_line_added)
|
|
||||||
delete_last_history ();
|
|
||||||
|
|
||||||
last_hist = i - 1 - hist_last_line_added;
|
|
||||||
|
|
||||||
if (list)
|
if (list)
|
||||||
{
|
{
|
||||||
|
|
@ -322,6 +320,21 @@ fc_builtin (list)
|
||||||
histbeg = histend = last_hist;
|
histbeg = histend = last_hist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* "When not listing, the fc command that caused the editing shall not be
|
||||||
|
entered into the history list." */
|
||||||
|
if (listing == 0 && hist_last_line_added)
|
||||||
|
{
|
||||||
|
bash_delete_last_history ();
|
||||||
|
/* If we're editing a single command -- the last command in the
|
||||||
|
history -- and we just removed the dummy command added by
|
||||||
|
edit_and_execute_command (), we need to check whether or not we
|
||||||
|
just removed the last command in the history and need to back
|
||||||
|
the pointer up. remember_on_history is off because we're running
|
||||||
|
in parse_and_execute(). */
|
||||||
|
if (histbeg == histend && histend == last_hist && hlist[last_hist] == 0)
|
||||||
|
last_hist = histbeg = --histend;
|
||||||
|
}
|
||||||
|
|
||||||
/* We print error messages for line specifications out of range. */
|
/* We print error messages for line specifications out of range. */
|
||||||
if ((histbeg < 0) || (histend < 0))
|
if ((histbeg < 0) || (histend < 0))
|
||||||
{
|
{
|
||||||
|
|
@ -368,8 +381,15 @@ fc_builtin (list)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (listing)
|
if (listing)
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
|
|
||||||
|
fflush (stream);
|
||||||
|
if (ferror (stream))
|
||||||
|
{
|
||||||
|
sh_wrerror ();
|
||||||
|
fclose (stream);
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
fclose (stream);
|
fclose (stream);
|
||||||
|
|
||||||
/* Now edit the file of commands. */
|
/* Now edit the file of commands. */
|
||||||
|
|
@ -436,10 +456,11 @@ fc_gethnum (command, hlist)
|
||||||
char *command;
|
char *command;
|
||||||
HIST_ENTRY **hlist;
|
HIST_ENTRY **hlist;
|
||||||
{
|
{
|
||||||
int sign = 1, n, clen;
|
int sign, n, clen;
|
||||||
register int i, j;
|
register int i, j;
|
||||||
register char *s;
|
register char *s;
|
||||||
|
|
||||||
|
sign = 1;
|
||||||
/* Count history elements. */
|
/* Count history elements. */
|
||||||
for (i = 0; hlist[i]; i++);
|
for (i = 0; hlist[i]; i++);
|
||||||
|
|
||||||
|
|
@ -449,8 +470,9 @@ fc_gethnum (command, hlist)
|
||||||
and makes the last command that this deals with be the last command
|
and makes the last command that this deals with be the last command
|
||||||
the user entered before the fc. We need to check whether the
|
the user entered before the fc. We need to check whether the
|
||||||
line was actually added (HISTIGNORE may have caused it to not be),
|
line was actually added (HISTIGNORE may have caused it to not be),
|
||||||
so we check hist_last_line_added. */
|
so we check hist_last_line_added. This needs to agree with the
|
||||||
i -= 1 + hist_last_line_added;
|
calculation of last_hist in fc_builtin above. */
|
||||||
|
i -= remember_on_history + hist_last_line_added;
|
||||||
|
|
||||||
/* No specification defaults to most recent command. */
|
/* No specification defaults to most recent command. */
|
||||||
if (command == NULL)
|
if (command == NULL)
|
||||||
|
|
@ -601,7 +623,7 @@ fc_replhist (command)
|
||||||
|
|
||||||
if (command && *command)
|
if (command && *command)
|
||||||
{
|
{
|
||||||
delete_last_history ();
|
bash_delete_last_history ();
|
||||||
maybe_add_history (command); /* Obeys HISTCONTROL setting. */
|
maybe_add_history (command); /* Obeys HISTCONTROL setting. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
This file is fg_bg.def, from which is created fg_bg.c.
|
This file is fg_bg.def, from which is created fg_bg.c.
|
||||||
It implements the builtins "bg" and "fg" in Bash.
|
It implements the builtins "bg" and "fg" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES fg_bg.c
|
$PRODUCES fg_bg.c
|
||||||
|
|
||||||
|
|
@ -25,9 +24,14 @@ $BUILTIN fg
|
||||||
$FUNCTION fg_builtin
|
$FUNCTION fg_builtin
|
||||||
$DEPENDS_ON JOB_CONTROL
|
$DEPENDS_ON JOB_CONTROL
|
||||||
$SHORT_DOC fg [job_spec]
|
$SHORT_DOC fg [job_spec]
|
||||||
Place JOB_SPEC in the foreground, and make it the current job. If
|
Move job to the foreground.
|
||||||
JOB_SPEC is not present, the shell's notion of the current job is
|
|
||||||
used.
|
Place the job identified by JOB_SPEC in the foreground, making it the
|
||||||
|
current job. If JOB_SPEC is not present, the shell's notion of the
|
||||||
|
current job is used.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Status of command placed in foreground, or failure if an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -83,9 +87,14 @@ $BUILTIN bg
|
||||||
$FUNCTION bg_builtin
|
$FUNCTION bg_builtin
|
||||||
$DEPENDS_ON JOB_CONTROL
|
$DEPENDS_ON JOB_CONTROL
|
||||||
$SHORT_DOC bg [job_spec ...]
|
$SHORT_DOC bg [job_spec ...]
|
||||||
Place each JOB_SPEC in the background, as if it had been started with
|
Move jobs to the background.
|
||||||
`&'. If JOB_SPEC is not present, the shell's notion of the current
|
|
||||||
job is used.
|
Place the jobs identified by each JOB_SPEC in the background, as if they
|
||||||
|
had been started with `&'. If JOB_SPEC is not present, the shell's notion
|
||||||
|
of the current job is used.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless job control is not enabled or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#if defined (JOB_CONTROL)
|
#if defined (JOB_CONTROL)
|
||||||
|
|
@ -137,7 +146,7 @@ fg_bg (list, foreground)
|
||||||
if (INVALID_JOB (job))
|
if (INVALID_JOB (job))
|
||||||
{
|
{
|
||||||
if (job != DUP_JOB)
|
if (job != DUP_JOB)
|
||||||
sh_badjob (list ? list->word->word : "current");
|
sh_badjob (list ? list->word->word : _("current"));
|
||||||
|
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,22 @@
|
||||||
/* getopt for BASH.
|
/* getopt.c - getopt for Bash. Used by the getopt builtin. */
|
||||||
|
|
||||||
Copyright (C) 1993, 1994
|
/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
|
||||||
Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
under the terms of the GNU General Public License as published by the
|
|
||||||
Free Software Foundation; either version 2, or (at your option) any
|
|
||||||
later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
Bash is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Bash is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,22 @@
|
||||||
/* Declarations for getopt.
|
/* getopt.h - declarations for getopt. */
|
||||||
Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
/* Copyright (C) 1989, 1990, 1991, 1992, 1993, 2008,2009 Free Software Foundation, Inc.
|
||||||
under the terms of the GNU General Public License as published by the
|
|
||||||
Free Software Foundation; either version 2, or (at your option) any
|
|
||||||
later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
|
Bash is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Bash is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
/* XXX THIS HAS BEEN MODIFIED FOR INCORPORATION INTO BASH XXX */
|
/* XXX THIS HAS BEEN MODIFIED FOR INCORPORATION INTO BASH XXX */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,26 +5,28 @@ Copyright (C) 1987-2004 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES getopts.c
|
$PRODUCES getopts.c
|
||||||
|
|
||||||
$BUILTIN getopts
|
$BUILTIN getopts
|
||||||
$FUNCTION getopts_builtin
|
$FUNCTION getopts_builtin
|
||||||
$SHORT_DOC getopts optstring name [arg]
|
$SHORT_DOC getopts optstring name [arg]
|
||||||
Getopts is used by shell procedures to parse positional parameters.
|
Parse option arguments.
|
||||||
|
|
||||||
|
Getopts is used by shell procedures to parse positional parameters
|
||||||
|
as options.
|
||||||
|
|
||||||
OPTSTRING contains the option letters to be recognized; if a letter
|
OPTSTRING contains the option letters to be recognized; if a letter
|
||||||
is followed by a colon, the option is expected to have an argument,
|
is followed by a colon, the option is expected to have an argument,
|
||||||
|
|
@ -54,6 +56,10 @@ OPTSTRING is not a colon. OPTERR has the value 1 by default.
|
||||||
|
|
||||||
Getopts normally parses the positional parameters ($0 - $9), but if
|
Getopts normally parses the positional parameters ($0 - $9), but if
|
||||||
more arguments are given, they are parsed instead.
|
more arguments are given, they are parsed instead.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success if an option is found; fails if the end of options is
|
||||||
|
encountered or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
|
||||||
|
|
@ -1,39 +1,47 @@
|
||||||
This file is hash.def, from which is created hash.c.
|
This file is hash.def, from which is created hash.c.
|
||||||
It implements the builtin "hash" in Bash.
|
It implements the builtin "hash" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2006 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES hash.c
|
$PRODUCES hash.c
|
||||||
|
|
||||||
$BUILTIN hash
|
$BUILTIN hash
|
||||||
$FUNCTION hash_builtin
|
$FUNCTION hash_builtin
|
||||||
$SHORT_DOC hash [-lr] [-p pathname] [-dt] [name ...]
|
$SHORT_DOC hash [-lr] [-p pathname] [-dt] [name ...]
|
||||||
For each NAME, the full pathname of the command is determined and
|
Remember or display program locations.
|
||||||
remembered. If the -p option is supplied, PATHNAME is used as the
|
|
||||||
full pathname of NAME, and no path search is performed. The -r
|
Determine and remember the full pathname of each command NAME. If
|
||||||
option causes the shell to forget all remembered locations. The -d
|
no arguments are given, information about remembered commands is displayed.
|
||||||
option causes the shell to forget the remembered location of each NAME.
|
|
||||||
If the -t option is supplied the full pathname to which each NAME
|
Options:
|
||||||
corresponds is printed. If multiple NAME arguments are supplied with
|
-d forget the remembered location of each NAME
|
||||||
-t, the NAME is printed before the hashed full pathname. The -l option
|
-l display in a format that may be reused as input
|
||||||
causes output to be displayed in a format that may be reused as input.
|
-p pathname use PATHNAME is the full pathname of NAME
|
||||||
If no arguments are given, information about remembered commands is displayed.
|
-r forget all remembered locations
|
||||||
|
-t print the remembered location of each NAME, preceding
|
||||||
|
each location with the corresponding NAME if multiple
|
||||||
|
NAMEs are given
|
||||||
|
Arguments:
|
||||||
|
NAME Each NAME is searched for in $PATH and added to the list
|
||||||
|
of remembered commands.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless NAME is not found or an invalid option is given.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -158,7 +166,7 @@ hash_builtin (list)
|
||||||
#ifdef EISDIR
|
#ifdef EISDIR
|
||||||
builtin_error ("%s: %s", pathname, strerror (EISDIR));
|
builtin_error ("%s: %s", pathname, strerror (EISDIR));
|
||||||
#else
|
#else
|
||||||
builtin_error ("%s: is a directory", pathname);
|
builtin_error (_("%s: is a directory"), pathname);
|
||||||
#endif
|
#endif
|
||||||
opt = EXECUTION_FAILURE;
|
opt = EXECUTION_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
@ -233,7 +241,7 @@ print_hashed_commands (fmt)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
if (fmt == 0)
|
if (fmt == 0)
|
||||||
printf ("hits\tcommand\n");
|
printf (_("hits\tcommand\n"));
|
||||||
hash_walk (hashed_filenames, fmt ? print_portable_hash_info : print_hash_info);
|
hash_walk (hashed_filenames, fmt ? print_portable_hash_info : print_hash_info);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,46 @@
|
||||||
This file is help.def, from which is created help.c.
|
This file is help.def, from which is created help.c.
|
||||||
It implements the builtin "help" in Bash.
|
It implements the builtin "help" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES help.c
|
$PRODUCES help.c
|
||||||
|
|
||||||
$BUILTIN help
|
$BUILTIN help
|
||||||
$FUNCTION help_builtin
|
$FUNCTION help_builtin
|
||||||
$DEPENDS_ON HELP_BUILTIN
|
$DEPENDS_ON HELP_BUILTIN
|
||||||
$SHORT_DOC help [-s] [pattern ...]
|
$SHORT_DOC help [-ds] [pattern ...]
|
||||||
Display helpful information about builtin commands. If PATTERN is
|
Display information about builtin commands.
|
||||||
|
|
||||||
|
Displays brief summaries of builtin commands. If PATTERN is
|
||||||
specified, gives detailed help on all commands matching PATTERN,
|
specified, gives detailed help on all commands matching PATTERN,
|
||||||
otherwise a list of the builtins is printed. The -s option
|
otherwise the list of help topics is printed.
|
||||||
restricts the output for each builtin command matching PATTERN to
|
|
||||||
a short usage synopsis.
|
Options:
|
||||||
|
-d output short description for each topic
|
||||||
|
-m display usage in pseudo-manpage format
|
||||||
|
-s output only a short usage synopsis for each topic matching
|
||||||
|
PATTERN
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
PATTERN Pattern specifiying a help topic
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless PATTERN is not found or an invalid option is given.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -63,7 +74,13 @@ $END
|
||||||
extern int errno;
|
extern int errno;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern const char * const bash_copyright;
|
||||||
|
extern const char * const bash_license;
|
||||||
|
|
||||||
static void show_builtin_command_help __P((void));
|
static void show_builtin_command_help __P((void));
|
||||||
|
static int open_helpfile __P((char *));
|
||||||
|
static void show_desc __P((char *, int));
|
||||||
|
static void show_manpage __P((char *, int));
|
||||||
static void show_longdoc __P((int));
|
static void show_longdoc __P((int));
|
||||||
|
|
||||||
/* Print out a list of the known functions in the shell, and what they do.
|
/* Print out a list of the known functions in the shell, and what they do.
|
||||||
|
|
@ -75,14 +92,20 @@ help_builtin (list)
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
char *pattern, *name;
|
char *pattern, *name;
|
||||||
int plen, match_found, sflag;
|
int plen, match_found, sflag, dflag, mflag;
|
||||||
|
|
||||||
sflag = 0;
|
dflag = sflag = mflag = 0;
|
||||||
reset_internal_getopt ();
|
reset_internal_getopt ();
|
||||||
while ((i = internal_getopt (list, "s")) != -1)
|
while ((i = internal_getopt (list, "dms")) != -1)
|
||||||
{
|
{
|
||||||
switch (i)
|
switch (i)
|
||||||
{
|
{
|
||||||
|
case 'd':
|
||||||
|
dflag = 1;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
mflag = 1;
|
||||||
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
sflag = 1;
|
sflag = 1;
|
||||||
break;
|
break;
|
||||||
|
|
@ -104,10 +127,7 @@ help_builtin (list)
|
||||||
|
|
||||||
if (glob_pattern_p (list->word->word))
|
if (glob_pattern_p (list->word->word))
|
||||||
{
|
{
|
||||||
if (list->next)
|
printf (ngettext ("Shell commands matching keyword `", "Shell commands matching keywords `", (list->next ? 2 : 1)));
|
||||||
printf (_("Shell commands matching keywords `"));
|
|
||||||
else
|
|
||||||
printf (_("Shell commands matching keyword `"));
|
|
||||||
print_word_list (list, ", ");
|
print_word_list (list, ", ");
|
||||||
printf ("'\n\n");
|
printf ("'\n\n");
|
||||||
}
|
}
|
||||||
|
|
@ -123,12 +143,22 @@ help_builtin (list)
|
||||||
if ((strncmp (pattern, name, plen) == 0) ||
|
if ((strncmp (pattern, name, plen) == 0) ||
|
||||||
(strmatch (pattern, name, FNMATCH_EXTFLAG) != FNM_NOMATCH))
|
(strmatch (pattern, name, FNMATCH_EXTFLAG) != FNM_NOMATCH))
|
||||||
{
|
{
|
||||||
|
match_found++;
|
||||||
|
if (dflag)
|
||||||
|
{
|
||||||
|
show_desc (name, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (mflag)
|
||||||
|
{
|
||||||
|
show_manpage (name, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
printf ("%s: %s\n", name, shell_builtins[i].short_doc);
|
printf ("%s: %s\n", name, shell_builtins[i].short_doc);
|
||||||
|
|
||||||
if (sflag == 0)
|
if (sflag == 0)
|
||||||
show_longdoc (i);
|
show_longdoc (i);
|
||||||
|
|
||||||
match_found++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -143,6 +173,21 @@ help_builtin (list)
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
open_helpfile (name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = open (name, O_RDONLY);
|
||||||
|
if (fd == -1)
|
||||||
|
{
|
||||||
|
builtin_error (_("%s: cannot open: %s"), name, strerror (errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
/* By convention, enforced by mkbuiltins.c, if separate help files are being
|
/* By convention, enforced by mkbuiltins.c, if separate help files are being
|
||||||
used, the long_doc array contains one string -- the full pathname of the
|
used, the long_doc array contains one string -- the full pathname of the
|
||||||
help file for this builtin. */
|
help file for this builtin. */
|
||||||
|
|
@ -158,12 +203,9 @@ show_longdoc (i)
|
||||||
|
|
||||||
if (doc && doc[0] && *doc[0] == '/' && doc[1] == (char *)NULL)
|
if (doc && doc[0] && *doc[0] == '/' && doc[1] == (char *)NULL)
|
||||||
{
|
{
|
||||||
fd = open (doc[0], O_RDONLY);
|
fd = open_helpfile (doc[0]);
|
||||||
if (fd == -1)
|
if (fd < 0)
|
||||||
{
|
|
||||||
builtin_error (_("%s: cannot open: %s"), doc[0], strerror (errno));
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
zcatfd (fd, 1, doc[0]);
|
zcatfd (fd, 1, doc[0]);
|
||||||
close (fd);
|
close (fd);
|
||||||
}
|
}
|
||||||
|
|
@ -172,11 +214,124 @@ show_longdoc (i)
|
||||||
printf ("%*s%s\n", BASE_INDENT, " ", _(doc[j]));
|
printf ("%*s%s\n", BASE_INDENT, " ", _(doc[j]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
show_desc (name, i)
|
||||||
|
char *name;
|
||||||
|
int i;
|
||||||
|
{
|
||||||
|
register int j;
|
||||||
|
char **doc, *line;
|
||||||
|
int fd, usefile;
|
||||||
|
|
||||||
|
doc = (char **)shell_builtins[i].long_doc;
|
||||||
|
|
||||||
|
usefile = (doc && doc[0] && *doc[0] == '/' && doc[1] == (char *)NULL);
|
||||||
|
if (usefile)
|
||||||
|
{
|
||||||
|
fd = open_helpfile (doc[0]);
|
||||||
|
if (fd < 0)
|
||||||
|
return;
|
||||||
|
zmapfd (fd, &line, doc[0]);
|
||||||
|
close (fd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
line = doc ? doc[0] : (char *)NULL;
|
||||||
|
|
||||||
|
printf ("%s - ", name);
|
||||||
|
for (j = 0; line && line[j]; j++)
|
||||||
|
{
|
||||||
|
putchar (line[j]);
|
||||||
|
if (line[j] == '\n')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
fflush (stdout);
|
||||||
|
|
||||||
|
if (usefile)
|
||||||
|
free (line);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print builtin help in pseudo-manpage format. */
|
||||||
|
static void
|
||||||
|
show_manpage (name, i)
|
||||||
|
char *name;
|
||||||
|
int i;
|
||||||
|
{
|
||||||
|
register int j;
|
||||||
|
char **doc, *line;
|
||||||
|
int fd, usefile;
|
||||||
|
|
||||||
|
doc = (char **)shell_builtins[i].long_doc;
|
||||||
|
|
||||||
|
usefile = (doc && doc[0] && *doc[0] == '/' && doc[1] == (char *)NULL);
|
||||||
|
if (usefile)
|
||||||
|
{
|
||||||
|
fd = open_helpfile (doc[0]);
|
||||||
|
if (fd < 0)
|
||||||
|
return;
|
||||||
|
zmapfd (fd, &line, doc[0]);
|
||||||
|
close (fd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
line = doc ? _(doc[0]) : (char *)NULL;
|
||||||
|
|
||||||
|
/* NAME */
|
||||||
|
printf ("NAME\n");
|
||||||
|
printf ("%*s%s - ", BASE_INDENT, " ", name);
|
||||||
|
for (j = 0; line && line[j]; j++)
|
||||||
|
{
|
||||||
|
putchar (line[j]);
|
||||||
|
if (line[j] == '\n')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf ("\n");
|
||||||
|
|
||||||
|
/* SYNOPSIS */
|
||||||
|
printf ("SYNOPSIS\n");
|
||||||
|
printf ("%*s%s\n\n", BASE_INDENT, " ", shell_builtins[i].short_doc);
|
||||||
|
|
||||||
|
/* DESCRIPTION */
|
||||||
|
printf ("DESCRIPTION\n");
|
||||||
|
if (usefile == 0)
|
||||||
|
{
|
||||||
|
for (j = 0; doc[j]; j++)
|
||||||
|
printf ("%*s%s\n", BASE_INDENT, " ", _(doc[j]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (j = 0; line && line[j]; j++)
|
||||||
|
{
|
||||||
|
putchar (line[j]);
|
||||||
|
if (line[j] == '\n')
|
||||||
|
printf ("%*s", BASE_INDENT, " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
putchar ('\n');
|
||||||
|
|
||||||
|
/* SEE ALSO */
|
||||||
|
printf ("SEE ALSO\n");
|
||||||
|
printf ("%*sbash(1)\n\n", BASE_INDENT, " ");
|
||||||
|
|
||||||
|
/* IMPLEMENTATION */
|
||||||
|
printf ("IMPLEMENTATION\n");
|
||||||
|
printf ("%*s", BASE_INDENT, " ");
|
||||||
|
show_shell_version (0);
|
||||||
|
printf ("%*s", BASE_INDENT, " ");
|
||||||
|
printf ("%s\n", _(bash_copyright));
|
||||||
|
printf ("%*s", BASE_INDENT, " ");
|
||||||
|
printf ("%s\n", _(bash_license));
|
||||||
|
|
||||||
|
fflush (stdout);
|
||||||
|
if (usefile)
|
||||||
|
free (line);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
show_builtin_command_help ()
|
show_builtin_command_help ()
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
char blurb[36];
|
int height, width;
|
||||||
|
char *t, blurb[128];
|
||||||
|
|
||||||
printf (
|
printf (
|
||||||
_("These shell commands are defined internally. Type `help' to see this list.\n\
|
_("These shell commands are defined internally. Type `help' to see this list.\n\
|
||||||
|
|
@ -187,21 +342,42 @@ Use `man -k' or `info' to find out more about commands not in this list.\n\
|
||||||
A star (*) next to a name means that the command is disabled.\n\
|
A star (*) next to a name means that the command is disabled.\n\
|
||||||
\n"));
|
\n"));
|
||||||
|
|
||||||
for (i = 0; i < num_shell_builtins; i++)
|
t = get_string_value ("COLUMNS");
|
||||||
|
width = (t && *t) ? atoi (t) : 80;
|
||||||
|
if (width <= 0)
|
||||||
|
width = 80;
|
||||||
|
|
||||||
|
width /= 2;
|
||||||
|
if (width > sizeof (blurb))
|
||||||
|
width = sizeof (blurb);
|
||||||
|
height = (num_shell_builtins + 1) / 2; /* number of rows */
|
||||||
|
|
||||||
|
for (i = 0; i < height; i++)
|
||||||
{
|
{
|
||||||
QUIT;
|
QUIT;
|
||||||
blurb[0] = (shell_builtins[i].flags & BUILTIN_ENABLED) ? ' ' : '*';
|
|
||||||
strncpy (blurb + 1, shell_builtins[i].short_doc, 34);
|
|
||||||
blurb[35] = '\0';
|
|
||||||
printf ("%s", blurb);
|
|
||||||
|
|
||||||
if (i % 2)
|
/* first column */
|
||||||
|
blurb[0] = (shell_builtins[i].flags & BUILTIN_ENABLED) ? ' ' : '*';
|
||||||
|
strncpy (blurb + 1, shell_builtins[i].short_doc, width - 2);
|
||||||
|
blurb[width - 2] = '>'; /* indicate truncation */
|
||||||
|
blurb[width - 1] = '\0';
|
||||||
|
printf ("%s", blurb);
|
||||||
|
if (((i << 1) >= num_shell_builtins) || (i+height >= num_shell_builtins))
|
||||||
|
{
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
else
|
break;
|
||||||
for (j = strlen (blurb); j < 35; j++)
|
}
|
||||||
putc (' ', stdout);
|
|
||||||
|
/* two spaces */
|
||||||
|
for (j = strlen (blurb); j < width; j++)
|
||||||
|
putc (' ', stdout);
|
||||||
|
|
||||||
|
/* second column */
|
||||||
|
blurb[0] = (shell_builtins[i+height].flags & BUILTIN_ENABLED) ? ' ' : '*';
|
||||||
|
strncpy (blurb + 1, shell_builtins[i+height].short_doc, width - 3);
|
||||||
|
blurb[width - 3] = '>'; /* indicate truncation */
|
||||||
|
blurb[width - 2] = '\0';
|
||||||
|
printf ("%s\n", blurb);
|
||||||
}
|
}
|
||||||
if (i % 2)
|
|
||||||
printf ("\n");
|
|
||||||
}
|
}
|
||||||
#endif /* HELP_BUILTIN */
|
#endif /* HELP_BUILTIN */
|
||||||
|
|
|
||||||
|
|
@ -1,51 +1,58 @@
|
||||||
This file is history.def, from which is created history.c.
|
This file is history.def, from which is created history.c.
|
||||||
It implements the builtin "history" in Bash.
|
It implements the builtin "history" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES history.c
|
$PRODUCES history.c
|
||||||
|
|
||||||
$BUILTIN history
|
$BUILTIN history
|
||||||
$FUNCTION history_builtin
|
$FUNCTION history_builtin
|
||||||
$DEPENDS_ON HISTORY
|
$DEPENDS_ON HISTORY
|
||||||
$SHORT_DOC history [-c] [-d offset] [n] or history -awrn [filename] or history -ps arg [arg...]
|
$SHORT_DOC history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]
|
||||||
Display the history list with line numbers. Lines listed with
|
Display or manipulate the history list.
|
||||||
with a `*' have been modified. Argument of N says to list only
|
|
||||||
the last N lines. The `-c' option causes the history list to be
|
|
||||||
cleared by deleting all of the entries. The `-d' option deletes
|
|
||||||
the history entry at offset OFFSET. The `-w' option writes out the
|
|
||||||
current history to the history file; `-r' means to read the file and
|
|
||||||
append the contents to the history list instead. `-a' means
|
|
||||||
to append history lines from this session to the history file.
|
|
||||||
Argument `-n' means to read all history lines not already read
|
|
||||||
from the history file and append them to the history list.
|
|
||||||
|
|
||||||
If FILENAME is given, then that is used as the history file else
|
Display the history list with line numbers, prefixing each modified
|
||||||
|
entry with a `*'. An argument of N lists only the last N entries.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-c clear the history list by deleting all of the entries
|
||||||
|
-d offset delete the history entry at offset OFFSET.
|
||||||
|
|
||||||
|
-a append history lines from this session to the history file
|
||||||
|
-n read all history lines not already read from the history file
|
||||||
|
-r read the history file and append the contents to the history
|
||||||
|
list
|
||||||
|
-w write the current history to the history file
|
||||||
|
and append them to the history list
|
||||||
|
|
||||||
|
-p perform history expansion on each ARG and display the result
|
||||||
|
without storing it in the history list
|
||||||
|
-s append the ARGs to the history list as a single entry
|
||||||
|
|
||||||
|
If FILENAME is given, it is used as the history file. Otherwise,
|
||||||
if $HISTFILE has a value, that is used, else ~/.bash_history.
|
if $HISTFILE has a value, that is used, else ~/.bash_history.
|
||||||
If the -s option is supplied, the non-option ARGs are appended to
|
|
||||||
the history list as a single entry. The -p option means to perform
|
|
||||||
history expansion on each ARG and display the result, without storing
|
|
||||||
anything in the history list.
|
|
||||||
|
|
||||||
If the $HISTTIMEFORMAT variable is set and not null, its value is used
|
If the $HISTTIMEFORMAT variable is set and not null, its value is used
|
||||||
as a format string for strftime(3) to print the time stamp associated
|
as a format string for strftime(3) to print the time stamp associated
|
||||||
with each displayed history entry. No time stamps are printed otherwise.
|
with each displayed history entry. No time stamps are printed otherwise.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is given or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -79,11 +86,8 @@ extern int errno;
|
||||||
extern int current_command_line_count;
|
extern int current_command_line_count;
|
||||||
extern int force_append_history; /* shopt -s histappend */
|
extern int force_append_history; /* shopt -s histappend */
|
||||||
|
|
||||||
int delete_last_history __P((void));
|
|
||||||
|
|
||||||
static char *histtime __P((HIST_ENTRY *, const char *));
|
static char *histtime __P((HIST_ENTRY *, const char *));
|
||||||
static void display_history __P((WORD_LIST *));
|
static int display_history __P((WORD_LIST *));
|
||||||
static int delete_histent __P((int));
|
|
||||||
static void push_history __P((WORD_LIST *));
|
static void push_history __P((WORD_LIST *));
|
||||||
static int expand_and_print_history __P((WORD_LIST *));
|
static int expand_and_print_history __P((WORD_LIST *));
|
||||||
|
|
||||||
|
|
@ -154,7 +158,7 @@ history_builtin (list)
|
||||||
/* clear the history, but allow other arguments to add to it again. */
|
/* clear the history, but allow other arguments to add to it again. */
|
||||||
if (flags & CFLAG)
|
if (flags & CFLAG)
|
||||||
{
|
{
|
||||||
clear_history ();
|
bash_clear_history ();
|
||||||
if (list == 0)
|
if (list == 0)
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
@ -170,7 +174,7 @@ history_builtin (list)
|
||||||
{
|
{
|
||||||
if (list)
|
if (list)
|
||||||
return (expand_and_print_history (list));
|
return (expand_and_print_history (list));
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (flags & DFLAG)
|
else if (flags & DFLAG)
|
||||||
|
|
@ -183,7 +187,7 @@ history_builtin (list)
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
}
|
}
|
||||||
opt = delete_offset;
|
opt = delete_offset;
|
||||||
result = delete_histent (opt - history_base);
|
result = bash_delete_histent (opt - history_base);
|
||||||
/* Since remove_history changes history_length, this can happen if
|
/* Since remove_history changes history_length, this can happen if
|
||||||
we delete the last history entry. */
|
we delete the last history entry. */
|
||||||
if (where_history () > history_length)
|
if (where_history () > history_length)
|
||||||
|
|
@ -192,8 +196,8 @@ history_builtin (list)
|
||||||
}
|
}
|
||||||
else if ((flags & (AFLAG|RFLAG|NFLAG|WFLAG|CFLAG)) == 0)
|
else if ((flags & (AFLAG|RFLAG|NFLAG|WFLAG|CFLAG)) == 0)
|
||||||
{
|
{
|
||||||
display_history (list);
|
result = display_history (list);
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (result));
|
||||||
}
|
}
|
||||||
|
|
||||||
filename = list ? list->word->word : get_string_value ("HISTFILE");
|
filename = list ? list->word->word : get_string_value ("HISTFILE");
|
||||||
|
|
@ -255,7 +259,7 @@ histtime (hlist, histtimefmt)
|
||||||
return timestr;
|
return timestr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
display_history (list)
|
display_history (list)
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
{
|
{
|
||||||
|
|
@ -266,7 +270,9 @@ display_history (list)
|
||||||
|
|
||||||
if (list)
|
if (list)
|
||||||
{
|
{
|
||||||
limit = get_numeric_arg (list, 0);
|
if (get_numeric_arg (list, 0, &limit) == 0)
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
|
||||||
if (limit < 0)
|
if (limit < 0)
|
||||||
limit = -limit;
|
limit = -limit;
|
||||||
}
|
}
|
||||||
|
|
@ -285,7 +291,6 @@ display_history (list)
|
||||||
else
|
else
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
|
|
||||||
histtimefmt = get_string_value ("HISTTIMEFORMAT");
|
histtimefmt = get_string_value ("HISTTIMEFORMAT");
|
||||||
|
|
||||||
while (hlist[i])
|
while (hlist[i])
|
||||||
|
|
@ -300,48 +305,8 @@ display_history (list)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Delete and free the history list entry at offset I. */
|
return (EXECUTION_SUCCESS);
|
||||||
static int
|
|
||||||
delete_histent (i)
|
|
||||||
int i;
|
|
||||||
{
|
|
||||||
HIST_ENTRY *discard;
|
|
||||||
|
|
||||||
discard = remove_history (i);
|
|
||||||
if (discard)
|
|
||||||
free_history_entry (discard);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
delete_last_history ()
|
|
||||||
{
|
|
||||||
register int i;
|
|
||||||
HIST_ENTRY **hlist, *histent;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
hlist = history_list ();
|
|
||||||
if (hlist == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (i = 0; hlist[i]; i++)
|
|
||||||
;
|
|
||||||
i--;
|
|
||||||
|
|
||||||
/* History_get () takes a parameter that must be offset by history_base. */
|
|
||||||
histent = history_get (history_base + i); /* Don't free this */
|
|
||||||
if (histent == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
r = delete_histent (i);
|
|
||||||
|
|
||||||
if (where_history () > history_length)
|
|
||||||
history_set_pos (history_length);
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove the last entry in the history list and add each argument in
|
/* Remove the last entry in the history list and add each argument in
|
||||||
|
|
@ -359,12 +324,12 @@ push_history (list)
|
||||||
If you don't want history -s to remove the compound command from the
|
If you don't want history -s to remove the compound command from the
|
||||||
history, change #if 0 to #if 1 below. */
|
history, change #if 0 to #if 1 below. */
|
||||||
#if 0
|
#if 0
|
||||||
if (hist_last_line_pushed == 0 && hist_last_line_added && delete_last_history () == 0)
|
if (hist_last_line_pushed == 0 && hist_last_line_added && bash_delete_last_history () == 0)
|
||||||
#else
|
#else
|
||||||
if (hist_last_line_pushed == 0 &&
|
if (hist_last_line_pushed == 0 &&
|
||||||
(hist_last_line_added ||
|
(hist_last_line_added ||
|
||||||
(current_command_line_count > 0 && current_command_first_line_saved && command_oriented_history))
|
(current_command_line_count > 0 && current_command_first_line_saved && command_oriented_history))
|
||||||
&& delete_last_history () == 0)
|
&& bash_delete_last_history () == 0)
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -389,7 +354,7 @@ expand_and_print_history (list)
|
||||||
char *s;
|
char *s;
|
||||||
int r, result;
|
int r, result;
|
||||||
|
|
||||||
if (hist_last_line_pushed == 0 && hist_last_line_added && delete_last_history () == 0)
|
if (hist_last_line_pushed == 0 && hist_last_line_added && bash_delete_last_history () == 0)
|
||||||
return EXECUTION_FAILURE;
|
return EXECUTION_FAILURE;
|
||||||
result = EXECUTION_SUCCESS;
|
result = EXECUTION_SUCCESS;
|
||||||
while (list)
|
while (list)
|
||||||
|
|
|
||||||
|
|
@ -5,19 +5,18 @@ Copyright (C) 1987-2002 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES inlib.c
|
$PRODUCES inlib.c
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -29,12 +28,17 @@ $BUILTIN inlib
|
||||||
$FUNCTION inlib_builtin
|
$FUNCTION inlib_builtin
|
||||||
$DEPENDS_ON apollo
|
$DEPENDS_ON apollo
|
||||||
$SHORT_DOC inlib pathname [pathname...]
|
$SHORT_DOC inlib pathname [pathname...]
|
||||||
|
Install user-supplied library.
|
||||||
|
|
||||||
Install a user-supplied library specified by pathname in the current
|
Install a user-supplied library specified by pathname in the current
|
||||||
shell process. The library is used to resolve external references
|
shell process. The library is used to resolve external references
|
||||||
in programs and libraries loaded after its installation. Note
|
in programs and libraries loaded after its installation. Note
|
||||||
that the library is not loaded into the address space unless it is
|
that the library is not loaded into the address space unless it is
|
||||||
needed to resolve an external reference. The list of inlibed
|
needed to resolve an external reference. The list of inlibed
|
||||||
libraries is passed to all children of the current shell.
|
libraries is passed to all children of the current shell.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless PATHNAME is not found or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#if defined (apollo)
|
#if defined (apollo)
|
||||||
|
|
@ -64,7 +68,7 @@ inlib_builtin (list)
|
||||||
|
|
||||||
if (status.all != status_$ok)
|
if (status.all != status_$ok)
|
||||||
{
|
{
|
||||||
builtin_error ("%s: inlib failed", list->word->word);
|
builtin_error (_("%s: inlib failed"), list->word->word);
|
||||||
return_value = EXECUTION_FAILURE;
|
return_value = EXECUTION_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
This file is jobs.def, from which is created jobs.c.
|
This file is jobs.def, from which is created jobs.c.
|
||||||
It implements the builtins "jobs" and "disown" in Bash.
|
It implements the builtins "jobs" and "disown" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES jobs.c
|
$PRODUCES jobs.c
|
||||||
|
|
||||||
|
|
@ -25,15 +24,26 @@ $BUILTIN jobs
|
||||||
$FUNCTION jobs_builtin
|
$FUNCTION jobs_builtin
|
||||||
$DEPENDS_ON JOB_CONTROL
|
$DEPENDS_ON JOB_CONTROL
|
||||||
$SHORT_DOC jobs [-lnprs] [jobspec ...] or jobs -x command [args]
|
$SHORT_DOC jobs [-lnprs] [jobspec ...] or jobs -x command [args]
|
||||||
Lists the active jobs. The -l option lists process id's in addition
|
Display status of jobs.
|
||||||
to the normal information; the -p option lists process id's only.
|
|
||||||
If -n is given, only processes that have changed status since the last
|
Lists the active jobs. JOBSPEC restricts output to that job.
|
||||||
notification are printed. JOBSPEC restricts output to that job. The
|
Without options, the status of all active jobs is displayed.
|
||||||
-r and -s options restrict output to running and stopped jobs only,
|
|
||||||
respectively. Without options, the status of all active jobs is
|
Options:
|
||||||
printed. If -x is given, COMMAND is run after all job specifications
|
-l lists process IDs in addition to the normal information
|
||||||
that appear in ARGS have been replaced with the process ID of that job's
|
-n list only processes that have changed status since the last
|
||||||
|
notification
|
||||||
|
-p lists process IDs only
|
||||||
|
-r restrict output to running jobs
|
||||||
|
-s restrict output to stopped jobs
|
||||||
|
|
||||||
|
If -x is supplied, COMMAND is run after all job specifications that
|
||||||
|
appear in ARGS have been replaced with the process ID of that job's
|
||||||
process group leader.
|
process group leader.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is given or an error occurs.
|
||||||
|
If -x is used, returns the exit status of COMMAND.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -203,11 +213,19 @@ $BUILTIN disown
|
||||||
$FUNCTION disown_builtin
|
$FUNCTION disown_builtin
|
||||||
$DEPENDS_ON JOB_CONTROL
|
$DEPENDS_ON JOB_CONTROL
|
||||||
$SHORT_DOC disown [-h] [-ar] [jobspec ...]
|
$SHORT_DOC disown [-h] [-ar] [jobspec ...]
|
||||||
By default, removes each JOBSPEC argument from the table of active jobs.
|
Remove jobs from current shell.
|
||||||
If the -h option is given, the job is not removed from the table, but is
|
|
||||||
marked so that SIGHUP is not sent to the job if the shell receives a
|
Removes each JOBSPEC argument from the table of active jobs. Without
|
||||||
SIGHUP. The -a option, when JOBSPEC is not supplied, means to remove all
|
any JOBSPECs, the shell uses its notion of the current job.
|
||||||
jobs from the job table; the -r option means to remove only running jobs.
|
|
||||||
|
Options:
|
||||||
|
-a remove all jobs if JOBSPEC is not supplied
|
||||||
|
-h mark each JOBSPEC so that SIGHUP is not sent to the job if the
|
||||||
|
shell receives a SIGHUP
|
||||||
|
-r remove only running jobs
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option or JOBSPEC is given.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#if defined (JOB_CONTROL)
|
#if defined (JOB_CONTROL)
|
||||||
|
|
@ -261,7 +279,7 @@ disown_builtin (list)
|
||||||
|
|
||||||
if (job == NO_JOB || jobs == 0 || INVALID_JOB (job))
|
if (job == NO_JOB || jobs == 0 || INVALID_JOB (job))
|
||||||
{
|
{
|
||||||
sh_badjob (list ? list->word->word : "current");
|
sh_badjob (list ? list->word->word : _("current"));
|
||||||
retval = EXECUTION_FAILURE;
|
retval = EXECUTION_FAILURE;
|
||||||
}
|
}
|
||||||
else if (nohup_only)
|
else if (nohup_only)
|
||||||
|
|
|
||||||
|
|
@ -1,36 +1,46 @@
|
||||||
This file is kill.def, from which is created kill.c.
|
This file is kill.def, from which is created kill.c.
|
||||||
It implements the builtin "kill" in Bash.
|
It implements the builtin "kill" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES kill.c
|
$PRODUCES kill.c
|
||||||
|
|
||||||
$BUILTIN kill
|
$BUILTIN kill
|
||||||
$FUNCTION kill_builtin
|
$FUNCTION kill_builtin
|
||||||
$SHORT_DOC kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
|
$SHORT_DOC kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
|
||||||
Send the processes named by PID (or JOBSPEC) the signal SIGSPEC. If
|
Send a signal to a job.
|
||||||
SIGSPEC is not present, then SIGTERM is assumed. An argument of `-l'
|
|
||||||
lists the signal names; if arguments follow `-l' they are assumed to
|
Send the processes identified by PID or JOBSPEC the signal named by
|
||||||
be signal numbers for which names should be listed. Kill is a shell
|
SIGSPEC or SIGNUM. If neither SIGSPEC nor SIGNUM is present, then
|
||||||
builtin for two reasons: it allows job IDs to be used instead of
|
SIGTERM is assumed.
|
||||||
process IDs, and, if you have reached the limit on processes that
|
|
||||||
you can create, you don't have to start a process to kill another one.
|
Options:
|
||||||
|
-s sig SIG is a signal name
|
||||||
|
-n sig SIG is a signal number
|
||||||
|
-l list the signal names; if arguments follow `-l' they are
|
||||||
|
assumed to be signal numbers for which names should be listed
|
||||||
|
|
||||||
|
Kill is a shell builtin for two reasons: it allows job IDs to be used
|
||||||
|
instead of process IDs, and allows processes to be killed if the limit
|
||||||
|
on processes that you can create is reached.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is given or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
|
||||||
|
|
@ -1,33 +1,34 @@
|
||||||
This file is let.def, from which is created let.c.
|
This file is let.def, from which is created let.c.
|
||||||
It implements the builtin "let" in Bash.
|
It implements the builtin "let" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2002 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$BUILTIN let
|
$BUILTIN let
|
||||||
$FUNCTION let_builtin
|
$FUNCTION let_builtin
|
||||||
$PRODUCES let.c
|
$PRODUCES let.c
|
||||||
$SHORT_DOC let arg [arg ...]
|
$SHORT_DOC let arg [arg ...]
|
||||||
Each ARG is an arithmetic expression to be evaluated. Evaluation
|
Evaluate arithmetic expressions.
|
||||||
is done in fixed-width integers with no check for overflow, though
|
|
||||||
division by 0 is trapped and flagged as an error. The following
|
Evaluate each ARG as an arithmetic expression. Evaluation is done in
|
||||||
list of operators is grouped into levels of equal-precedence operators.
|
fixed-width integers with no check for overflow, though division by 0
|
||||||
The levels are listed in order of decreasing precedence.
|
is trapped and flagged as an error. The following list of operators is
|
||||||
|
grouped into levels of equal-precedence operators. The levels are listed
|
||||||
|
in order of decreasing precedence.
|
||||||
|
|
||||||
id++, id-- variable post-increment, post-decrement
|
id++, id-- variable post-increment, post-decrement
|
||||||
++id, --id variable pre-increment, pre-decrement
|
++id, --id variable pre-increment, pre-decrement
|
||||||
|
|
@ -59,8 +60,8 @@ Operators are evaluated in order of precedence. Sub-expressions in
|
||||||
parentheses are evaluated first and may override the precedence
|
parentheses are evaluated first and may override the precedence
|
||||||
rules above.
|
rules above.
|
||||||
|
|
||||||
If the last ARG evaluates to 0, let returns 1; 0 is returned
|
Exit Status:
|
||||||
otherwise.
|
If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise..
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
|
||||||
317
builtins/mapfile.def
Normal file
317
builtins/mapfile.def
Normal file
|
|
@ -0,0 +1,317 @@
|
||||||
|
This file is mapfile.def, from which is created mapfile.c.
|
||||||
|
It implements the builtin "mapfile" in Bash.
|
||||||
|
|
||||||
|
Copyright (C) 2005-2006 Rocky Bernstein for Free Software Foundation, Inc.
|
||||||
|
Copyright (C) 2008,2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
|
Bash is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Bash is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
$PRODUCES mapfile.c
|
||||||
|
|
||||||
|
$BUILTIN mapfile
|
||||||
|
$FUNCTION mapfile_builtin
|
||||||
|
$SHORT_DOC mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
|
||||||
|
Read lines from a file into an array variable.
|
||||||
|
|
||||||
|
Read lines from the standard input into the array variable ARRAY, or from
|
||||||
|
file descriptor FD if the -u option is supplied. The variable MAPFILE is
|
||||||
|
the default ARRAY.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-n count Copy at most COUNT lines. If COUNT is 0, all lines are copied.
|
||||||
|
-O origin Begin assigning to ARRAY at index ORIGIN. The default index is 0.
|
||||||
|
-s count Discard the first COUNT lines read.
|
||||||
|
-t Remove a trailing newline from each line read.
|
||||||
|
-u fd Read lines from file descriptor FD instead of the standard input.
|
||||||
|
-C callback Evaluate CALLBACK each time QUANTUM lines are read.
|
||||||
|
-c quantum Specify the number of lines read between each call to CALLBACK.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
ARRAY Array variable name to use for file data.
|
||||||
|
|
||||||
|
If -C is supplied without -c, the default quantum is 5000.
|
||||||
|
|
||||||
|
If not supplied with an explicit origin, mapfile will clear ARRAY before
|
||||||
|
assigning to it.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is given or ARRAY is readonly.
|
||||||
|
$END
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "builtins.h"
|
||||||
|
#include "posixstat.h"
|
||||||
|
|
||||||
|
#if defined (HAVE_UNISTD_H)
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "bashansi.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "../bashintl.h"
|
||||||
|
#include "../shell.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "bashgetopt.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined (errno)
|
||||||
|
extern int errno;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (ARRAY_VARS)
|
||||||
|
|
||||||
|
#define DEFAULT_ARRAY_NAME "MAPFILE"
|
||||||
|
|
||||||
|
/* The value specifying how frequently `mapfile' calls the callback. */
|
||||||
|
#define DEFAULT_QUANTUM 5000
|
||||||
|
|
||||||
|
/* Values for FLAGS */
|
||||||
|
#define MAPF_CLEARARRAY 0x01
|
||||||
|
#define MAPF_CHOP 0x02
|
||||||
|
|
||||||
|
static int
|
||||||
|
run_callback(callback, current_index)
|
||||||
|
const char *callback;
|
||||||
|
unsigned int current_index;
|
||||||
|
{
|
||||||
|
unsigned int execlen;
|
||||||
|
char *execstr;
|
||||||
|
|
||||||
|
execlen = strlen (callback) + 10;
|
||||||
|
/* 1 for space between %s and %d,
|
||||||
|
another 1 for the last nul char for C string. */
|
||||||
|
execlen += 2;
|
||||||
|
execstr = xmalloc (execlen);
|
||||||
|
|
||||||
|
snprintf (execstr, execlen, "%s %d", callback, current_index);
|
||||||
|
return parse_and_execute(execstr, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_chop(line)
|
||||||
|
char * line;
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
|
||||||
|
length = strlen (line);
|
||||||
|
if (length && line[length-1] == '\n')
|
||||||
|
line[length-1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
mapfile (fd, line_count_goal, origin, nskip, callback_quantum, callback, array_name, flags)
|
||||||
|
int fd;
|
||||||
|
long line_count_goal, origin, nskip, callback_quantum;
|
||||||
|
char *callback, *array_name;
|
||||||
|
int flags;
|
||||||
|
{
|
||||||
|
char *line;
|
||||||
|
size_t line_length;
|
||||||
|
unsigned int array_index, line_count;
|
||||||
|
SHELL_VAR *entry;
|
||||||
|
int unbuffered_read;
|
||||||
|
|
||||||
|
line = NULL;
|
||||||
|
line_length = 0;
|
||||||
|
unbuffered_read = 0;
|
||||||
|
|
||||||
|
/* The following check should be done before reading any lines. Doing it
|
||||||
|
here allows us to call bind_array_element instead of bind_array_variable
|
||||||
|
and skip the variable lookup on every call. */
|
||||||
|
entry = find_or_make_array_variable (array_name, 1);
|
||||||
|
if (entry == 0)
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
if (flags & MAPF_CLEARARRAY)
|
||||||
|
array_flush (array_cell (entry));
|
||||||
|
|
||||||
|
#ifndef __CYGWIN__
|
||||||
|
unbuffered_read = (lseek (fd, 0L, SEEK_CUR) < 0) && (errno == ESPIPE);
|
||||||
|
#else
|
||||||
|
unbuffered_read = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Skip any lines at beginning of file? */
|
||||||
|
for (line_count = 0; line_count < nskip; line_count++)
|
||||||
|
zgetline(fd, &line, &line_length, unbuffered_read);
|
||||||
|
line = 0;
|
||||||
|
line_length = 0;
|
||||||
|
|
||||||
|
/* Reset the buffer for bash own stream */
|
||||||
|
for (array_index = origin, line_count = 0;
|
||||||
|
zgetline(fd, &line, &line_length, unbuffered_read) != -1;
|
||||||
|
array_index++, line_count++)
|
||||||
|
{
|
||||||
|
/* Have we exceeded # of lines to store? */
|
||||||
|
if (line_count_goal != 0 && line_count >= line_count_goal)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Remove trailing newlines? */
|
||||||
|
if (flags & MAPF_CHOP)
|
||||||
|
do_chop (line);
|
||||||
|
|
||||||
|
/* Has a callback been registered and if so is it time to call it? */
|
||||||
|
if (callback && line_count && (line_count % callback_quantum) == 0)
|
||||||
|
{
|
||||||
|
run_callback (callback, array_index);
|
||||||
|
|
||||||
|
/* Reset the buffer for bash own stream. */
|
||||||
|
if (unbuffered_read == 0)
|
||||||
|
zsyncfd (fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
bind_array_element (entry, array_index, line, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
xfree (line);
|
||||||
|
|
||||||
|
if (unbuffered_read == 0)
|
||||||
|
zsyncfd (fd);
|
||||||
|
|
||||||
|
return EXECUTION_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mapfile_builtin (list)
|
||||||
|
WORD_LIST *list;
|
||||||
|
{
|
||||||
|
int opt, code, fd, clear_array, flags;
|
||||||
|
intmax_t intval;
|
||||||
|
long lines, origin, nskip, callback_quantum;
|
||||||
|
char *array_name, *callback;
|
||||||
|
|
||||||
|
clear_array = 1;
|
||||||
|
fd = 0;
|
||||||
|
lines = origin = nskip = 0;
|
||||||
|
flags = MAPF_CLEARARRAY;
|
||||||
|
callback_quantum = DEFAULT_QUANTUM;
|
||||||
|
callback = 0;
|
||||||
|
|
||||||
|
reset_internal_getopt ();
|
||||||
|
while ((opt = internal_getopt (list, "u:n:O:tC:c:s:")) != -1)
|
||||||
|
{
|
||||||
|
switch (opt)
|
||||||
|
{
|
||||||
|
case 'u':
|
||||||
|
code = legal_number (list_optarg, &intval);
|
||||||
|
if (code == 0 || intval < 0 || intval != (int)intval)
|
||||||
|
{
|
||||||
|
builtin_error (_("%s: invalid file descriptor specification"), list_optarg);
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fd = intval;
|
||||||
|
|
||||||
|
if (sh_validfd (fd) == 0)
|
||||||
|
{
|
||||||
|
builtin_error (_("%d: invalid file descriptor: %s"), fd, strerror (errno));
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'n':
|
||||||
|
code = legal_number (list_optarg, &intval);
|
||||||
|
if (code == 0 || intval < 0 || intval != (unsigned)intval)
|
||||||
|
{
|
||||||
|
builtin_error (_("%s: invalid line count"), list_optarg);
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
lines = intval;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'O':
|
||||||
|
code = legal_number (list_optarg, &intval);
|
||||||
|
if (code == 0 || intval < 0 || intval != (unsigned)intval)
|
||||||
|
{
|
||||||
|
builtin_error (_("%s: invalid array origin"), list_optarg);
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
origin = intval;
|
||||||
|
flags &= ~MAPF_CLEARARRAY;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
flags |= MAPF_CHOP;
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
callback = list_optarg;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
code = legal_number (list_optarg, &intval);
|
||||||
|
if (code == 0 || intval < 0 || intval != (unsigned)intval)
|
||||||
|
{
|
||||||
|
builtin_error (_("%s: invalid callback quantum"), list_optarg);
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
callback_quantum = intval;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
code = legal_number (list_optarg, &intval);
|
||||||
|
if (code == 0 || intval < 0 || intval != (unsigned)intval)
|
||||||
|
{
|
||||||
|
builtin_error (_("%s: invalid line count"), list_optarg);
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nskip = intval;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
builtin_usage ();
|
||||||
|
return (EX_USAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
list = loptend;
|
||||||
|
|
||||||
|
if (list == 0)
|
||||||
|
array_name = DEFAULT_ARRAY_NAME;
|
||||||
|
else if (list->word == 0 || list->word->word == 0)
|
||||||
|
{
|
||||||
|
builtin_error ("internal error: getting variable name");
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
else if (list->word->word[0] == '\0')
|
||||||
|
{
|
||||||
|
builtin_error (_("empty array variable name"));
|
||||||
|
return (EX_USAGE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
array_name = list->word->word;
|
||||||
|
|
||||||
|
if (legal_identifier (array_name) == 0 && valid_array_reference (array_name) == 0)
|
||||||
|
{
|
||||||
|
sh_invalidid (array_name);
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mapfile (fd, lines, origin, nskip, callback_quantum, callback, array_name, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
int
|
||||||
|
mapfile_builtin (list)
|
||||||
|
WORD_LIST *list;
|
||||||
|
{
|
||||||
|
builtin_error (_("array variable support required"));
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARRAY_VARS */
|
||||||
|
|
@ -1,23 +1,23 @@
|
||||||
/* mkbuiltins.c - Create builtins.c, builtext.h, and builtdoc.c from
|
/* mkbuiltins.c - Create builtins.c, builtext.h, and builtdoc.c from
|
||||||
a single source file called builtins.def. */
|
a single source file called builtins.def. */
|
||||||
|
|
||||||
/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (CROSS_COMPILING)
|
#if !defined (CROSS_COMPILING)
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
|
|
@ -71,6 +71,7 @@ extern char *strcpy ();
|
||||||
/* Flag values that builtins can have. */
|
/* Flag values that builtins can have. */
|
||||||
#define BUILTIN_FLAG_SPECIAL 0x01
|
#define BUILTIN_FLAG_SPECIAL 0x01
|
||||||
#define BUILTIN_FLAG_ASSIGNMENT 0x02
|
#define BUILTIN_FLAG_ASSIGNMENT 0x02
|
||||||
|
#define BUILTIN_FLAG_POSIX_BUILTIN 0x04
|
||||||
|
|
||||||
#define BASE_INDENT 4
|
#define BASE_INDENT 4
|
||||||
|
|
||||||
|
|
@ -154,9 +155,18 @@ char *assignment_builtins[] =
|
||||||
(char *)NULL
|
(char *)NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* The builtin commands that are special to the POSIX search order. */
|
||||||
|
char *posix_builtins[] =
|
||||||
|
{
|
||||||
|
"alias", "bg", "cd", "command", "false", "fc", "fg", "getopts", "jobs",
|
||||||
|
"kill", "newgrp", "pwd", "read", "true", "umask", "unalias", "wait",
|
||||||
|
(char *)NULL
|
||||||
|
};
|
||||||
|
|
||||||
/* Forward declarations. */
|
/* Forward declarations. */
|
||||||
static int is_special_builtin ();
|
static int is_special_builtin ();
|
||||||
static int is_assignment_builtin ();
|
static int is_assignment_builtin ();
|
||||||
|
static int is_posix_builtin ();
|
||||||
|
|
||||||
#if !defined (HAVE_RENAME)
|
#if !defined (HAVE_RENAME)
|
||||||
static int rename ();
|
static int rename ();
|
||||||
|
|
@ -800,6 +810,8 @@ builtin_handler (self, defs, arg)
|
||||||
new->flags |= BUILTIN_FLAG_SPECIAL;
|
new->flags |= BUILTIN_FLAG_SPECIAL;
|
||||||
if (is_assignment_builtin (name))
|
if (is_assignment_builtin (name))
|
||||||
new->flags |= BUILTIN_FLAG_ASSIGNMENT;
|
new->flags |= BUILTIN_FLAG_ASSIGNMENT;
|
||||||
|
if (is_posix_builtin (name))
|
||||||
|
new->flags |= BUILTIN_FLAG_POSIX_BUILTIN;
|
||||||
|
|
||||||
array_add ((char *)new, defs->builtins);
|
array_add ((char *)new, defs->builtins);
|
||||||
building_builtin = 1;
|
building_builtin = 1;
|
||||||
|
|
@ -1080,23 +1092,23 @@ char *structfile_header[] = {
|
||||||
"/* This file is manufactured by ./mkbuiltins, and should not be",
|
"/* This file is manufactured by ./mkbuiltins, and should not be",
|
||||||
" edited by hand. See the source to mkbuiltins for details. */",
|
" edited by hand. See the source to mkbuiltins for details. */",
|
||||||
"",
|
"",
|
||||||
"/* Copyright (C) 1987-2002 Free Software Foundation, Inc.",
|
"/* Copyright (C) 1987-2009 Free Software Foundation, Inc.",
|
||||||
"",
|
"",
|
||||||
" This file is part of GNU Bash, the Bourne Again SHell.",
|
" This file is part of GNU Bash, the Bourne Again SHell.",
|
||||||
"",
|
"",
|
||||||
" Bash is free software; you can redistribute it and/or modify it",
|
" Bash is free software: you can redistribute it and/or modify",
|
||||||
" under the terms of the GNU General Public License as published by",
|
" it under the terms of the GNU General Public License as published by",
|
||||||
" the Free Software Foundation; either version 2, or (at your option)",
|
" the Free Software Foundation, either version 3 of the License, or",
|
||||||
" any later version.",
|
" (at your option) any later version.",
|
||||||
"",
|
"",
|
||||||
" Bash is distributed in the hope that it will be useful, but WITHOUT",
|
" Bash is distributed in the hope that it will be useful,",
|
||||||
" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY",
|
" but WITHOUT ANY WARRANTY; without even the implied warranty of",
|
||||||
" or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public",
|
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the",
|
||||||
" License for more details.",
|
" GNU General Public License for more details.",
|
||||||
"",
|
"",
|
||||||
" You should have received a copy of the GNU General Public License",
|
" You should have received a copy of the GNU General Public License",
|
||||||
" along with Bash; see the file COPYING. If not, write to the Free",
|
" along with Bash. If not, see <http://www.gnu.org/licenses/>.",
|
||||||
" Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */",
|
"*/",
|
||||||
"",
|
"",
|
||||||
"/* The list of shell builtins. Each element is name, function, flags,",
|
"/* The list of shell builtins. Each element is name, function, flags,",
|
||||||
" long-doc, short-doc. The long-doc field contains a pointer to an array",
|
" long-doc, short-doc. The long-doc field contains a pointer to an array",
|
||||||
|
|
@ -1217,14 +1229,15 @@ write_builtins (defs, structfile, externfile)
|
||||||
else
|
else
|
||||||
fprintf (structfile, "(sh_builtin_func_t *)0x0, ");
|
fprintf (structfile, "(sh_builtin_func_t *)0x0, ");
|
||||||
|
|
||||||
fprintf (structfile, "%s%s%s, %s_doc,\n",
|
fprintf (structfile, "%s%s%s%s, %s_doc,\n",
|
||||||
"BUILTIN_ENABLED | STATIC_BUILTIN",
|
"BUILTIN_ENABLED | STATIC_BUILTIN",
|
||||||
(builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "",
|
(builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "",
|
||||||
(builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "",
|
(builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "",
|
||||||
|
(builtin->flags & BUILTIN_FLAG_POSIX_BUILTIN) ? " | POSIX_BUILTIN" : "",
|
||||||
document_name (builtin));
|
document_name (builtin));
|
||||||
|
|
||||||
fprintf
|
fprintf
|
||||||
(structfile, " \"%s\", (char *)NULL },\n",
|
(structfile, " N_(\"%s\"), (char *)NULL },\n",
|
||||||
builtin->shortdoc ? builtin->shortdoc : builtin->name);
|
builtin->shortdoc ? builtin->shortdoc : builtin->name);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1561,6 +1574,13 @@ is_assignment_builtin (name)
|
||||||
return (_find_in_table (name, assignment_builtins));
|
return (_find_in_table (name, assignment_builtins));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
is_posix_builtin (name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
return (_find_in_table (name, posix_builtins));
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined (HAVE_RENAME)
|
#if !defined (HAVE_RENAME)
|
||||||
static int
|
static int
|
||||||
rename (from, to)
|
rename (from, to)
|
||||||
|
|
|
||||||
|
|
@ -1,39 +1,49 @@
|
||||||
This file is printf.def, from which is created printf.c.
|
This file is printf.def, from which is created printf.c.
|
||||||
It implements the builtin "printf" in Bash.
|
It implements the builtin "printf" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1997-2007 Free Software Foundation, Inc.
|
Copyright (C) 1997-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
|
|
||||||
|
|
||||||
$PRODUCES printf.c
|
$PRODUCES printf.c
|
||||||
|
|
||||||
$BUILTIN printf
|
$BUILTIN printf
|
||||||
$FUNCTION printf_builtin
|
$FUNCTION printf_builtin
|
||||||
$SHORT_DOC printf [-v var] format [arguments]
|
$SHORT_DOC printf [-v var] format [arguments]
|
||||||
printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT
|
Formats and prints ARGUMENTS under control of the FORMAT.
|
||||||
is a character string which contains three types of objects: plain
|
|
||||||
characters, which are simply copied to standard output, character escape
|
Options:
|
||||||
sequences which are converted and copied to the standard output, and
|
-v var assign the output to shell variable VAR rather than
|
||||||
|
display it on the standard output
|
||||||
|
|
||||||
|
FORMAT is a character string which contains three types of objects: plain
|
||||||
|
characters, which are simply copied to standard output; character escape
|
||||||
|
sequences, which are converted and copied to the standard output; and
|
||||||
format specifications, each of which causes printing of the next successive
|
format specifications, each of which causes printing of the next successive
|
||||||
argument. In addition to the standard printf(1) formats, %b means to
|
argument.
|
||||||
expand backslash escape sequences in the corresponding argument, and %q
|
|
||||||
means to quote the argument in a way that can be reused as shell input.
|
In addition to the standard format specifications described in printf(1)
|
||||||
If the -v option is supplied, the output is placed into the value of the
|
and printf(3), printf interprets:
|
||||||
shell variable VAR rather than being sent to the standard output.
|
|
||||||
|
%b expand backslash escape sequences in the corresponding argument
|
||||||
|
%q quote the argument in a way that can be reused as shell input
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is given or a write or assignment
|
||||||
|
error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -66,6 +76,7 @@ $END
|
||||||
#include "../bashintl.h"
|
#include "../bashintl.h"
|
||||||
|
|
||||||
#include "../shell.h"
|
#include "../shell.h"
|
||||||
|
#include "shmbutil.h"
|
||||||
#include "stdc.h"
|
#include "stdc.h"
|
||||||
#include "bashgetopt.h"
|
#include "bashgetopt.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
@ -99,32 +110,23 @@ extern int errno;
|
||||||
|
|
||||||
#define PF(f, func) \
|
#define PF(f, func) \
|
||||||
do { \
|
do { \
|
||||||
char *b = 0; \
|
|
||||||
int nw; \
|
int nw; \
|
||||||
clearerr (stdout); \
|
clearerr (stdout); \
|
||||||
if (have_fieldwidth && have_precision) \
|
if (have_fieldwidth && have_precision) \
|
||||||
nw = asprintf(&b, f, fieldwidth, precision, func); \
|
nw = vflag ? vbprintf (f, fieldwidth, precision, func) : printf (f, fieldwidth, precision, func); \
|
||||||
else if (have_fieldwidth) \
|
else if (have_fieldwidth) \
|
||||||
nw = asprintf(&b, f, fieldwidth, func); \
|
nw = vflag ? vbprintf (f, fieldwidth, func) : printf (f, fieldwidth, func); \
|
||||||
else if (have_precision) \
|
else if (have_precision) \
|
||||||
nw = asprintf(&b, f, precision, func); \
|
nw = vflag ? vbprintf (f, precision, func) : printf (f, fieldwidth, func); \
|
||||||
else \
|
else \
|
||||||
nw = asprintf(&b, f, func); \
|
nw = vflag ? vbprintf (f, func) : printf (f, func); \
|
||||||
tw += nw; \
|
tw += nw; \
|
||||||
if (b) \
|
|
||||||
{ \
|
|
||||||
if (vflag) \
|
|
||||||
(void)vbadd (b, nw); \
|
|
||||||
else \
|
|
||||||
(void)fputs (b, stdout); \
|
|
||||||
if (ferror (stdout)) \
|
if (ferror (stdout)) \
|
||||||
{ \
|
{ \
|
||||||
sh_wrerror (); \
|
sh_wrerror (); \
|
||||||
clearerr (stdout); \
|
clearerr (stdout); \
|
||||||
return (EXECUTION_FAILURE); \
|
return (EXECUTION_FAILURE); \
|
||||||
} \
|
} \
|
||||||
free (b); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* We free the buffer used by mklong() if it's `too big'. */
|
/* We free the buffer used by mklong() if it's `too big'. */
|
||||||
|
|
@ -148,6 +150,9 @@ extern int errno;
|
||||||
vbsize = 0; \
|
vbsize = 0; \
|
||||||
vbuf = 0; \
|
vbuf = 0; \
|
||||||
} \
|
} \
|
||||||
|
else if (vbuf) \
|
||||||
|
vbuf[0] = 0; \
|
||||||
|
terminate_immediately--; \
|
||||||
fflush (stdout); \
|
fflush (stdout); \
|
||||||
if (ferror (stdout)) \
|
if (ferror (stdout)) \
|
||||||
{ \
|
{ \
|
||||||
|
|
@ -165,11 +170,16 @@ extern int errno;
|
||||||
extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3)));
|
extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3)));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_VSNPRINTF
|
||||||
|
extern int vsnprintf __P((char *, size_t, const char *, ...)) __attribute__((__format__ (printf, 3, 4)));
|
||||||
|
#endif
|
||||||
|
|
||||||
static void printf_erange __P((char *));
|
static void printf_erange __P((char *));
|
||||||
static int printstr __P((char *, char *, int, int, int));
|
static int printstr __P((char *, char *, int, int, int));
|
||||||
static int tescape __P((char *, char *, int *));
|
static int tescape __P((char *, char *, int *));
|
||||||
static char *bexpand __P((char *, int, int *, int *));
|
static char *bexpand __P((char *, int, int *, int *));
|
||||||
static char *vbadd __P((char *, int));
|
static char *vbadd __P((char *, int));
|
||||||
|
static int vbprintf __P((const char *, ...)) __attribute__((__format__ (printf, 1, 2)));
|
||||||
static char *mklong __P((char *, char *, size_t));
|
static char *mklong __P((char *, char *, size_t));
|
||||||
static int getchr __P((void));
|
static int getchr __P((void));
|
||||||
static char *getstr __P((void));
|
static char *getstr __P((void));
|
||||||
|
|
@ -188,7 +198,7 @@ typedef double floatmax_t;
|
||||||
#endif
|
#endif
|
||||||
static floatmax_t getfloatmax __P((void));
|
static floatmax_t getfloatmax __P((void));
|
||||||
|
|
||||||
static int asciicode __P((void));
|
static intmax_t asciicode __P((void));
|
||||||
|
|
||||||
static WORD_LIST *garglist;
|
static WORD_LIST *garglist;
|
||||||
static int retval;
|
static int retval;
|
||||||
|
|
@ -228,6 +238,8 @@ printf_builtin (list)
|
||||||
{
|
{
|
||||||
vflag = 1;
|
vflag = 1;
|
||||||
vblen = 0;
|
vblen = 0;
|
||||||
|
if (vbuf)
|
||||||
|
vbuf[0] = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -260,6 +272,8 @@ printf_builtin (list)
|
||||||
if (format == 0 || *format == 0)
|
if (format == 0 || *format == 0)
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
||||||
|
terminate_immediately++;
|
||||||
|
|
||||||
/* Basic algorithm is to scan the format string for conversion
|
/* Basic algorithm is to scan the format string for conversion
|
||||||
specifications -- once one is found, find out if the field
|
specifications -- once one is found, find out if the field
|
||||||
width or precision is a '*'; if it is, gather up value. Note,
|
width or precision is a '*'; if it is, gather up value. Note,
|
||||||
|
|
@ -554,7 +568,7 @@ static void
|
||||||
printf_erange (s)
|
printf_erange (s)
|
||||||
char *s;
|
char *s;
|
||||||
{
|
{
|
||||||
builtin_error ("warning: %s: %s", s, strerror(ERANGE));
|
builtin_error (_("warning: %s: %s"), s, strerror(ERANGE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We duplicate a lot of what printf(3) does here. */
|
/* We duplicate a lot of what printf(3) does here. */
|
||||||
|
|
@ -577,7 +591,7 @@ printstr (fmt, string, len, fieldwidth, precision)
|
||||||
#else
|
#else
|
||||||
if (string == 0 || len == 0)
|
if (string == 0 || len == 0)
|
||||||
#endif
|
#endif
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
s = fmt;
|
s = fmt;
|
||||||
|
|
@ -835,7 +849,7 @@ vbadd (buf, blen)
|
||||||
|
|
||||||
if (blen == 1)
|
if (blen == 1)
|
||||||
vbuf[vblen++] = buf[0];
|
vbuf[vblen++] = buf[0];
|
||||||
else
|
else if (blen > 1)
|
||||||
{
|
{
|
||||||
FASTCOPY (buf, vbuf + vblen, blen);
|
FASTCOPY (buf, vbuf + vblen, blen);
|
||||||
vblen += blen;
|
vblen += blen;
|
||||||
|
|
@ -850,6 +864,42 @@ vbadd (buf, blen)
|
||||||
return vbuf;
|
return vbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
#if defined (PREFER_STDARG)
|
||||||
|
vbprintf (const char *format, ...)
|
||||||
|
#else
|
||||||
|
vbprintf (format, va_alist)
|
||||||
|
const char *format;
|
||||||
|
va_dcl
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
size_t nlen;
|
||||||
|
int blen;
|
||||||
|
|
||||||
|
SH_VA_START (args, format);
|
||||||
|
blen = vsnprintf (vbuf + vblen, vbsize - vblen, format, args);
|
||||||
|
|
||||||
|
nlen = vblen + blen + 1;
|
||||||
|
if (nlen >= vbsize)
|
||||||
|
{
|
||||||
|
vbsize = ((nlen + 63) >> 6) << 6;
|
||||||
|
vbuf = (char *)xrealloc (vbuf, vbsize);
|
||||||
|
blen = vsnprintf (vbuf + vblen, vbsize - vblen, format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
va_end (args);
|
||||||
|
vblen += blen;
|
||||||
|
vbuf[vblen] = '\0';
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (strlen (vbuf) != vblen)
|
||||||
|
internal_error ("printf:vbadd: vblen (%d) != strlen (vbuf) (%d)", vblen, (int)strlen (vbuf));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (blen);
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
mklong (str, modifiers, mlen)
|
mklong (str, modifiers, mlen)
|
||||||
char *str;
|
char *str;
|
||||||
|
|
@ -1014,12 +1064,28 @@ getfloatmax ()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NO check is needed for garglist here. */
|
/* NO check is needed for garglist here. */
|
||||||
static int
|
static intmax_t
|
||||||
asciicode ()
|
asciicode ()
|
||||||
{
|
{
|
||||||
register int ch;
|
register intmax_t ch;
|
||||||
|
#if defined (HANDLE_MULTIBYTE)
|
||||||
|
wchar_t wc;
|
||||||
|
size_t mblength, slen;
|
||||||
|
#endif
|
||||||
|
DECLARE_MBSTATE;
|
||||||
|
|
||||||
|
#if defined (HANDLE_MULTIBYTE)
|
||||||
|
slen = strlen (garglist->word->word+1);
|
||||||
|
mblength = MBLEN (garglist->word->word+1, slen);
|
||||||
|
if (mblength > 1)
|
||||||
|
{
|
||||||
|
mblength = mbtowc (&wc, garglist->word->word+1, slen);
|
||||||
|
ch = wc; /* XXX */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
ch = (unsigned char)garglist->word->word[1];
|
||||||
|
|
||||||
ch = garglist->word->word[1];
|
|
||||||
garglist = garglist->next;
|
garglist = garglist->next;
|
||||||
return (ch);
|
return (ch);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,19 +4,19 @@
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it
|
Bash is free software: you can redistribute it and/or modify
|
||||||
under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT
|
Bash is distributed in the hope that it will be useful,
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Bash; see the file COPYING. If not, write to the Free
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
/* Write output in 128-byte chunks until we get a sigpipe or write gets an
|
/* Write output in 128-byte chunks until we get a sigpipe or write gets an
|
||||||
EPIPE. Then report how many bytes we wrote. We assume that this is the
|
EPIPE. Then report how many bytes we wrote. We assume that this is the
|
||||||
|
|
|
||||||
|
|
@ -1,94 +1,114 @@
|
||||||
This file is pushd.def, from which is created pushd.c. It implements the
|
This file is pushd.def, from which is created pushd.c. It implements the
|
||||||
builtins "pushd", "popd", and "dirs" in Bash.
|
builtins "pushd", "popd", and "dirs" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2004 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES pushd.c
|
$PRODUCES pushd.c
|
||||||
|
|
||||||
$BUILTIN pushd
|
$BUILTIN pushd
|
||||||
$FUNCTION pushd_builtin
|
$FUNCTION pushd_builtin
|
||||||
$DEPENDS_ON PUSHD_AND_POPD
|
$DEPENDS_ON PUSHD_AND_POPD
|
||||||
$SHORT_DOC pushd [dir | +N | -N] [-n]
|
$SHORT_DOC pushd [-n] [+N | -N | dir]
|
||||||
|
Add directories to stack.
|
||||||
|
|
||||||
Adds a directory to the top of the directory stack, or rotates
|
Adds a directory to the top of the directory stack, or rotates
|
||||||
the stack, making the new top of the stack the current working
|
the stack, making the new top of the stack the current working
|
||||||
directory. With no arguments, exchanges the top two directories.
|
directory. With no arguments, exchanges the top two directories.
|
||||||
|
|
||||||
+N Rotates the stack so that the Nth directory (counting
|
Options:
|
||||||
|
-n Suppresses the normal change of directory when adding
|
||||||
|
directories to the stack, so only the stack is manipulated.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
+N Rotates the stack so that the Nth directory (counting
|
||||||
from the left of the list shown by `dirs', starting with
|
from the left of the list shown by `dirs', starting with
|
||||||
zero) is at the top.
|
zero) is at the top.
|
||||||
|
|
||||||
-N Rotates the stack so that the Nth directory (counting
|
-N Rotates the stack so that the Nth directory (counting
|
||||||
from the right of the list shown by `dirs', starting with
|
from the right of the list shown by `dirs', starting with
|
||||||
zero) is at the top.
|
zero) is at the top.
|
||||||
|
|
||||||
-n suppress the normal change of directory when adding directories
|
dir Adds DIR to the directory stack at the top, making it the
|
||||||
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.
|
new current working directory.
|
||||||
|
|
||||||
You can see the directory stack with the `dirs' command.
|
The `dirs' builtin displays the directory stack.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid argument is supplied or the directory
|
||||||
|
change fails.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN popd
|
$BUILTIN popd
|
||||||
$FUNCTION popd_builtin
|
$FUNCTION popd_builtin
|
||||||
$DEPENDS_ON PUSHD_AND_POPD
|
$DEPENDS_ON PUSHD_AND_POPD
|
||||||
$SHORT_DOC popd [+N | -N] [-n]
|
$SHORT_DOC popd [-n] [+N | -N]
|
||||||
Removes entries from the directory stack. With no arguments,
|
Remove directories from stack.
|
||||||
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
|
Removes entries from the directory stack. With no arguments, removes
|
||||||
|
the top directory from the stack, and changes to the new top directory.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-n Suppresses the normal change of directory when removing
|
||||||
|
directories from the stack, so only the stack is manipulated.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
+N Removes the Nth entry counting from the left of the list
|
||||||
shown by `dirs', starting with zero. For example: `popd +0'
|
shown by `dirs', starting with zero. For example: `popd +0'
|
||||||
removes the first directory, `popd +1' the second.
|
removes the first directory, `popd +1' the second.
|
||||||
|
|
||||||
-N removes the Nth entry counting from the right of the list
|
-N Removes the Nth entry counting from the right of the list
|
||||||
shown by `dirs', starting with zero. For example: `popd -0'
|
shown by `dirs', starting with zero. For example: `popd -0'
|
||||||
removes the last directory, `popd -1' the next to last.
|
removes the last directory, `popd -1' the next to last.
|
||||||
|
|
||||||
-n suppress the normal change of directory when removing directories
|
The `dirs' builtin displays the directory stack.
|
||||||
from the stack, so only the stack is manipulated.
|
|
||||||
|
|
||||||
You can see the directory stack with the `dirs' command.
|
Exit Status:
|
||||||
|
Returns success unless an invalid argument is supplied or the directory
|
||||||
|
change fails.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN dirs
|
$BUILTIN dirs
|
||||||
$FUNCTION dirs_builtin
|
$FUNCTION dirs_builtin
|
||||||
$DEPENDS_ON PUSHD_AND_POPD
|
$DEPENDS_ON PUSHD_AND_POPD
|
||||||
$SHORT_DOC dirs [-clpv] [+N] [-N]
|
$SHORT_DOC dirs [-clpv] [+N] [-N]
|
||||||
|
Display directory stack.
|
||||||
|
|
||||||
Display the list of currently remembered directories. Directories
|
Display the list of currently remembered directories. Directories
|
||||||
find their way onto the list with the `pushd' command; you can get
|
find their way onto the list with the `pushd' command; you can get
|
||||||
back up through the list with the `popd' command.
|
back up through the list with the `popd' command.
|
||||||
|
|
||||||
The -l flag specifies that `dirs' should not print shorthand versions
|
Options:
|
||||||
of directories which are relative to your home directory. This means
|
-c clear the directory stack by deleting all of the elements
|
||||||
that `~/bin' might be displayed as `/homes/bfox/bin'. The -v flag
|
-l do not print tilde-prefixed versions of directories relative
|
||||||
causes `dirs' to print the directory stack with one entry per line,
|
to your home directory
|
||||||
prepending the directory name with its position in the stack. The -p
|
-p print the directory stack with one entry per line
|
||||||
flag does the same thing, but the stack position is not prepended.
|
-v print the directory stack with one entry per line prefixed
|
||||||
The -c flag clears the directory stack by deleting all of the elements.
|
with its position in the stack
|
||||||
|
|
||||||
+N displays the Nth entry counting from the left of the list shown by
|
Arguments:
|
||||||
|
+N Displays the Nth entry counting from the left of the list shown by
|
||||||
dirs when invoked without options, starting with zero.
|
dirs when invoked without options, starting with zero.
|
||||||
|
|
||||||
-N displays the Nth entry counting from the right of the list shown by
|
-N Displays the Nth entry counting from the right of the list shown by
|
||||||
dirs when invoked without options, starting with zero.
|
dirs when invoked without options, starting with zero.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is supplied or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -448,7 +468,7 @@ dirs_builtin (list)
|
||||||
if (index_flag)
|
if (index_flag)
|
||||||
{
|
{
|
||||||
putchar ('\n');
|
putchar ('\n');
|
||||||
return EXECUTION_SUCCESS;
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -473,8 +493,8 @@ dirs_builtin (list)
|
||||||
printf ("%s%s", (vflag & 1) ? "\n" : " ", DIRSTACK_ENTRY (i));
|
printf ("%s%s", (vflag & 1) ? "\n" : " ", DIRSTACK_ENTRY (i));
|
||||||
|
|
||||||
putchar ('\n');
|
putchar ('\n');
|
||||||
fflush (stdout);
|
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -483,9 +503,9 @@ pushd_error (offset, arg)
|
||||||
char *arg;
|
char *arg;
|
||||||
{
|
{
|
||||||
if (offset == 0)
|
if (offset == 0)
|
||||||
builtin_error ("directory stack empty");
|
builtin_error (_("directory stack empty"));
|
||||||
else
|
else
|
||||||
sh_erange (arg, "directory stack index");
|
sh_erange (arg, _("directory stack index"));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -660,66 +680,70 @@ get_directory_stack (flags)
|
||||||
|
|
||||||
#ifdef LOADABLE_BUILTIN
|
#ifdef LOADABLE_BUILTIN
|
||||||
char * const dirs_doc[] = {
|
char * const dirs_doc[] = {
|
||||||
N_("Display the list of currently remembered directories. Directories"),
|
N_("Display the list of currently remembered directories. Directories\n\
|
||||||
N_("find their way onto the list with the `pushd' command; you can get"),
|
find their way onto the list with the `pushd' command; you can get\n\
|
||||||
N_("back up through the list with the `popd' command."),
|
back up through the list with the `popd' command.\n\
|
||||||
N_(" "),
|
\n\
|
||||||
N_("The -l flag specifies that `dirs' should not print shorthand versions"),
|
Options:\n\
|
||||||
N_("of directories which are relative to your home directory. This means"),
|
-c clear the directory stack by deleting all of the elements\n\
|
||||||
N_("that `~/bin' might be displayed as `/homes/bfox/bin'. The -v flag"),
|
-l do not print tilde-prefixed versions of directories relative\n\
|
||||||
N_("causes `dirs' to print the directory stack with one entry per line,"),
|
to your home directory\n\
|
||||||
N_("prepending the directory name with its position in the stack. The -p"),
|
-p print the directory stack with one entry per line\n\
|
||||||
N_("flag does the same thing, but the stack position is not prepended."),
|
-v print the directory stack with one entry per line prefixed\n\
|
||||||
N_("The -c flag clears the directory stack by deleting all of the elements."),
|
with its position in the stack\n\
|
||||||
N_(" "),
|
\n\
|
||||||
N_("+N displays the Nth entry counting from the left of the list shown by"),
|
Arguments:\n\
|
||||||
N_(" dirs when invoked without options, starting with zero."),
|
+N Displays the Nth entry counting from the left of the list shown by\n\
|
||||||
N_(" "),
|
dirs when invoked without options, starting with zero.\n\
|
||||||
N_("-N displays the Nth entry counting from the right of the list shown by"),
|
\n\
|
||||||
N_(" dirs when invoked without options, starting with zero."),
|
-N Displays the Nth entry counting from the right of the list shown by\n\
|
||||||
|
dirs when invoked without options, starting with zero."),
|
||||||
(char *)NULL
|
(char *)NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
char * const pushd_doc[] = {
|
char * const pushd_doc[] = {
|
||||||
N_("Adds a directory to the top of the directory stack, or rotates"),
|
N_("Adds a directory to the top of the directory stack, or rotates\n\
|
||||||
N_("the stack, making the new top of the stack the current working"),
|
the stack, making the new top of the stack the current working\n\
|
||||||
N_("directory. With no arguments, exchanges the top two directories."),
|
directory. With no arguments, exchanges the top two directories.\n\
|
||||||
N_(" "),
|
\n\
|
||||||
N_("+N Rotates the stack so that the Nth directory (counting"),
|
Options:\n\
|
||||||
N_(" from the left of the list shown by `dirs', starting with"),
|
-n Suppresses the normal change of directory when adding\n\
|
||||||
N_(" zero) is at the top."),
|
directories to the stack, so only the stack is manipulated.\n\
|
||||||
N_(" "),
|
\n\
|
||||||
N_("-N Rotates the stack so that the Nth directory (counting"),
|
Arguments:\n\
|
||||||
N_(" from the right of the list shown by `dirs', starting with"),
|
+N Rotates the stack so that the Nth directory (counting\n\
|
||||||
N_(" zero) is at the top."),
|
from the left of the list shown by `dirs', starting with\n\
|
||||||
N_(" "),
|
zero) is at the top.\n\
|
||||||
N_("-n suppress the normal change of directory when adding directories"),
|
\n\
|
||||||
N_(" to the stack, so only the stack is manipulated."),
|
-N Rotates the stack so that the Nth directory (counting\n\
|
||||||
N_(" "),
|
from the right of the list shown by `dirs', starting with\n\
|
||||||
N_("dir adds DIR to the directory stack at the top, making it the"),
|
zero) is at the top.\n\
|
||||||
N_(" new current working directory."),
|
\n\
|
||||||
N_(" "),
|
dir Adds DIR to the directory stack at the top, making it the\n\
|
||||||
N_("You can see the directory stack with the `dirs' command."),
|
new current working directory.\n\
|
||||||
|
\n\
|
||||||
|
The `dirs' builtin displays the directory stack."),
|
||||||
(char *)NULL
|
(char *)NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
char * const popd_doc[] = {
|
char * const popd_doc[] = {
|
||||||
N_("Removes entries from the directory stack. With no arguments,"),
|
N_("Removes entries from the directory stack. With no arguments, removes\n\
|
||||||
N_("removes the top directory from the stack, and cd's to the new"),
|
the top directory from the stack, and changes to the new top directory.\n\
|
||||||
N_("top directory."),
|
\n\
|
||||||
N_(" "),
|
Options:\n\
|
||||||
N_("+N removes the Nth entry counting from the left of the list"),
|
-n Suppresses the normal change of directory when removing\n\
|
||||||
N_(" shown by `dirs', starting with zero. For example: `popd +0'"),
|
directories from the stack, so only the stack is manipulated.\n\
|
||||||
N_(" removes the first directory, `popd +1' the second."),
|
\n\
|
||||||
N_(" "),
|
Arguments:\n\
|
||||||
N_("-N removes the Nth entry counting from the right of the list"),
|
+N Removes the Nth entry counting from the left of the list\n\
|
||||||
N_(" shown by `dirs', starting with zero. For example: `popd -0'"),
|
shown by `dirs', starting with zero. For example: `popd +0'\n\
|
||||||
N_(" removes the last directory, `popd -1' the next to last."),
|
removes the first directory, `popd +1' the second.\n\
|
||||||
N_(" "),
|
\n\
|
||||||
N_("-n suppress the normal change of directory when removing directories"),
|
-N Removes the Nth entry counting from the right of the list\n\
|
||||||
N_(" from the stack, so only the stack is manipulated."),
|
shown by `dirs', starting with zero. For example: `popd -0'\n\
|
||||||
N_(" "),
|
removes the last directory, `popd -1' the next to last.\n\
|
||||||
N_("You can see the directory stack with the `dirs' command."),
|
\n\
|
||||||
|
The `dirs' builtin displays the directory stack."),
|
||||||
(char *)NULL
|
(char *)NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,50 +1,63 @@
|
||||||
This file is read.def, from which is created read.c.
|
This file is read.def, from which is created read.c.
|
||||||
It implements the builtin "read" in Bash.
|
It implements the builtin "read" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES read.c
|
$PRODUCES read.c
|
||||||
|
|
||||||
$BUILTIN read
|
$BUILTIN read
|
||||||
$FUNCTION read_builtin
|
$FUNCTION read_builtin
|
||||||
$SHORT_DOC read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...]
|
$SHORT_DOC read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
|
||||||
One line is read from the standard input, or from file descriptor FD if the
|
Read a line from the standard input and split it into fields.
|
||||||
-u option is supplied, and the first word is assigned to the first NAME,
|
|
||||||
the second word to the second NAME, and so on, with leftover words assigned
|
|
||||||
to the last NAME. Only the characters found in $IFS are recognized as word
|
|
||||||
delimiters. If no NAMEs are supplied, the line read is stored in the REPLY
|
|
||||||
variable. If the -r option is given, this signifies `raw' input, and
|
|
||||||
backslash escaping is disabled. The -d option causes read to continue
|
|
||||||
until the first character of DELIM is read, rather than newline. If the -p
|
|
||||||
option is supplied, the string PROMPT is output without a trailing newline
|
|
||||||
before attempting to read. If -a is supplied, the words read are assigned
|
|
||||||
to sequential indices of ARRAY, starting at zero. If -e is supplied and
|
|
||||||
the shell is interactive, readline is used to obtain the line. If -n is
|
|
||||||
supplied with a non-zero NCHARS argument, read returns after NCHARS
|
|
||||||
characters have been read. The -s option causes input coming from a
|
|
||||||
terminal to not be echoed.
|
|
||||||
|
|
||||||
The -t option causes read to time out and return failure if a complete line
|
Reads a single line from the standard input, or from file descriptor FD
|
||||||
of input is not read within TIMEOUT seconds. If the TMOUT variable is set,
|
if the -u option is supplied. The line is split into fields as with word
|
||||||
its value is the default timeout. The return code is zero, unless end-of-file
|
splitting, and the first word is assigned to the first NAME, the second
|
||||||
is encountered, read times out, or an invalid file descriptor is supplied as
|
word to the second NAME, and so on, with any leftover words assigned to
|
||||||
the argument to -u.
|
the last NAME. Only the characters found in $IFS are recognized as word
|
||||||
|
delimiters.
|
||||||
|
|
||||||
|
If no NAMEs are supplied, the line read is stored in the REPLY variable.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-a array assign the words read to sequential indices of the array
|
||||||
|
variable ARRAY, starting at zero
|
||||||
|
-d delim continue until the first character of DELIM is read, rather
|
||||||
|
than newline
|
||||||
|
-e use Readline to obtain the line in an interactive shell
|
||||||
|
-i text Use TEXT as the initial text for Readline
|
||||||
|
-n nchars return after reading NCHARS characters rather than waiting
|
||||||
|
for a newline
|
||||||
|
-p prompt output the string PROMPT without a trailing newline before
|
||||||
|
attempting to read
|
||||||
|
-r do not allow backslashes to escape any characters
|
||||||
|
-s do not echo input coming from a terminal
|
||||||
|
-t timeout time out and return failure if a complete line of input is
|
||||||
|
not read withint TIMEOUT seconds. The value of the TMOUT
|
||||||
|
variable is the default timeout. TIMEOUT may be a
|
||||||
|
fractional number. If TIMEOUT is 0, read returns success only
|
||||||
|
if input is available on the specified file descriptor. The
|
||||||
|
exit status is greater than 128 if the timeout is exceeded
|
||||||
|
-u fd read from file descriptor FD instead of the standard input
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
The return code is zero, unless end-of-file is encountered, read times out,
|
||||||
|
or an invalid file descriptor is supplied as the argument to -u.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -54,6 +67,8 @@ $END
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "bashansi.h"
|
||||||
|
|
||||||
#if defined (HAVE_UNISTD_H)
|
#if defined (HAVE_UNISTD_H)
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -87,13 +102,24 @@ $END
|
||||||
extern int errno;
|
extern int errno;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct ttsave
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
TTYSTRUCT *attrs;
|
||||||
|
};
|
||||||
|
|
||||||
#if defined (READLINE)
|
#if defined (READLINE)
|
||||||
static void reset_attempted_completion_function __P((char *));
|
static void reset_attempted_completion_function __P((char *));
|
||||||
static char *edit_line __P((char *));
|
static int set_itext __P((void));
|
||||||
|
static char *edit_line __P((char *, char *));
|
||||||
static void set_eol_delim __P((int));
|
static void set_eol_delim __P((int));
|
||||||
static void reset_eol_delim __P((char *));
|
static void reset_eol_delim __P((char *));
|
||||||
#endif
|
#endif
|
||||||
static SHELL_VAR *bind_read_variable __P((char *, char *));
|
static SHELL_VAR *bind_read_variable __P((char *, char *));
|
||||||
|
#if defined (HANDLE_MULTIBYTE)
|
||||||
|
static int read_mbchar __P((int, char *, int, int, int));
|
||||||
|
#endif
|
||||||
|
static void ttyrestore __P((struct ttsave *));
|
||||||
|
|
||||||
static sighandler sigalrm __P((int));
|
static sighandler sigalrm __P((int));
|
||||||
static void reset_alarm __P((void));
|
static void reset_alarm __P((void));
|
||||||
|
|
@ -113,7 +139,7 @@ static void
|
||||||
reset_alarm ()
|
reset_alarm ()
|
||||||
{
|
{
|
||||||
set_signal_handler (SIGALRM, old_alrm);
|
set_signal_handler (SIGALRM, old_alrm);
|
||||||
alarm (0);
|
falarm (0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read the value of the shell variables whose names follow.
|
/* Read the value of the shell variables whose names follow.
|
||||||
|
|
@ -130,18 +156,21 @@ read_builtin (list)
|
||||||
int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
|
int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
|
||||||
int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
|
int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
|
||||||
int raw, edit, nchars, silent, have_timeout, fd;
|
int raw, edit, nchars, silent, have_timeout, fd;
|
||||||
unsigned int tmout;
|
unsigned int tmsec, tmusec;
|
||||||
|
long ival, uval;
|
||||||
intmax_t intval;
|
intmax_t intval;
|
||||||
char c;
|
char c;
|
||||||
char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
|
char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
|
||||||
char *e, *t, *t1, *ps2, *tofree;
|
char *e, *t, *t1, *ps2, *tofree;
|
||||||
struct stat tsb;
|
struct stat tsb;
|
||||||
SHELL_VAR *var;
|
SHELL_VAR *var;
|
||||||
|
TTYSTRUCT ttattrs, ttset;
|
||||||
|
struct ttsave termsave;
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
WORD_LIST *alist;
|
WORD_LIST *alist;
|
||||||
#endif
|
#endif
|
||||||
#if defined (READLINE)
|
#if defined (READLINE)
|
||||||
char *rlbuf;
|
char *rlbuf, *itext;
|
||||||
int rlind;
|
int rlind;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -153,7 +182,8 @@ read_builtin (list)
|
||||||
USE_VAR(input_is_pipe);
|
USE_VAR(input_is_pipe);
|
||||||
/* USE_VAR(raw); */
|
/* USE_VAR(raw); */
|
||||||
USE_VAR(edit);
|
USE_VAR(edit);
|
||||||
USE_VAR(tmout);
|
USE_VAR(tmsec);
|
||||||
|
USE_VAR(tmusec);
|
||||||
USE_VAR(nchars);
|
USE_VAR(nchars);
|
||||||
USE_VAR(silent);
|
USE_VAR(silent);
|
||||||
USE_VAR(ifs_chars);
|
USE_VAR(ifs_chars);
|
||||||
|
|
@ -162,6 +192,7 @@ read_builtin (list)
|
||||||
#if defined (READLINE)
|
#if defined (READLINE)
|
||||||
USE_VAR(rlbuf);
|
USE_VAR(rlbuf);
|
||||||
USE_VAR(rlind);
|
USE_VAR(rlind);
|
||||||
|
USE_VAR(itext);
|
||||||
#endif
|
#endif
|
||||||
USE_VAR(list);
|
USE_VAR(list);
|
||||||
USE_VAR(ps2);
|
USE_VAR(ps2);
|
||||||
|
|
@ -173,16 +204,16 @@ read_builtin (list)
|
||||||
fd = 0; /* file descriptor to read from */
|
fd = 0; /* file descriptor to read from */
|
||||||
|
|
||||||
#if defined (READLINE)
|
#if defined (READLINE)
|
||||||
rlbuf = (char *)0;
|
rlbuf = itext = (char *)0;
|
||||||
rlind = 0;
|
rlind = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
tmout = 0; /* no timeout */
|
tmsec = tmusec = 0; /* no timeout */
|
||||||
nr = nchars = input_is_tty = input_is_pipe = unbuffered_read = have_timeout = 0;
|
nr = nchars = input_is_tty = input_is_pipe = unbuffered_read = have_timeout = 0;
|
||||||
delim = '\n'; /* read until newline */
|
delim = '\n'; /* read until newline */
|
||||||
|
|
||||||
reset_internal_getopt ();
|
reset_internal_getopt ();
|
||||||
while ((opt = internal_getopt (list, "ersa:d:n:p:t:u:")) != -1)
|
while ((opt = internal_getopt (list, "ersa:d:i:n:p:t:u:")) != -1)
|
||||||
{
|
{
|
||||||
switch (opt)
|
switch (opt)
|
||||||
{
|
{
|
||||||
|
|
@ -198,6 +229,11 @@ read_builtin (list)
|
||||||
case 'e':
|
case 'e':
|
||||||
#if defined (READLINE)
|
#if defined (READLINE)
|
||||||
edit = 1;
|
edit = 1;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
#if defined (READLINE)
|
||||||
|
itext = list_optarg;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
|
|
@ -206,8 +242,8 @@ read_builtin (list)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 't':
|
case 't':
|
||||||
code = legal_number (list_optarg, &intval);
|
code = uconvert (list_optarg, &ival, &uval);
|
||||||
if (code == 0 || intval < 0 || intval != (unsigned int)intval)
|
if (code == 0 || ival < 0 || uval < 0)
|
||||||
{
|
{
|
||||||
builtin_error (_("%s: invalid timeout specification"), list_optarg);
|
builtin_error (_("%s: invalid timeout specification"), list_optarg);
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
|
|
@ -215,7 +251,8 @@ read_builtin (list)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
have_timeout = 1;
|
have_timeout = 1;
|
||||||
tmout = intval;
|
tmsec = ival;
|
||||||
|
tmusec = uval;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
|
|
@ -256,24 +293,34 @@ read_builtin (list)
|
||||||
/* `read -t 0 var' returns failure immediately. XXX - should it test
|
/* `read -t 0 var' returns failure immediately. XXX - should it test
|
||||||
whether input is available with select/FIONREAD, and fail if those
|
whether input is available with select/FIONREAD, and fail if those
|
||||||
are unavailable? */
|
are unavailable? */
|
||||||
if (have_timeout && tmout == 0)
|
if (have_timeout && tmsec == 0 && tmusec == 0)
|
||||||
|
#if 0
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
|
#else
|
||||||
|
return (input_avail (fd) ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* IF IFS is unset, we use the default of " \t\n". */
|
/* IF IFS is unset, we use the default of " \t\n". */
|
||||||
ifs_chars = getifs ();
|
ifs_chars = getifs ();
|
||||||
if (ifs_chars == 0) /* XXX - shouldn't happen */
|
if (ifs_chars == 0) /* XXX - shouldn't happen */
|
||||||
ifs_chars = "";
|
ifs_chars = "";
|
||||||
|
for (skip_ctlesc = skip_ctlnul = 0, e = ifs_chars; *e; e++)
|
||||||
|
skip_ctlesc |= *e == CTLESC, skip_ctlnul |= *e == CTLNUL;
|
||||||
|
|
||||||
input_string = (char *)xmalloc (size = 112); /* XXX was 128 */
|
input_string = (char *)xmalloc (size = 112); /* XXX was 128 */
|
||||||
|
input_string[0] = '\0';
|
||||||
|
|
||||||
/* $TMOUT, if set, is the default timeout for read. */
|
/* $TMOUT, if set, is the default timeout for read. */
|
||||||
if (have_timeout == 0 && (e = get_string_value ("TMOUT")))
|
if (have_timeout == 0 && (e = get_string_value ("TMOUT")))
|
||||||
{
|
{
|
||||||
code = legal_number (e, &intval);
|
code = uconvert (e, &ival, &uval);
|
||||||
if (code == 0 || intval < 0 || intval != (unsigned int)intval)
|
if (code == 0 || ival < 0 || uval < 0)
|
||||||
tmout = 0;
|
tmsec = tmusec = 0;
|
||||||
else
|
else
|
||||||
tmout = intval;
|
{
|
||||||
|
tmsec = ival;
|
||||||
|
tmusec = uval;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
begin_unwind_frame ("read_builtin");
|
begin_unwind_frame ("read_builtin");
|
||||||
|
|
@ -296,6 +343,9 @@ read_builtin (list)
|
||||||
if ((prompt || edit || silent) && input_is_tty == 0)
|
if ((prompt || edit || silent) && input_is_tty == 0)
|
||||||
{
|
{
|
||||||
prompt = (char *)NULL;
|
prompt = (char *)NULL;
|
||||||
|
#if defined (READLINE)
|
||||||
|
itext = (char *)NULL;
|
||||||
|
#endif
|
||||||
edit = silent = 0;
|
edit = silent = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -304,30 +354,30 @@ read_builtin (list)
|
||||||
add_unwind_protect (xfree, rlbuf);
|
add_unwind_protect (xfree, rlbuf);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (prompt && edit == 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "%s", prompt);
|
|
||||||
fflush (stderr);
|
|
||||||
}
|
|
||||||
|
|
||||||
pass_next = 0; /* Non-zero signifies last char was backslash. */
|
pass_next = 0; /* Non-zero signifies last char was backslash. */
|
||||||
saw_escape = 0; /* Non-zero signifies that we saw an escape char */
|
saw_escape = 0; /* Non-zero signifies that we saw an escape char */
|
||||||
|
|
||||||
if (tmout > 0)
|
if (tmsec > 0 || tmusec > 0)
|
||||||
{
|
{
|
||||||
/* Turn off the timeout if stdin is a regular file (e.g. from
|
/* Turn off the timeout if stdin is a regular file (e.g. from
|
||||||
input redirection). */
|
input redirection). */
|
||||||
if ((fstat (fd, &tsb) < 0) || S_ISREG (tsb.st_mode))
|
if ((fstat (fd, &tsb) < 0) || S_ISREG (tsb.st_mode))
|
||||||
tmout = 0;
|
tmsec = tmusec = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tmout > 0)
|
if (tmsec > 0 || tmusec > 0)
|
||||||
{
|
{
|
||||||
code = setjmp (alrmbuf);
|
code = setjmp (alrmbuf);
|
||||||
if (code)
|
if (code)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
run_unwind_frame ("read_builtin");
|
run_unwind_frame ("read_builtin");
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
|
#else
|
||||||
|
input_string[i] = '\0'; /* make sure it's terminated */
|
||||||
|
retval = 128+SIGALRM;;
|
||||||
|
goto assign_vars;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
old_alrm = set_signal_handler (SIGALRM, sigalrm);
|
old_alrm = set_signal_handler (SIGALRM, sigalrm);
|
||||||
add_unwind_protect (reset_alarm, (char *)NULL);
|
add_unwind_protect (reset_alarm, (char *)NULL);
|
||||||
|
|
@ -335,7 +385,7 @@ read_builtin (list)
|
||||||
if (edit)
|
if (edit)
|
||||||
add_unwind_protect (reset_attempted_completion_function, (char *)NULL);
|
add_unwind_protect (reset_attempted_completion_function, (char *)NULL);
|
||||||
#endif
|
#endif
|
||||||
alarm (tmout);
|
falarm (tmsec, tmusec);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we've been asked to read only NCHARS chars, or we're using some
|
/* If we've been asked to read only NCHARS chars, or we're using some
|
||||||
|
|
@ -361,29 +411,46 @@ read_builtin (list)
|
||||||
#endif
|
#endif
|
||||||
if (input_is_tty)
|
if (input_is_tty)
|
||||||
{
|
{
|
||||||
ttsave ();
|
/* ttsave() */
|
||||||
|
termsave.fd = fd;
|
||||||
|
ttgetattr (fd, &ttattrs);
|
||||||
|
termsave.attrs = &ttattrs;
|
||||||
|
|
||||||
|
ttset = ttattrs;
|
||||||
if (silent)
|
if (silent)
|
||||||
ttcbreak ();
|
ttfd_cbreak (fd, &ttset); /* ttcbreak () */
|
||||||
else
|
else
|
||||||
ttonechar ();
|
ttfd_onechar (fd, &ttset); /* ttonechar () */
|
||||||
add_unwind_protect ((Function *)ttrestore, (char *)NULL);
|
add_unwind_protect ((Function *)ttyrestore, (char *)&termsave);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (silent) /* turn off echo but leave term in canonical mode */
|
else if (silent) /* turn off echo but leave term in canonical mode */
|
||||||
{
|
{
|
||||||
ttsave ();
|
/* ttsave (); */
|
||||||
ttnoecho ();
|
termsave.fd = fd;
|
||||||
add_unwind_protect ((Function *)ttrestore, (char *)NULL);
|
ttgetattr (fd, &ttattrs);
|
||||||
|
termsave.attrs = &ttattrs;
|
||||||
|
|
||||||
|
ttset = ttattrs;
|
||||||
|
ttfd_noecho (fd, &ttset); /* ttnoecho (); */
|
||||||
|
|
||||||
|
add_unwind_protect ((Function *)ttyrestore, (char *)&termsave);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This *must* be the top unwind-protect on the stack, so the manipulation
|
/* This *must* be the top unwind-protect on the stack, so the manipulation
|
||||||
of the unwind-protect stack after the realloc() works right. */
|
of the unwind-protect stack after the realloc() works right. */
|
||||||
add_unwind_protect (xfree, input_string);
|
add_unwind_protect (xfree, input_string);
|
||||||
interrupt_immediately++;
|
interrupt_immediately++;
|
||||||
terminate_immediately = 1;
|
terminate_immediately++;
|
||||||
|
|
||||||
unbuffered_read = (nchars > 0) || (delim != '\n') || input_is_pipe;
|
unbuffered_read = (nchars > 0) || (delim != '\n') || input_is_pipe;
|
||||||
|
|
||||||
|
if (prompt && edit == 0)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "%s", prompt);
|
||||||
|
fflush (stderr);
|
||||||
|
}
|
||||||
|
|
||||||
#if defined (__CYGWIN__) && defined (O_TEXT)
|
#if defined (__CYGWIN__) && defined (O_TEXT)
|
||||||
setmode (0, O_TEXT);
|
setmode (0, O_TEXT);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -401,7 +468,7 @@ read_builtin (list)
|
||||||
}
|
}
|
||||||
if (rlbuf == 0)
|
if (rlbuf == 0)
|
||||||
{
|
{
|
||||||
rlbuf = edit_line (prompt ? prompt : "");
|
rlbuf = edit_line (prompt ? prompt : "", itext);
|
||||||
rlind = 0;
|
rlind = 0;
|
||||||
}
|
}
|
||||||
if (rlbuf == 0)
|
if (rlbuf == 0)
|
||||||
|
|
@ -439,7 +506,7 @@ read_builtin (list)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (i + 2 >= size)
|
if (i + 4 >= size) /* XXX was i + 2; use i + 4 for multibyte/read_mbchar */
|
||||||
{
|
{
|
||||||
input_string = (char *)xrealloc (input_string, size += 128);
|
input_string = (char *)xrealloc (input_string, size += 128);
|
||||||
remove_unwind_protect ();
|
remove_unwind_protect ();
|
||||||
|
|
@ -462,18 +529,22 @@ read_builtin (list)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This may cause problems if IFS contains CTLESC */
|
||||||
if (c == '\\' && raw == 0)
|
if (c == '\\' && raw == 0)
|
||||||
{
|
{
|
||||||
pass_next++;
|
pass_next++;
|
||||||
|
if (skip_ctlesc == 0)
|
||||||
|
{
|
||||||
saw_escape++;
|
saw_escape++;
|
||||||
input_string[i++] = CTLESC;
|
input_string[i++] = CTLESC;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((unsigned char)c == delim)
|
if ((unsigned char)c == delim)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (c == CTLESC || c == CTLNUL)
|
if ((skip_ctlesc == 0 && c == CTLESC) || (skip_ctlnul == 0 && c == CTLNUL))
|
||||||
{
|
{
|
||||||
saw_escape++;
|
saw_escape++;
|
||||||
input_string[i++] = CTLESC;
|
input_string[i++] = CTLESC;
|
||||||
|
|
@ -481,6 +552,15 @@ read_builtin (list)
|
||||||
|
|
||||||
add_char:
|
add_char:
|
||||||
input_string[i++] = c;
|
input_string[i++] = c;
|
||||||
|
|
||||||
|
#if defined (HANDLE_MULTIBYTE)
|
||||||
|
if (nchars > 0 && MB_CUR_MAX > 1)
|
||||||
|
{
|
||||||
|
input_string[i] = '\0'; /* for simplicity and debugging */
|
||||||
|
i += read_mbchar (fd, input_string, i, c, unbuffered_read);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
nr++;
|
nr++;
|
||||||
|
|
||||||
if (nchars > 0 && nr >= nchars)
|
if (nchars > 0 && nr >= nchars)
|
||||||
|
|
@ -497,7 +577,7 @@ add_char:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (tmout > 0)
|
if (tmsec > 0 || tmusec > 0)
|
||||||
reset_alarm ();
|
reset_alarm ();
|
||||||
|
|
||||||
if (nchars > 0 || delim != '\n')
|
if (nchars > 0 || delim != '\n')
|
||||||
|
|
@ -513,20 +593,22 @@ add_char:
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if (input_is_tty)
|
if (input_is_tty)
|
||||||
ttrestore ();
|
ttyrestore (&termsave);
|
||||||
}
|
}
|
||||||
else if (silent)
|
else if (silent)
|
||||||
ttrestore ();
|
ttyrestore (&termsave);
|
||||||
|
|
||||||
if (unbuffered_read == 0)
|
if (unbuffered_read == 0)
|
||||||
zsyncfd (fd);
|
zsyncfd (fd);
|
||||||
|
|
||||||
interrupt_immediately--;
|
interrupt_immediately--;
|
||||||
terminate_immediately = 0;
|
terminate_immediately--;
|
||||||
discard_unwind_frame ("read_builtin");
|
discard_unwind_frame ("read_builtin");
|
||||||
|
|
||||||
retval = eof ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
|
retval = eof ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
|
||||||
|
|
||||||
|
assign_vars:
|
||||||
|
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
/* If -a was given, take the string read, break it into a list of words,
|
/* If -a was given, take the string read, break it into a list of words,
|
||||||
an assign them to `arrayname' in turn. */
|
an assign them to `arrayname' in turn. */
|
||||||
|
|
@ -603,7 +685,6 @@ add_char:
|
||||||
for (t = input_string; ifs_chars && *ifs_chars && spctabnl(*t) && isifs(*t); t++)
|
for (t = input_string; ifs_chars && *ifs_chars && spctabnl(*t) && isifs(*t); t++)
|
||||||
;
|
;
|
||||||
input_string = t;
|
input_string = t;
|
||||||
|
|
||||||
for (; list->next; list = list->next)
|
for (; list->next; list = list->next)
|
||||||
{
|
{
|
||||||
varname = list->word->word;
|
varname = list->word->word;
|
||||||
|
|
@ -718,8 +799,66 @@ bind_read_variable (name, value)
|
||||||
#endif /* !ARRAY_VARS */
|
#endif /* !ARRAY_VARS */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined (HANDLE_MULTIBYTE)
|
||||||
|
static int
|
||||||
|
read_mbchar (fd, string, ind, ch, unbuffered)
|
||||||
|
int fd;
|
||||||
|
char *string;
|
||||||
|
int ind, ch, unbuffered;
|
||||||
|
{
|
||||||
|
char mbchar[MB_LEN_MAX + 1];
|
||||||
|
int i, n, r;
|
||||||
|
char c;
|
||||||
|
size_t ret;
|
||||||
|
mbstate_t ps, ps_back;
|
||||||
|
wchar_t wc;
|
||||||
|
|
||||||
|
memset (&ps, '\0', sizeof (mbstate_t));
|
||||||
|
memset (&ps_back, '\0', sizeof (mbstate_t));
|
||||||
|
|
||||||
|
mbchar[0] = ch;
|
||||||
|
i = 1;
|
||||||
|
for (n = 0; n <= MB_LEN_MAX; n++)
|
||||||
|
{
|
||||||
|
ps_back = ps;
|
||||||
|
ret = mbrtowc (&wc, mbchar, i, &ps);
|
||||||
|
if (ret == (size_t)-2)
|
||||||
|
{
|
||||||
|
ps = ps_back;
|
||||||
|
if (unbuffered)
|
||||||
|
r = zread (fd, &c, 1);
|
||||||
|
else
|
||||||
|
r = zreadc (fd, &c);
|
||||||
|
if (r < 0)
|
||||||
|
goto mbchar_return;
|
||||||
|
mbchar[i++] = c;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (ret == (size_t)-1 || ret == (size_t)0 || ret > (size_t)0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mbchar_return:
|
||||||
|
if (i > 1) /* read a multibyte char */
|
||||||
|
/* mbchar[0] is already string[ind-1] */
|
||||||
|
for (r = 1; r < i; r++)
|
||||||
|
string[ind+r-1] = mbchar[r];
|
||||||
|
return i - 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
ttyrestore (ttp)
|
||||||
|
struct ttsave *ttp;
|
||||||
|
{
|
||||||
|
ttsetattr (ttp->fd, ttp->attrs);
|
||||||
|
}
|
||||||
|
|
||||||
#if defined (READLINE)
|
#if defined (READLINE)
|
||||||
static rl_completion_func_t *old_attempted_completion_function = 0;
|
static rl_completion_func_t *old_attempted_completion_function = 0;
|
||||||
|
static rl_hook_func_t *old_startup_hook;
|
||||||
|
static char *deftext;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reset_attempted_completion_function (cp)
|
reset_attempted_completion_function (cp)
|
||||||
|
|
@ -729,9 +868,28 @@ reset_attempted_completion_function (cp)
|
||||||
rl_attempted_completion_function = old_attempted_completion_function;
|
rl_attempted_completion_function = old_attempted_completion_function;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
set_itext ()
|
||||||
|
{
|
||||||
|
int r1, r2;
|
||||||
|
|
||||||
|
r1 = r2 = 0;
|
||||||
|
if (old_startup_hook)
|
||||||
|
r1 = (*old_startup_hook) ();
|
||||||
|
if (deftext)
|
||||||
|
{
|
||||||
|
r2 = rl_insert_text (deftext);
|
||||||
|
deftext = (char *)NULL;
|
||||||
|
rl_startup_hook = old_startup_hook;
|
||||||
|
old_startup_hook = (rl_hook_func_t *)NULL;
|
||||||
|
}
|
||||||
|
return (r1 || r2);
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
edit_line (p)
|
edit_line (p, itext)
|
||||||
char *p;
|
char *p;
|
||||||
|
char *itext;
|
||||||
{
|
{
|
||||||
char *ret;
|
char *ret;
|
||||||
int len;
|
int len;
|
||||||
|
|
@ -741,6 +899,12 @@ edit_line (p)
|
||||||
|
|
||||||
old_attempted_completion_function = rl_attempted_completion_function;
|
old_attempted_completion_function = rl_attempted_completion_function;
|
||||||
rl_attempted_completion_function = (rl_completion_func_t *)NULL;
|
rl_attempted_completion_function = (rl_completion_func_t *)NULL;
|
||||||
|
if (itext)
|
||||||
|
{
|
||||||
|
old_startup_hook = rl_startup_hook;
|
||||||
|
rl_startup_hook = set_itext;
|
||||||
|
deftext = itext;
|
||||||
|
}
|
||||||
ret = readline (p);
|
ret = readline (p);
|
||||||
rl_attempted_completion_function = old_attempted_completion_function;
|
rl_attempted_completion_function = old_attempted_completion_function;
|
||||||
old_attempted_completion_function = (rl_completion_func_t *)NULL;
|
old_attempted_completion_function = (rl_completion_func_t *)NULL;
|
||||||
|
|
|
||||||
|
|
@ -2,35 +2,41 @@ This file is reserved.def, in which the shell reserved words are defined.
|
||||||
It has no direct C file production, but defines builtins for the Bash
|
It has no direct C file production, but defines builtins for the Bash
|
||||||
builtin help command.
|
builtin help command.
|
||||||
|
|
||||||
Copyright (C) 1987-2006 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$BUILTIN for
|
$BUILTIN for
|
||||||
$SHORT_DOC for NAME [in WORDS ... ;] do COMMANDS; done
|
$SHORT_DOC for NAME [in WORDS ... ] ; do COMMANDS; done
|
||||||
|
Execute commands for each member in a list.
|
||||||
|
|
||||||
The `for' loop executes a sequence of commands for each member in a
|
The `for' loop executes a sequence of commands for each member in a
|
||||||
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
|
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
|
||||||
assumed. For each element in WORDS, NAME is set to that element, and
|
assumed. For each element in WORDS, NAME is set to that element, and
|
||||||
the COMMANDS are executed.
|
the COMMANDS are executed.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the last command executed.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN for ((
|
$BUILTIN for ((
|
||||||
$DOCNAME arith_for
|
$DOCNAME arith_for
|
||||||
$SHORT_DOC for (( exp1; exp2; exp3 )); do COMMANDS; done
|
$SHORT_DOC for (( exp1; exp2; exp3 )); do COMMANDS; done
|
||||||
|
Arithmetic for loop.
|
||||||
|
|
||||||
Equivalent to
|
Equivalent to
|
||||||
(( EXP1 ))
|
(( EXP1 ))
|
||||||
while (( EXP2 )); do
|
while (( EXP2 )); do
|
||||||
|
|
@ -39,10 +45,15 @@ Equivalent to
|
||||||
done
|
done
|
||||||
EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is
|
EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is
|
||||||
omitted, it behaves as if it evaluates to 1.
|
omitted, it behaves as if it evaluates to 1.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the last command executed.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN select
|
$BUILTIN select
|
||||||
$SHORT_DOC select NAME [in WORDS ... ;] do COMMANDS; done
|
$SHORT_DOC select NAME [in WORDS ... ;] do COMMANDS; done
|
||||||
|
Select words from a list and execute commands.
|
||||||
|
|
||||||
The WORDS are expanded, generating a list of words. The
|
The WORDS are expanded, generating a list of words. The
|
||||||
set of expanded words is printed on the standard error, each
|
set of expanded words is printed on the standard error, each
|
||||||
preceded by a number. If `in WORDS' is not present, `in "$@"'
|
preceded by a number. If `in WORDS' is not present, `in "$@"'
|
||||||
|
|
@ -54,25 +65,42 @@ redisplayed. If EOF is read, the command completes. Any other
|
||||||
value read causes NAME to be set to null. The line read is saved
|
value read causes NAME to be set to null. The line read is saved
|
||||||
in the variable REPLY. COMMANDS are executed after each selection
|
in the variable REPLY. COMMANDS are executed after each selection
|
||||||
until a break command is executed.
|
until a break command is executed.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the last command executed.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN time
|
$BUILTIN time
|
||||||
$SHORT_DOC time [-p] PIPELINE
|
$SHORT_DOC time [-p] pipeline
|
||||||
|
Report time consumed by pipeline's execution.
|
||||||
|
|
||||||
Execute PIPELINE and print a summary of the real time, user CPU time,
|
Execute PIPELINE and print a summary of the real time, user CPU time,
|
||||||
and system CPU time spent executing PIPELINE when it terminates.
|
and system CPU time spent executing PIPELINE when it terminates.
|
||||||
The return status is the return status of PIPELINE. The `-p' option
|
|
||||||
prints the timing summary in a slightly different format. This uses
|
Options:
|
||||||
the value of the TIMEFORMAT variable as the output format.
|
-p print the timing summary in the portable Posix format
|
||||||
|
|
||||||
|
The value of the TIMEFORMAT variable is used as the output format.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
The return status is the return status of PIPELINE.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN case
|
$BUILTIN case
|
||||||
$SHORT_DOC case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
|
$SHORT_DOC case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
|
||||||
|
Execute commands based on pattern matching.
|
||||||
|
|
||||||
Selectively execute COMMANDS based upon WORD matching PATTERN. The
|
Selectively execute COMMANDS based upon WORD matching PATTERN. The
|
||||||
`|' is used to separate multiple patterns.
|
`|' is used to separate multiple patterns.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the last command executed.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN if
|
$BUILTIN if
|
||||||
$SHORT_DOC if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
|
$SHORT_DOC if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
|
||||||
|
Execute commands based on conditional.
|
||||||
|
|
||||||
The `if COMMANDS' list is executed. If its exit status is zero, then the
|
The `if COMMANDS' list is executed. If its exit status is zero, then the
|
||||||
`then COMMANDS' list is executed. Otherwise, each `elif COMMANDS' list is
|
`then COMMANDS' list is executed. Otherwise, each `elif COMMANDS' list is
|
||||||
executed in turn, and if its exit status is zero, the corresponding
|
executed in turn, and if its exit status is zero, the corresponding
|
||||||
|
|
@ -80,75 +108,119 @@ executed in turn, and if its exit status is zero, the corresponding
|
||||||
the `else COMMANDS' list is executed, if present. The exit status of the
|
the `else COMMANDS' list is executed, if present. The exit status of the
|
||||||
entire construct is the exit status of the last command executed, or zero
|
entire construct is the exit status of the last command executed, or zero
|
||||||
if no condition tested true.
|
if no condition tested true.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the last command executed.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN while
|
$BUILTIN while
|
||||||
$SHORT_DOC while COMMANDS; do COMMANDS; done
|
$SHORT_DOC while COMMANDS; do COMMANDS; done
|
||||||
|
Execute commands as long as a test succeeds.
|
||||||
|
|
||||||
Expand and execute COMMANDS as long as the final command in the
|
Expand and execute COMMANDS as long as the final command in the
|
||||||
`while' COMMANDS has an exit status of zero.
|
`while' COMMANDS has an exit status of zero.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the last command executed.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN until
|
$BUILTIN until
|
||||||
$SHORT_DOC until COMMANDS; do COMMANDS; done
|
$SHORT_DOC until COMMANDS; do COMMANDS; done
|
||||||
|
Execute commands as long as a test does not succeed.
|
||||||
|
|
||||||
Expand and execute COMMANDS as long as the final command in the
|
Expand and execute COMMANDS as long as the final command in the
|
||||||
`until' COMMANDS has an exit status which is not zero.
|
`until' COMMANDS has an exit status which is not zero.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the last command executed.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN function
|
$BUILTIN function
|
||||||
$SHORT_DOC function NAME { COMMANDS ; } or NAME () { COMMANDS ; }
|
$SHORT_DOC function name { COMMANDS ; } or name () { COMMANDS ; }
|
||||||
Create a simple command invoked by NAME which runs COMMANDS.
|
Define shell function.
|
||||||
Arguments on the command line along with NAME are passed to the
|
|
||||||
function as $0 .. $n.
|
Create a shell function named NAME. When invoked as a simple command,
|
||||||
|
NAME runs COMMANDs in the calling shell's context. When NAME is invoked,
|
||||||
|
the arguments are passed to the function as $1...$n, and the function's
|
||||||
|
name is in $FUNCNAME.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless NAME is readonly.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN { ... }
|
$BUILTIN { ... }
|
||||||
$DOCNAME grouping_braces
|
$DOCNAME grouping_braces
|
||||||
$SHORT_DOC { COMMANDS ; }
|
$SHORT_DOC { COMMANDS ; }
|
||||||
|
Group commands as a unit.
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the last command executed.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN %
|
$BUILTIN %
|
||||||
$DOCNAME fg_percent
|
$DOCNAME fg_percent
|
||||||
$SHORT_DOC JOB_SPEC [&]
|
$SHORT_DOC job_spec [&]
|
||||||
|
Resume job in foreground.
|
||||||
|
|
||||||
Equivalent to the JOB_SPEC argument to the `fg' command. Resume a
|
Equivalent to the JOB_SPEC argument to the `fg' command. Resume a
|
||||||
stopped or background job. JOB_SPEC can specify either a job name
|
stopped or background job. JOB_SPEC can specify either a job name
|
||||||
or a job number. Following JOB_SPEC with a `&' places the job in
|
or a job number. Following JOB_SPEC with a `&' places the job in
|
||||||
the background, as if the job specification had been supplied as an
|
the background, as if the job specification had been supplied as an
|
||||||
argument to `bg'.
|
argument to `bg'.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the resumed job.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN (( ... ))
|
$BUILTIN (( ... ))
|
||||||
$DOCNAME arith
|
$DOCNAME arith
|
||||||
$SHORT_DOC (( expression ))
|
$SHORT_DOC (( expression ))
|
||||||
|
Evaluate arithmetic expression.
|
||||||
|
|
||||||
The EXPRESSION is evaluated according to the rules for arithmetic
|
The EXPRESSION is evaluated according to the rules for arithmetic
|
||||||
evaluation. Equivalent to "let EXPRESSION".
|
evaluation. Equivalent to "let EXPRESSION".
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN [[ ... ]]
|
$BUILTIN [[ ... ]]
|
||||||
$DOCNAME conditional
|
$DOCNAME conditional
|
||||||
$SHORT_DOC [[ expression ]]
|
$SHORT_DOC [[ expression ]]
|
||||||
|
Execute conditional command.
|
||||||
|
|
||||||
Returns a status of 0 or 1 depending on the evaluation of the conditional
|
Returns a status of 0 or 1 depending on the evaluation of the conditional
|
||||||
expression EXPRESSION. Expressions are composed of the same primaries used
|
expression EXPRESSION. Expressions are composed of the same primaries used
|
||||||
by the `test' builtin, and may be combined using the following operators
|
by the `test' builtin, and may be combined using the following operators:
|
||||||
|
|
||||||
( EXPRESSION ) Returns the value of EXPRESSION
|
( EXPRESSION ) Returns the value of EXPRESSION
|
||||||
! EXPRESSION True if EXPRESSION is false; else false
|
! EXPRESSION True if EXPRESSION is false; else false
|
||||||
EXPR1 && EXPR2 True if both EXPR1 and EXPR2 are true; else false
|
EXPR1 && EXPR2 True if both EXPR1 and EXPR2 are true; else false
|
||||||
EXPR1 || EXPR2 True if either EXPR1 or EXPR2 is true; else false
|
EXPR1 || EXPR2 True if either EXPR1 or EXPR2 is true; else false
|
||||||
|
|
||||||
When the `==' and `!=' operators are used, the string to the right of the
|
When the `==' and `!=' operators are used, the string to the right of
|
||||||
operator is used as a pattern and pattern matching is performed. The
|
the operator is used as a pattern and pattern matching is performed.
|
||||||
&& and || operators do not evaluate EXPR2 if EXPR1 is sufficient to
|
When the `=~' operator is used, the string to the right of the operator
|
||||||
|
is matched as a regular expression.
|
||||||
|
|
||||||
|
The && and || operators do not evaluate EXPR2 if EXPR1 is sufficient to
|
||||||
determine the expression's value.
|
determine the expression's value.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
0 or 1 depending on value of EXPRESSION.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN variables
|
$BUILTIN variables
|
||||||
$DOCNAME variable_help
|
$DOCNAME variable_help
|
||||||
$SHORT_DOC variables - Some variable names and meanings
|
$SHORT_DOC variables - Names and meanings of some shell variables
|
||||||
|
Common shell variable names and usage.
|
||||||
|
|
||||||
BASH_VERSION Version information for this Bash.
|
BASH_VERSION Version information for this Bash.
|
||||||
CDPATH A colon-separated list of directories to search
|
CDPATH A colon-separated list of directories to search
|
||||||
for directries given as arguments to `cd'.
|
for directories given as arguments to `cd'.
|
||||||
GLOBIGNORE A colon-separated list of patterns describing filenames to
|
GLOBIGNORE A colon-separated list of patterns describing filenames to
|
||||||
be ignored by pathname expansion.
|
be ignored by pathname expansion.
|
||||||
#if defined (HISTORY)
|
#if defined (HISTORY)
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
This file is return.def, from which is created return.c.
|
This file is return.def, from which is created return.c.
|
||||||
It implements the builtin "return" in Bash.
|
It implements the builtin "return" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES return.c
|
$PRODUCES return.c
|
||||||
|
|
||||||
|
|
@ -25,8 +24,14 @@ $BUILTIN return
|
||||||
|
|
||||||
$FUNCTION return_builtin
|
$FUNCTION return_builtin
|
||||||
$SHORT_DOC return [n]
|
$SHORT_DOC return [n]
|
||||||
Causes a function to exit with the return value specified by N. If N
|
Return from a shell function.
|
||||||
is omitted, the return status is that of the last command.
|
|
||||||
|
Causes a function or sourced script to exit with the return value
|
||||||
|
specified by N. If N is omitted, the return status is that of the
|
||||||
|
last command executed within the function or script.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns N, or failure if the shell is not executing a function or script.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -42,6 +47,7 @@ $END
|
||||||
|
|
||||||
#include "../shell.h"
|
#include "../shell.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "bashgetopt.h"
|
||||||
|
|
||||||
extern int last_command_exit_value;
|
extern int last_command_exit_value;
|
||||||
extern int subshell_environment;
|
extern int subshell_environment;
|
||||||
|
|
@ -54,6 +60,10 @@ int
|
||||||
return_builtin (list)
|
return_builtin (list)
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
{
|
{
|
||||||
|
if (no_options (list))
|
||||||
|
return (EX_USAGE);
|
||||||
|
list = loptend; /* skip over possible `--' */
|
||||||
|
|
||||||
return_catch_value = get_exitstat (list);
|
return_catch_value = get_exitstat (list);
|
||||||
|
|
||||||
if (return_catch_flag)
|
if (return_catch_flag)
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
This file is set.def, from which is created set.c.
|
This file is set.def, from which is created set.c.
|
||||||
It implements the "set" and "unset" builtins in Bash.
|
It implements the "set" and "unset" builtins in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2004 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES set.c
|
$PRODUCES set.c
|
||||||
|
|
||||||
|
|
@ -60,7 +59,13 @@ extern int no_line_editing;
|
||||||
|
|
||||||
$BUILTIN set
|
$BUILTIN set
|
||||||
$FUNCTION set_builtin
|
$FUNCTION set_builtin
|
||||||
$SHORT_DOC set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
|
$SHORT_DOC set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...]
|
||||||
|
Set or unset values of shell options and positional parameters.
|
||||||
|
|
||||||
|
Change the value of shell attributes and positional parameters, or
|
||||||
|
display the names and values of shell variables.
|
||||||
|
|
||||||
|
Options:
|
||||||
-a Mark variables which are modified or created for export.
|
-a Mark variables which are modified or created for export.
|
||||||
-b Notify of job termination immediately.
|
-b Notify of job termination immediately.
|
||||||
-e Exit immediately if a command exits with a non-zero status.
|
-e Exit immediately if a command exits with a non-zero status.
|
||||||
|
|
@ -104,7 +109,7 @@ $SHORT_DOC set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
|
||||||
the last command to exit with a non-zero status,
|
the last command to exit with a non-zero status,
|
||||||
or zero if no command exited with a non-zero status
|
or zero if no command exited with a non-zero status
|
||||||
posix change the behavior of bash where the default
|
posix change the behavior of bash where the default
|
||||||
operation differs from the 1003.2 standard to
|
operation differs from the Posix standard to
|
||||||
match the standard
|
match the standard
|
||||||
privileged same as -p
|
privileged same as -p
|
||||||
verbose same as -v
|
verbose same as -v
|
||||||
|
|
@ -141,6 +146,9 @@ flags can also be used upon invocation of the shell. The current
|
||||||
set of flags may be found in $-. The remaining n ARGs are positional
|
set of flags may be found in $-. The remaining n ARGs are positional
|
||||||
parameters and are assigned, in order, to $1, $2, .. $n. If no
|
parameters and are assigned, in order, to $1, $2, .. $n. If no
|
||||||
ARGs are given, all shell variables are printed.
|
ARGs are given, all shell variables are printed.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is given.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
typedef int setopt_set_func_t __P((int, char *));
|
typedef int setopt_set_func_t __P((int, char *));
|
||||||
|
|
@ -161,13 +169,13 @@ static int get_edit_mode __P((char *));
|
||||||
static int bash_set_history __P((int, char *));
|
static int bash_set_history __P((int, char *));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static char *on = "on";
|
static const char * const on = "on";
|
||||||
static char *off = "off";
|
static const char * const off = "off";
|
||||||
|
|
||||||
/* A struct used to match long options for set -o to the corresponding
|
/* A struct used to match long options for set -o to the corresponding
|
||||||
option letter or internal variable. The functions can be called to
|
option letter or internal variable. The functions can be called to
|
||||||
dynamically generate values. */
|
dynamically generate values. */
|
||||||
struct {
|
const struct {
|
||||||
char *name;
|
char *name;
|
||||||
int letter;
|
int letter;
|
||||||
int *variable;
|
int *variable;
|
||||||
|
|
@ -426,7 +434,7 @@ set_minus_o_option (on_or_off, option_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
sh_invalidoptname (option_name);
|
sh_invalidoptname (option_name);
|
||||||
return (EXECUTION_FAILURE);
|
return (EX_USAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -549,7 +557,7 @@ initialize_shell_options (no_shellopts)
|
||||||
/* set up any shell options we may have inherited. */
|
/* set up any shell options we may have inherited. */
|
||||||
if (var && imported_p (var))
|
if (var && imported_p (var))
|
||||||
{
|
{
|
||||||
temp = (array_p (var)) ? (char *)NULL : savestring (value_cell (var));
|
temp = (array_p (var) || assoc_p (var)) ? (char *)NULL : savestring (value_cell (var));
|
||||||
if (temp)
|
if (temp)
|
||||||
{
|
{
|
||||||
parse_shellopts (temp);
|
parse_shellopts (temp);
|
||||||
|
|
@ -581,17 +589,18 @@ int
|
||||||
set_builtin (list)
|
set_builtin (list)
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
{
|
{
|
||||||
int on_or_off, flag_name, force_assignment, opts_changed;
|
int on_or_off, flag_name, force_assignment, opts_changed, rv, r;
|
||||||
register char *arg;
|
register char *arg;
|
||||||
char s[3];
|
char s[3];
|
||||||
|
|
||||||
if (list == 0)
|
if (list == 0)
|
||||||
{
|
{
|
||||||
print_all_shell_variables ();
|
print_all_shell_variables ();
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check validity of flag arguments. */
|
/* Check validity of flag arguments. */
|
||||||
|
rv = EXECUTION_SUCCESS;
|
||||||
reset_internal_getopt ();
|
reset_internal_getopt ();
|
||||||
while ((flag_name = internal_getopt (list, optflags)) != -1)
|
while ((flag_name = internal_getopt (list, optflags)) != -1)
|
||||||
{
|
{
|
||||||
|
|
@ -654,6 +663,7 @@ set_builtin (list)
|
||||||
if (opt == 0)
|
if (opt == 0)
|
||||||
{
|
{
|
||||||
list_minus_o_opts (-1, (on_or_off == '+'));
|
list_minus_o_opts (-1, (on_or_off == '+'));
|
||||||
|
rv = sh_chkwrite (rv);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -668,10 +678,10 @@ set_builtin (list)
|
||||||
list = list->next; /* Skip over option name. */
|
list = list->next; /* Skip over option name. */
|
||||||
|
|
||||||
opts_changed = 1;
|
opts_changed = 1;
|
||||||
if (set_minus_o_option (on_or_off, option_name) != EXECUTION_SUCCESS)
|
if ((r = set_minus_o_option (on_or_off, option_name)) != EXECUTION_SUCCESS)
|
||||||
{
|
{
|
||||||
set_shellopts ();
|
set_shellopts ();
|
||||||
return (EXECUTION_FAILURE);
|
return (r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (change_flag (flag_name, on_or_off) == FLAG_ERROR)
|
else if (change_flag (flag_name, on_or_off) == FLAG_ERROR)
|
||||||
|
|
@ -700,17 +710,27 @@ set_builtin (list)
|
||||||
/* Set up new value of $SHELLOPTS */
|
/* Set up new value of $SHELLOPTS */
|
||||||
if (opts_changed)
|
if (opts_changed)
|
||||||
set_shellopts ();
|
set_shellopts ();
|
||||||
return (EXECUTION_SUCCESS);
|
return (rv);
|
||||||
}
|
}
|
||||||
|
|
||||||
$BUILTIN unset
|
$BUILTIN unset
|
||||||
$FUNCTION unset_builtin
|
$FUNCTION unset_builtin
|
||||||
$SHORT_DOC unset [-f] [-v] [name ...]
|
$SHORT_DOC unset [-f] [-v] [name ...]
|
||||||
For each NAME, remove the corresponding variable or function. Given
|
Unset values and attributes of shell variables and functions.
|
||||||
the `-v', unset will only act on variables. Given the `-f' flag,
|
|
||||||
unset will only act on functions. With neither flag, unset first
|
For each NAME, remove the corresponding variable or function.
|
||||||
tries to unset a variable, and if that fails, then tries to unset a
|
|
||||||
function. Some variables cannot be unset; also see readonly.
|
Options:
|
||||||
|
-f treat each NAME as a shell function
|
||||||
|
-v treat each NAME as a shell variable
|
||||||
|
|
||||||
|
Without options, unset first tries to unset a variable, and if that fails,
|
||||||
|
tries to unset a function.
|
||||||
|
|
||||||
|
Some variables cannot be unset; also see `readonly'.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is given or a NAME is read-only.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#define NEXT_VARIABLE() any_failed++; list = list->next; continue;
|
#define NEXT_VARIABLE() any_failed++; list = list->next; continue;
|
||||||
|
|
@ -798,7 +818,7 @@ unset_builtin (list)
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
if (var && unset_array)
|
if (var && unset_array)
|
||||||
{
|
{
|
||||||
if (array_p (var) == 0)
|
if (array_p (var) == 0 && assoc_p (var) == 0)
|
||||||
{
|
{
|
||||||
builtin_error (_("%s: not an array variable"), name);
|
builtin_error (_("%s: not an array variable"), name);
|
||||||
NEXT_VARIABLE ();
|
NEXT_VARIABLE ();
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
This file is setattr.def, from which is created setattr.c.
|
This file is setattr.def, from which is created setattr.c.
|
||||||
It implements the builtins "export" and "readonly", in Bash.
|
It implements the builtins "export" and "readonly", in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2004 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES setattr.c
|
$PRODUCES setattr.c
|
||||||
|
|
||||||
|
|
@ -52,14 +51,21 @@ extern int declare_builtin __P((WORD_LIST *));
|
||||||
|
|
||||||
$BUILTIN export
|
$BUILTIN export
|
||||||
$FUNCTION export_builtin
|
$FUNCTION export_builtin
|
||||||
$SHORT_DOC export [-nf] [name[=value] ...] or export -p
|
$SHORT_DOC export [-fn] [name[=value] ...] or export -p
|
||||||
NAMEs are marked for automatic export to the environment of
|
Set export attribute for shell variables.
|
||||||
subsequently executed commands. If the -f option is given,
|
|
||||||
the NAMEs refer to functions. If no NAMEs are given, or if `-p'
|
Marks each NAME for automatic export to the environment of subsequently
|
||||||
is given, a list of all names that are exported in this shell is
|
executed commands. If VALUE is supplied, assign VALUE before exporting.
|
||||||
printed. An argument of `-n' says to remove the export property
|
|
||||||
from subsequent NAMEs. An argument of `--' disables further option
|
Options:
|
||||||
processing.
|
-f refer to shell functions
|
||||||
|
-n remove the export property from each NAME
|
||||||
|
-p display a list of all exported variables and functions
|
||||||
|
|
||||||
|
An argument of `--' disables further option processing.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is given or NAME is invalid.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
/* For each variable name in LIST, make that variable appear in the
|
/* For each variable name in LIST, make that variable appear in the
|
||||||
|
|
@ -77,13 +83,22 @@ export_builtin (list)
|
||||||
$BUILTIN readonly
|
$BUILTIN readonly
|
||||||
$FUNCTION readonly_builtin
|
$FUNCTION readonly_builtin
|
||||||
$SHORT_DOC readonly [-af] [name[=value] ...] or readonly -p
|
$SHORT_DOC readonly [-af] [name[=value] ...] or readonly -p
|
||||||
The given NAMEs are marked readonly and the values of these NAMEs may
|
Mark shell variables as unchangeable.
|
||||||
not be changed by subsequent assignment. If the -f option is given,
|
|
||||||
then functions corresponding to the NAMEs are so marked. If no
|
Mark each NAME as read-only; the values of these NAMEs may not be
|
||||||
arguments are given, or if `-p' is given, a list of all readonly names
|
changed by subsequent assignment. If VALUE is supplied, assign VALUE
|
||||||
is printed. The `-a' option means to treat each NAME as
|
before marking as read-only.
|
||||||
an array variable. An argument of `--' disables further option
|
|
||||||
processing.
|
Options:
|
||||||
|
-a refer to indexed array variables
|
||||||
|
-A refer to associative array variables
|
||||||
|
-f refer to shell functions
|
||||||
|
-p display a list of all readonly variables and functions
|
||||||
|
|
||||||
|
An argument of `--' disables further option processing.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is given or NAME is invalid.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
/* For each variable name in LIST, make that variable readonly. Given an
|
/* For each variable name in LIST, make that variable readonly. Given an
|
||||||
|
|
@ -96,7 +111,7 @@ readonly_builtin (list)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
# define ATTROPTS "afnp"
|
# define ATTROPTS "aAfnp"
|
||||||
#else
|
#else
|
||||||
# define ATTROPTS "fnp"
|
# define ATTROPTS "fnp"
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -110,7 +125,8 @@ set_or_show_attributes (list, attribute, nodefs)
|
||||||
int attribute, nodefs;
|
int attribute, nodefs;
|
||||||
{
|
{
|
||||||
register SHELL_VAR *var;
|
register SHELL_VAR *var;
|
||||||
int assign, undo, functions_only, arrays_only, any_failed, assign_error, opt;
|
int assign, undo, any_failed, assign_error, opt;
|
||||||
|
int functions_only, arrays_only, assoc_only;
|
||||||
int aflags;
|
int aflags;
|
||||||
char *name;
|
char *name;
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
|
|
@ -118,7 +134,8 @@ set_or_show_attributes (list, attribute, nodefs)
|
||||||
WORD_DESC *w;
|
WORD_DESC *w;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
undo = functions_only = arrays_only = any_failed = assign_error = 0;
|
functions_only = arrays_only = assoc_only = 0;
|
||||||
|
undo = any_failed = assign_error = 0;
|
||||||
/* Read arguments from the front of the list. */
|
/* Read arguments from the front of the list. */
|
||||||
reset_internal_getopt ();
|
reset_internal_getopt ();
|
||||||
while ((opt = internal_getopt (list, ATTROPTS)) != -1)
|
while ((opt = internal_getopt (list, ATTROPTS)) != -1)
|
||||||
|
|
@ -135,6 +152,9 @@ set_or_show_attributes (list, attribute, nodefs)
|
||||||
case 'a':
|
case 'a':
|
||||||
arrays_only = 1;
|
arrays_only = 1;
|
||||||
break;
|
break;
|
||||||
|
case 'A':
|
||||||
|
assoc_only = 1;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 'p':
|
case 'p':
|
||||||
break;
|
break;
|
||||||
|
|
@ -206,11 +226,11 @@ set_or_show_attributes (list, attribute, nodefs)
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
/* Let's try something here. Turn readonly -a xxx=yyy into
|
/* Let's try something here. Turn readonly -a xxx=yyy into
|
||||||
declare -ra xxx=yyy and see what that gets us. */
|
declare -ra xxx=yyy and see what that gets us. */
|
||||||
if (arrays_only)
|
if (arrays_only || assoc_only)
|
||||||
{
|
{
|
||||||
tlist = list->next;
|
tlist = list->next;
|
||||||
list->next = (WORD_LIST *)NULL;
|
list->next = (WORD_LIST *)NULL;
|
||||||
w = make_word ("-ra");
|
w = arrays_only ? make_word ("-ra") : make_word ("-rA");
|
||||||
nlist = make_word_list (w, list);
|
nlist = make_word_list (w, list);
|
||||||
opt = declare_builtin (nlist);
|
opt = declare_builtin (nlist);
|
||||||
if (opt != EXECUTION_SUCCESS)
|
if (opt != EXECUTION_SUCCESS)
|
||||||
|
|
@ -257,6 +277,12 @@ set_or_show_attributes (list, attribute, nodefs)
|
||||||
if (attribute != att_array)
|
if (attribute != att_array)
|
||||||
attribute &= ~att_array;
|
attribute &= ~att_array;
|
||||||
}
|
}
|
||||||
|
else if (attribute & att_assoc)
|
||||||
|
{
|
||||||
|
assoc_only++;
|
||||||
|
if (attribute != att_assoc)
|
||||||
|
attribute &= ~att_assoc;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (variable_list)
|
if (variable_list)
|
||||||
|
|
@ -266,9 +292,15 @@ set_or_show_attributes (list, attribute, nodefs)
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
if (arrays_only && array_p (var) == 0)
|
if (arrays_only && array_p (var) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
else if (assoc_only && assoc_p (var) == 0)
|
||||||
|
continue;
|
||||||
#endif
|
#endif
|
||||||
if ((var->attributes & attribute))
|
if ((var->attributes & attribute))
|
||||||
|
{
|
||||||
show_var_attributes (var, READONLY_OR_EXPORT, nodefs);
|
show_var_attributes (var, READONLY_OR_EXPORT, nodefs);
|
||||||
|
if (any_failed = sh_chkwrite (any_failed))
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
free (variable_list);
|
free (variable_list);
|
||||||
}
|
}
|
||||||
|
|
@ -279,6 +311,30 @@ set_or_show_attributes (list, attribute, nodefs)
|
||||||
: EXECUTION_FAILURE));
|
: EXECUTION_FAILURE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Show all variable variables (v == 1) or functions (v == 0) with
|
||||||
|
attributes. */
|
||||||
|
int
|
||||||
|
show_all_var_attributes (v, nodefs)
|
||||||
|
int v, nodefs;
|
||||||
|
{
|
||||||
|
SHELL_VAR **variable_list, *var;
|
||||||
|
int any_failed;
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
variable_list = v ? all_shell_variables () : all_shell_functions ();
|
||||||
|
if (variable_list == 0)
|
||||||
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
||||||
|
for (i = any_failed = 0; var = variable_list[i]; i++)
|
||||||
|
{
|
||||||
|
show_var_attributes (var, READONLY_OR_EXPORT, nodefs);
|
||||||
|
if (any_failed = sh_chkwrite (any_failed))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
free (variable_list);
|
||||||
|
return (any_failed == 0 ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
/* Show the attributes for shell variable VAR. If NODEFS is non-zero,
|
/* Show the attributes for shell variable VAR. If NODEFS is non-zero,
|
||||||
don't show function definitions along with the name. If PATTR is
|
don't show function definitions along with the name. If PATTR is
|
||||||
non-zero, it indicates we're being called from `export' or `readonly'.
|
non-zero, it indicates we're being called from `export' or `readonly'.
|
||||||
|
|
@ -290,7 +346,7 @@ show_var_attributes (var, pattr, nodefs)
|
||||||
SHELL_VAR *var;
|
SHELL_VAR *var;
|
||||||
int pattr, nodefs;
|
int pattr, nodefs;
|
||||||
{
|
{
|
||||||
char flags[8], *x;
|
char flags[16], *x;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
@ -301,6 +357,9 @@ show_var_attributes (var, pattr, nodefs)
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
if (array_p (var))
|
if (array_p (var))
|
||||||
flags[i++] = 'a';
|
flags[i++] = 'a';
|
||||||
|
|
||||||
|
if (assoc_p (var))
|
||||||
|
flags[i++] = 'A';
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (function_p (var))
|
if (function_p (var))
|
||||||
|
|
@ -317,12 +376,24 @@ show_var_attributes (var, pattr, nodefs)
|
||||||
|
|
||||||
if (exported_p (var))
|
if (exported_p (var))
|
||||||
flags[i++] = 'x';
|
flags[i++] = 'x';
|
||||||
|
|
||||||
|
if (capcase_p (var))
|
||||||
|
flags[i++] = 'c';
|
||||||
|
|
||||||
|
if (lowercase_p (var))
|
||||||
|
flags[i++] = 'l';
|
||||||
|
|
||||||
|
if (uppercase_p (var))
|
||||||
|
flags[i++] = 'u';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
if (array_p (var))
|
if (array_p (var))
|
||||||
flags[i++] = 'a';
|
flags[i++] = 'a';
|
||||||
|
|
||||||
|
if (assoc_p (var))
|
||||||
|
flags[i++] = 'A';
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (function_p (var))
|
if (function_p (var))
|
||||||
|
|
@ -336,7 +407,7 @@ show_var_attributes (var, pattr, nodefs)
|
||||||
reused as input to recreate the current state. */
|
reused as input to recreate the current state. */
|
||||||
if (function_p (var) && nodefs == 0 && (pattr == 0 || posixly_correct == 0))
|
if (function_p (var) && nodefs == 0 && (pattr == 0 || posixly_correct == 0))
|
||||||
{
|
{
|
||||||
printf ("%s\n", named_function_string (var->name, function_cell (var), 1));
|
printf ("%s\n", named_function_string (var->name, function_cell (var), FUNC_MULTILINE|FUNC_EXTERNAL));
|
||||||
nodefs++;
|
nodefs++;
|
||||||
if (pattr == 0 && i == 1 && flags[0] == 'f')
|
if (pattr == 0 && i == 1 && flags[0] == 'f')
|
||||||
return 0; /* don't print `declare -f name' */
|
return 0; /* don't print `declare -f name' */
|
||||||
|
|
@ -352,6 +423,8 @@ show_var_attributes (var, pattr, nodefs)
|
||||||
#if defined (ARRAY_VARS)
|
#if defined (ARRAY_VARS)
|
||||||
if (array_p (var))
|
if (array_p (var))
|
||||||
print_array_assignment (var, 1);
|
print_array_assignment (var, 1);
|
||||||
|
else if (assoc_p (var))
|
||||||
|
print_assoc_assignment (var, 1);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
/* force `readonly' and `export' to not print out function definitions
|
/* force `readonly' and `export' to not print out function definitions
|
||||||
|
|
@ -359,7 +432,7 @@ show_var_attributes (var, pattr, nodefs)
|
||||||
if (nodefs || (function_p (var) && pattr != 0 && posixly_correct))
|
if (nodefs || (function_p (var) && pattr != 0 && posixly_correct))
|
||||||
printf ("%s\n", var->name);
|
printf ("%s\n", var->name);
|
||||||
else if (function_p (var))
|
else if (function_p (var))
|
||||||
printf ("%s\n", named_function_string (var->name, function_cell (var), 1));
|
printf ("%s\n", named_function_string (var->name, function_cell (var), FUNC_MULTILINE|FUNC_EXTERNAL));
|
||||||
else if (invisible_p (var))
|
else if (invisible_p (var))
|
||||||
printf ("%s\n", var->name);
|
printf ("%s\n", var->name);
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
This file is shift.def, from which is created shift.c.
|
This file is shift.def, from which is created shift.c.
|
||||||
It implements the builtin "shift" in Bash.
|
It implements the builtin "shift" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES shift.c
|
$PRODUCES shift.c
|
||||||
|
|
||||||
|
|
@ -39,8 +38,13 @@ $PRODUCES shift.c
|
||||||
$BUILTIN shift
|
$BUILTIN shift
|
||||||
$FUNCTION shift_builtin
|
$FUNCTION shift_builtin
|
||||||
$SHORT_DOC shift [n]
|
$SHORT_DOC shift [n]
|
||||||
The positional parameters from $N+1 ... are renamed to $1 ... If N is
|
Shift positional parameters.
|
||||||
|
|
||||||
|
Rename the positional parameters $N+1,$N+2 ... to $1,$2 ... If N is
|
||||||
not given, it is assumed to be 1.
|
not given, it is assumed to be 1.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless N is negative or greater than $#.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
int print_shift_error;
|
int print_shift_error;
|
||||||
|
|
@ -57,7 +61,8 @@ shift_builtin (list)
|
||||||
register int count;
|
register int count;
|
||||||
WORD_LIST *temp;
|
WORD_LIST *temp;
|
||||||
|
|
||||||
times = get_numeric_arg (list, 0);
|
if (get_numeric_arg (list, 0, ×) == 0)
|
||||||
|
return (EXECUTION_FAILURE);
|
||||||
|
|
||||||
if (times == 0)
|
if (times == 0)
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
|
||||||
|
|
@ -1,37 +1,44 @@
|
||||||
This file is shopt.def, from which is created shopt.c.
|
This file is shopt.def, from which is created shopt.c.
|
||||||
It implements the Bash `shopt' builtin.
|
It implements the Bash `shopt' builtin.
|
||||||
|
|
||||||
Copyright (C) 1994-2005 Free Software Foundation, Inc.
|
Copyright (C) 1994-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES shopt.c
|
$PRODUCES shopt.c
|
||||||
|
|
||||||
$BUILTIN shopt
|
$BUILTIN shopt
|
||||||
$FUNCTION shopt_builtin
|
$FUNCTION shopt_builtin
|
||||||
$SHORT_DOC shopt [-pqsu] [-o long-option] optname [optname...]
|
$SHORT_DOC shopt [-pqsu] [-o] [optname ...]
|
||||||
Toggle the values of variables controlling optional behavior.
|
Set and unset shell options.
|
||||||
The -s flag means to enable (set) each OPTNAME; the -u flag
|
|
||||||
unsets each OPTNAME. The -q flag suppresses output; the exit
|
Change the setting of each shell option OPTNAME. Without any option
|
||||||
status indicates whether each OPTNAME is set or unset. The -o
|
arguments, list all shell options with an indication of whether or not each
|
||||||
option restricts the OPTNAMEs to those defined for use with
|
is set.
|
||||||
`set -o'. With no options, or with the -p option, a list of all
|
|
||||||
settable options is displayed, with an indication of whether or
|
Options:
|
||||||
not each is set.
|
-o restrict OPTNAMEs to those defined for use with `set -o'
|
||||||
|
-p print each shell option with an indication of its status
|
||||||
|
-q suppress output
|
||||||
|
-s enable (set) each OPTNAME
|
||||||
|
-u disable (unset) each OPTNAME
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success if OPTNAME is enabled; fails if an invalid option is
|
||||||
|
given or OPTNAME is disabled.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -45,6 +52,8 @@ $END
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
#include "../bashintl.h"
|
#include "../bashintl.h"
|
||||||
|
|
||||||
#include "../shell.h"
|
#include "../shell.h"
|
||||||
|
|
@ -52,6 +61,10 @@ $END
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "bashgetopt.h"
|
#include "bashgetopt.h"
|
||||||
|
|
||||||
|
#if defined (HISTORY)
|
||||||
|
# include "../bashhist.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define UNSETOPT 0
|
#define UNSETOPT 0
|
||||||
#define SETOPT 1
|
#define SETOPT 1
|
||||||
|
|
||||||
|
|
@ -68,20 +81,20 @@ extern int glob_ignore_case, match_ignore_case;
|
||||||
extern int hup_on_exit;
|
extern int hup_on_exit;
|
||||||
extern int xpg_echo;
|
extern int xpg_echo;
|
||||||
extern int gnu_error_format;
|
extern int gnu_error_format;
|
||||||
|
extern int check_jobs_at_exit;
|
||||||
|
extern int autocd;
|
||||||
|
extern int glob_star;
|
||||||
|
|
||||||
#if defined (EXTENDED_GLOB)
|
#if defined (EXTENDED_GLOB)
|
||||||
extern int extended_glob;
|
extern int extended_glob;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (HISTORY)
|
|
||||||
extern int literal_history, command_oriented_history;
|
|
||||||
extern int force_append_history;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (READLINE)
|
#if defined (READLINE)
|
||||||
extern int hist_verify, history_reediting, perform_hostname_completion;
|
extern int hist_verify, history_reediting, perform_hostname_completion;
|
||||||
extern int no_empty_command_completion;
|
extern int no_empty_command_completion;
|
||||||
extern int force_fignore;
|
extern int force_fignore;
|
||||||
|
extern int dircomplete_spelling;
|
||||||
|
|
||||||
extern int enable_hostname_completion __P((int));
|
extern int enable_hostname_completion __P((int));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -109,6 +122,7 @@ static int set_restricted_shell __P((int));
|
||||||
|
|
||||||
static int shopt_login_shell;
|
static int shopt_login_shell;
|
||||||
static int shopt_compat31;
|
static int shopt_compat31;
|
||||||
|
static int shopt_compat32;
|
||||||
|
|
||||||
typedef int shopt_set_func_t __P((int));
|
typedef int shopt_set_func_t __P((int));
|
||||||
|
|
||||||
|
|
@ -117,14 +131,22 @@ static struct {
|
||||||
int *value;
|
int *value;
|
||||||
shopt_set_func_t *set_func;
|
shopt_set_func_t *set_func;
|
||||||
} shopt_vars[] = {
|
} shopt_vars[] = {
|
||||||
|
{ "autocd", &autocd, (shopt_set_func_t *)NULL },
|
||||||
{ "cdable_vars", &cdable_vars, (shopt_set_func_t *)NULL },
|
{ "cdable_vars", &cdable_vars, (shopt_set_func_t *)NULL },
|
||||||
{ "cdspell", &cdspelling, (shopt_set_func_t *)NULL },
|
{ "cdspell", &cdspelling, (shopt_set_func_t *)NULL },
|
||||||
{ "checkhash", &check_hashed_filenames, (shopt_set_func_t *)NULL },
|
{ "checkhash", &check_hashed_filenames, (shopt_set_func_t *)NULL },
|
||||||
|
#if defined (JOB_CONTROL)
|
||||||
|
{ "checkjobs", &check_jobs_at_exit, (shopt_set_func_t *)NULL },
|
||||||
|
#endif
|
||||||
{ "checkwinsize", &check_window_size, (shopt_set_func_t *)NULL },
|
{ "checkwinsize", &check_window_size, (shopt_set_func_t *)NULL },
|
||||||
#if defined (HISTORY)
|
#if defined (HISTORY)
|
||||||
{ "cmdhist", &command_oriented_history, (shopt_set_func_t *)NULL },
|
{ "cmdhist", &command_oriented_history, (shopt_set_func_t *)NULL },
|
||||||
#endif
|
#endif
|
||||||
{ "compat31", &shopt_compat31, set_compatibility_level },
|
{ "compat31", &shopt_compat31, set_compatibility_level },
|
||||||
|
{ "compat32", &shopt_compat32, set_compatibility_level },
|
||||||
|
#if defined (READLINE)
|
||||||
|
{ "dirspell", &dircomplete_spelling, (shopt_set_func_t *)NULL },
|
||||||
|
#endif
|
||||||
{ "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
|
{ "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
|
||||||
{ "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
|
{ "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
|
||||||
{ "expand_aliases", &expand_aliases, (shopt_set_func_t *)NULL },
|
{ "expand_aliases", &expand_aliases, (shopt_set_func_t *)NULL },
|
||||||
|
|
@ -139,6 +161,7 @@ static struct {
|
||||||
#if defined (READLINE)
|
#if defined (READLINE)
|
||||||
{ "force_fignore", &force_fignore, (shopt_set_func_t *)NULL },
|
{ "force_fignore", &force_fignore, (shopt_set_func_t *)NULL },
|
||||||
#endif
|
#endif
|
||||||
|
{ "globstar", &glob_star, (shopt_set_func_t *)NULL },
|
||||||
{ "gnu_errfmt", &gnu_error_format, (shopt_set_func_t *)NULL },
|
{ "gnu_errfmt", &gnu_error_format, (shopt_set_func_t *)NULL },
|
||||||
#if defined (HISTORY)
|
#if defined (HISTORY)
|
||||||
{ "histappend", &force_append_history, (shopt_set_func_t *)NULL },
|
{ "histappend", &force_append_history, (shopt_set_func_t *)NULL },
|
||||||
|
|
@ -174,8 +197,8 @@ static struct {
|
||||||
{ (char *)0, (int *)0, (shopt_set_func_t *)NULL }
|
{ (char *)0, (int *)0, (shopt_set_func_t *)NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *on = "on";
|
static const char * const on = "on";
|
||||||
static char *off = "off";
|
static const char * const off = "off";
|
||||||
|
|
||||||
static int find_shopt __P((char *));
|
static int find_shopt __P((char *));
|
||||||
static int toggle_shopts __P((int, WORD_LIST *, int));
|
static int toggle_shopts __P((int, WORD_LIST *, int));
|
||||||
|
|
@ -352,7 +375,7 @@ list_shopts (list, flags)
|
||||||
if ((flags & QFLAG) == 0)
|
if ((flags & QFLAG) == 0)
|
||||||
print_shopt (shopt_vars[i].name, val, flags);
|
print_shopt (shopt_vars[i].name, val, flags);
|
||||||
}
|
}
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (l = list, rval = EXECUTION_SUCCESS; l; l = l->next)
|
for (l = list, rval = EXECUTION_SUCCESS; l; l = l->next)
|
||||||
|
|
@ -371,7 +394,7 @@ list_shopts (list, flags)
|
||||||
print_shopt (l->word->word, val, flags);
|
print_shopt (l->word->word, val, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (rval);
|
return (sh_chkwrite (rval));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -386,7 +409,7 @@ list_some_shopts (mode, flags)
|
||||||
if (((flags & QFLAG) == 0) && mode == val)
|
if (((flags & QFLAG) == 0) && mode == val)
|
||||||
print_shopt (shopt_vars[i].name, val, flags);
|
print_shopt (shopt_vars[i].name, val, flags);
|
||||||
}
|
}
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -401,7 +424,7 @@ list_shopt_o_options (list, flags)
|
||||||
{
|
{
|
||||||
if ((flags & QFLAG) == 0)
|
if ((flags & QFLAG) == 0)
|
||||||
list_minus_o_opts (-1, (flags & PFLAG));
|
list_minus_o_opts (-1, (flags & PFLAG));
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (l = list, rval = EXECUTION_SUCCESS; l; l = l->next)
|
for (l = list, rval = EXECUTION_SUCCESS; l; l = l->next)
|
||||||
|
|
@ -423,7 +446,7 @@ list_shopt_o_options (list, flags)
|
||||||
printf (OPTFMT, l->word->word, val ? on : off);
|
printf (OPTFMT, l->word->word, val ? on : off);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (rval);
|
return (sh_chkwrite (rval));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -432,7 +455,7 @@ list_some_o_options (mode, flags)
|
||||||
{
|
{
|
||||||
if ((flags & QFLAG) == 0)
|
if ((flags & QFLAG) == 0)
|
||||||
list_minus_o_opts (mode, (flags & PFLAG));
|
list_minus_o_opts (mode, (flags & PFLAG));
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -470,8 +493,10 @@ set_compatibility_level (mode)
|
||||||
/* Need to change logic here as we add more compatibility levels */
|
/* Need to change logic here as we add more compatibility levels */
|
||||||
if (shopt_compat31)
|
if (shopt_compat31)
|
||||||
shell_compatibility_level = 31;
|
shell_compatibility_level = 31;
|
||||||
else
|
else if (shopt_compat32)
|
||||||
shell_compatibility_level = 32;
|
shell_compatibility_level = 32;
|
||||||
|
else
|
||||||
|
shell_compatibility_level = DEFAULT_COMPAT_LEVEL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -552,5 +577,5 @@ shopt_listopt (name, reusable)
|
||||||
}
|
}
|
||||||
|
|
||||||
print_shopt (name, *shopt_vars[i].value, reusable ? PFLAG : 0);
|
print_shopt (name, *shopt_vars[i].value, reusable ? PFLAG : 0);
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,44 +1,55 @@
|
||||||
This file is source.def, from which is created source.c.
|
This file is source.def, from which is created source.c.
|
||||||
It implements the builtins "." and "source" in Bash.
|
It implements the builtins "." and "source" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES source.c
|
$PRODUCES source.c
|
||||||
|
|
||||||
$BUILTIN source
|
$BUILTIN source
|
||||||
$FUNCTION source_builtin
|
$FUNCTION source_builtin
|
||||||
$SHORT_DOC source filename [arguments]
|
$SHORT_DOC source filename [arguments]
|
||||||
Read and execute commands from FILENAME and return. The pathnames
|
Execute commands from a file in the current shell.
|
||||||
in $PATH are used to find the directory containing FILENAME. If any
|
|
||||||
ARGUMENTS are supplied, they become the positional parameters when
|
Read and execute commands from FILENAME in the current shell. The
|
||||||
FILENAME is executed.
|
entries in $PATH are used to find the directory containing FILENAME.
|
||||||
|
If any ARGUMENTS are supplied, they become the positional parameters
|
||||||
|
when FILENAME is executed.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the last command executed in FILENAME; fails if
|
||||||
|
FILENAME cannot be read.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN .
|
$BUILTIN .
|
||||||
$DOCNAME dot
|
$DOCNAME dot
|
||||||
$FUNCTION source_builtin
|
$FUNCTION source_builtin
|
||||||
$SHORT_DOC . filename [arguments]
|
$SHORT_DOC . filename [arguments]
|
||||||
Read and execute commands from FILENAME and return. The pathnames
|
Execute commands from a file in the current shell.
|
||||||
in $PATH are used to find the directory containing FILENAME. If any
|
|
||||||
ARGUMENTS are supplied, they become the positional parameters when
|
Read and execute commands from FILENAME in the current shell. The
|
||||||
FILENAME is executed.
|
entries in $PATH are used to find the directory containing FILENAME.
|
||||||
|
If any ARGUMENTS are supplied, they become the positional parameters
|
||||||
|
when FILENAME is executed.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of the last command executed in FILENAME; fails if
|
||||||
|
FILENAME cannot be read.
|
||||||
$END
|
$END
|
||||||
/* source.c - Implements the `.' and `source' builtins. */
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
@ -68,6 +79,8 @@ $END
|
||||||
extern int errno;
|
extern int errno;
|
||||||
#endif /* !errno */
|
#endif /* !errno */
|
||||||
|
|
||||||
|
extern int posixly_correct;
|
||||||
|
|
||||||
static void maybe_pop_dollar_vars __P((void));
|
static void maybe_pop_dollar_vars __P((void));
|
||||||
|
|
||||||
/* If non-zero, `.' uses $PATH to look up the script to be sourced. */
|
/* If non-zero, `.' uses $PATH to look up the script to be sourced. */
|
||||||
|
|
@ -126,7 +139,12 @@ source_builtin (list)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
filename = (char *)NULL;
|
filename = (char *)NULL;
|
||||||
if (source_uses_path)
|
/* XXX -- should this be absolute_pathname? */
|
||||||
|
if (posixly_correct && strchr (list->word->word, '/'))
|
||||||
|
filename = savestring (list->word->word);
|
||||||
|
else if (absolute_pathname (list->word->word))
|
||||||
|
filename = savestring (list->word->word);
|
||||||
|
else if (source_uses_path)
|
||||||
filename = find_path_file (list->word->word);
|
filename = find_path_file (list->word->word);
|
||||||
if (filename == 0)
|
if (filename == 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,22 @@
|
||||||
This file is suspend.def, from which is created suspend.c.
|
This file is suspend.def, from which is created suspend.c.
|
||||||
It implements the builtin "suspend" in Bash.
|
It implements the builtin "suspend" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2003 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES suspend.c
|
$PRODUCES suspend.c
|
||||||
|
|
||||||
|
|
@ -25,9 +24,16 @@ $BUILTIN suspend
|
||||||
$DEPENDS_ON JOB_CONTROL
|
$DEPENDS_ON JOB_CONTROL
|
||||||
$FUNCTION suspend_builtin
|
$FUNCTION suspend_builtin
|
||||||
$SHORT_DOC suspend [-f]
|
$SHORT_DOC suspend [-f]
|
||||||
Suspend the execution of this shell until it receives a SIGCONT
|
Suspend shell execution.
|
||||||
signal. The `-f' if specified says not to complain about this
|
|
||||||
being a login shell if it is; just suspend anyway.
|
Suspend the execution of this shell until it receives a SIGCONT signal.
|
||||||
|
Unless forced, login shells cannot be suspended.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-f force the suspend, even if the shell is a login shell
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless job control is not enabled or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,30 @@
|
||||||
This file is test.def, from which is created test.c.
|
This file is test.def, from which is created test.c.
|
||||||
It implements the builtin "test" in Bash.
|
It implements the builtin "test" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2002 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES test.c
|
$PRODUCES test.c
|
||||||
|
|
||||||
$BUILTIN test
|
$BUILTIN test
|
||||||
$FUNCTION test_builtin
|
$FUNCTION test_builtin
|
||||||
$SHORT_DOC test [expr]
|
$SHORT_DOC test [expr]
|
||||||
|
Evaluate conditional expression.
|
||||||
|
|
||||||
Exits with a status of 0 (true) or 1 (false) depending on
|
Exits with a status of 0 (true) or 1 (false) depending on
|
||||||
the evaluation of EXPR. Expressions may be unary or binary. Unary
|
the evaluation of EXPR. Expressions may be unary or binary. Unary
|
||||||
expressions are often used to examine the status of a file. There
|
expressions are often used to examine the status of a file. There
|
||||||
|
|
@ -89,14 +90,20 @@ Other operators:
|
||||||
Arithmetic binary operators return true if ARG1 is equal, not-equal,
|
Arithmetic binary operators return true if ARG1 is equal, not-equal,
|
||||||
less-than, less-than-or-equal, greater-than, or greater-than-or-equal
|
less-than, less-than-or-equal, greater-than, or greater-than-or-equal
|
||||||
than ARG2.
|
than ARG2.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success if EXPR evaluates to true; fails if EXPR evaluates to
|
||||||
|
false or an invalid argument is given.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN [
|
$BUILTIN [
|
||||||
$DOCNAME test_bracket
|
$DOCNAME test_bracket
|
||||||
$FUNCTION test_builtin
|
$FUNCTION test_builtin
|
||||||
$SHORT_DOC [ arg... ]
|
$SHORT_DOC [ arg... ]
|
||||||
This is a synonym for the "test" builtin, but the last
|
Evaluate conditional expression.
|
||||||
argument must be a literal `]', to match the opening `['.
|
|
||||||
|
This is a synonym for the "test" builtin, but the last argument must
|
||||||
|
be a literal `]', to match the opening `['.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -109,6 +116,7 @@ $END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../bashansi.h"
|
#include "../bashansi.h"
|
||||||
|
#include "../bashintl.h"
|
||||||
|
|
||||||
#include "../shell.h"
|
#include "../shell.h"
|
||||||
#include "../test.h"
|
#include "../test.h"
|
||||||
|
|
@ -131,7 +139,7 @@ test_builtin (list)
|
||||||
{
|
{
|
||||||
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 (EX_BADUSAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,31 +1,35 @@
|
||||||
This file is times.def, from which is created times.c.
|
This file is times.def, from which is created times.c.
|
||||||
It implements the builtin "times" in Bash.
|
It implements the builtin "times" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2002 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES times.c
|
$PRODUCES times.c
|
||||||
|
|
||||||
$BUILTIN times
|
$BUILTIN times
|
||||||
$FUNCTION times_builtin
|
$FUNCTION times_builtin
|
||||||
$SHORT_DOC times
|
$SHORT_DOC times
|
||||||
Print the accumulated user and system times for processes run from
|
Display process times.
|
||||||
the shell.
|
|
||||||
|
Prints the accumulated user and system times for the shell and all of its
|
||||||
|
child processes.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Always succeeds.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -111,5 +115,5 @@ times_builtin (list)
|
||||||
# endif /* HAVE_TIMES */
|
# endif /* HAVE_TIMES */
|
||||||
#endif /* !HAVE_TIMES */
|
#endif /* !HAVE_TIMES */
|
||||||
|
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,55 @@
|
||||||
This file is trap.def, from which is created trap.c.
|
This file is trap.def, from which is created trap.c.
|
||||||
It implements the builtin "trap" in Bash.
|
It implements the builtin "trap" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2006 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES trap.c
|
$PRODUCES trap.c
|
||||||
|
|
||||||
$BUILTIN trap
|
$BUILTIN trap
|
||||||
$FUNCTION trap_builtin
|
$FUNCTION trap_builtin
|
||||||
$SHORT_DOC trap [-lp] [arg signal_spec ...]
|
$SHORT_DOC trap [-lp] [[arg] signal_spec ...]
|
||||||
The command ARG is to be read and executed when the shell receives
|
Trap signals and other events.
|
||||||
|
|
||||||
|
Defines and activates handlers to be run when the shell receives signals
|
||||||
|
or other conditions.
|
||||||
|
|
||||||
|
ARG is a command to be read and executed when the shell receives the
|
||||||
signal(s) SIGNAL_SPEC. If ARG is absent (and a single SIGNAL_SPEC
|
signal(s) SIGNAL_SPEC. If ARG is absent (and a single SIGNAL_SPEC
|
||||||
is supplied) or `-', each specified signal is reset to its original
|
is supplied) or `-', each specified signal is reset to its original
|
||||||
value. If ARG is the null string each SIGNAL_SPEC is ignored by the
|
value. If ARG is the null string each SIGNAL_SPEC is ignored by the
|
||||||
shell and by the commands it invokes. If a SIGNAL_SPEC is EXIT (0)
|
shell and by the commands it invokes.
|
||||||
the command ARG is executed on exit from the shell. If a SIGNAL_SPEC
|
|
||||||
is DEBUG, ARG is executed after every simple command. If the`-p' option
|
If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell. If
|
||||||
is supplied then the trap commands associated with each SIGNAL_SPEC are
|
a SIGNAL_SPEC is DEBUG, ARG is executed before every simple command.
|
||||||
displayed. If no arguments are supplied or if only `-p' is given, trap
|
|
||||||
prints the list of commands associated with each signal. Each SIGNAL_SPEC
|
If no arguments are supplied, trap prints the list of commands associated
|
||||||
is either a signal name in <signal.h> or a signal number. Signal names
|
with each signal.
|
||||||
are case insensitive and the SIG prefix is optional. `trap -l' prints
|
|
||||||
a list of signal names and their corresponding numbers. Note that a
|
Options:
|
||||||
signal can be sent to the shell with "kill -signal $$".
|
-l print a list of signal names and their corresponding numbers
|
||||||
|
-p display the trap commands associated with each SIGNAL_SPEC
|
||||||
|
|
||||||
|
Each SIGNAL_SPEC is either a signal name in <signal.h> or a signal number.
|
||||||
|
Signal names are case insensitive and the SIG prefix is optional. A
|
||||||
|
signal may be sent to the shell with "kill -signal $$".
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless a SIGSPEC is invalid or an invalid option is given.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -112,9 +124,9 @@ trap_builtin (list)
|
||||||
opt = DSIG_NOCASE|DSIG_SIGPREFIX; /* flags for decode_signal */
|
opt = DSIG_NOCASE|DSIG_SIGPREFIX; /* flags for decode_signal */
|
||||||
|
|
||||||
if (list_signal_names)
|
if (list_signal_names)
|
||||||
return (display_signal_list ((WORD_LIST *)NULL, 1));
|
return (sh_chkwrite (display_signal_list ((WORD_LIST *)NULL, 1)));
|
||||||
else if (display || list == 0)
|
else if (display || list == 0)
|
||||||
return (display_traps (list));
|
return (sh_chkwrite (display_traps (list)));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *first_arg;
|
char *first_arg;
|
||||||
|
|
|
||||||
|
|
@ -1,50 +1,53 @@
|
||||||
This file is type.def, from which is created type.c.
|
This file is type.def, from which is created type.c.
|
||||||
It implements the builtin "type" in Bash.
|
It implements the builtin "type" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2002 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES type.c
|
$PRODUCES type.c
|
||||||
|
|
||||||
$BUILTIN type
|
$BUILTIN type
|
||||||
$FUNCTION type_builtin
|
$FUNCTION type_builtin
|
||||||
$SHORT_DOC type [-afptP] name [name ...]
|
$SHORT_DOC type [-afptP] name [name ...]
|
||||||
|
Display information about command type.
|
||||||
|
|
||||||
For each NAME, indicate how it would be interpreted if used as a
|
For each NAME, indicate how it would be interpreted if used as a
|
||||||
command name.
|
command name.
|
||||||
|
|
||||||
If the -t option is used, `type' outputs a single word which is one of
|
Options:
|
||||||
`alias', `keyword', `function', `builtin', `file' or `', if NAME is an
|
-a display all locations containing an executable named NAME;
|
||||||
alias, shell reserved word, shell function, shell builtin, disk file,
|
includes aliases, builtins, and functions, if and only if
|
||||||
or unfound, respectively.
|
the `-p' option is not also used
|
||||||
|
-f suppress shell function lookup
|
||||||
|
-P force a PATH search for each NAME, even if it is an alias,
|
||||||
|
builtin, or function, and returns the name of the disk file
|
||||||
|
that would be executed
|
||||||
|
-p returns either the name of the disk file that would be executed,
|
||||||
|
or nothing if `type -t NAME' would not return `file'.
|
||||||
|
-t output a single word which is one of `alias', `keyword',
|
||||||
|
`function', `builtin', `file' or `', if NAME is an alias, shell
|
||||||
|
reserved word, shell function, shell builtin, disk file, or not
|
||||||
|
found, respectively
|
||||||
|
|
||||||
If the -p flag is used, `type' either returns the name of the disk
|
Arguments:
|
||||||
file that would be executed, or nothing if `type -t NAME' would not
|
NAME Command name to be interpreted.
|
||||||
return `file'.
|
|
||||||
|
|
||||||
If the -a flag is used, `type' displays all of the places that contain
|
Exit Status:
|
||||||
an executable named `file'. This includes aliases, builtins, and
|
Returns success if all of the NAMEs are found; fails if any are not found.
|
||||||
functions, if and only if the -p flag is not also used.
|
|
||||||
|
|
||||||
The -f flag suppresses shell function lookup.
|
|
||||||
|
|
||||||
The -P flag forces a PATH search for each NAME, even if it is an alias,
|
|
||||||
builtin, or function, and returns the name of the disk file that would
|
|
||||||
be executed.
|
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -108,14 +111,14 @@ int
|
||||||
type_builtin (list)
|
type_builtin (list)
|
||||||
WORD_LIST *list;
|
WORD_LIST *list;
|
||||||
{
|
{
|
||||||
int dflags, successful_finds, opt;
|
int dflags, any_failed, opt;
|
||||||
WORD_LIST *this;
|
WORD_LIST *this;
|
||||||
|
|
||||||
if (list == 0)
|
if (list == 0)
|
||||||
return (EXECUTION_SUCCESS);
|
return (EXECUTION_SUCCESS);
|
||||||
|
|
||||||
dflags = CDESC_SHORTDESC; /* default */
|
dflags = CDESC_SHORTDESC; /* default */
|
||||||
successful_finds = 0;
|
any_failed = 0;
|
||||||
|
|
||||||
/* Handle the obsolescent `-type', `-path', and `-all' by prescanning
|
/* Handle the obsolescent `-type', `-path', and `-all' by prescanning
|
||||||
the arguments and converting those options to the form that
|
the arguments and converting those options to the form that
|
||||||
|
|
@ -181,13 +184,12 @@ type_builtin (list)
|
||||||
if (!found && (dflags & (CDESC_PATH_ONLY|CDESC_TYPE)) == 0)
|
if (!found && (dflags & (CDESC_PATH_ONLY|CDESC_TYPE)) == 0)
|
||||||
sh_notfound (list->word->word);
|
sh_notfound (list->word->word);
|
||||||
|
|
||||||
successful_finds += found;
|
any_failed += found == 0;
|
||||||
list = list->next;
|
list = list->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
fflush (stdout);
|
opt = (any_failed == 0) ? EXECUTION_SUCCESS : EXECUTION_FAILURE;
|
||||||
|
return (sh_chkwrite (opt));
|
||||||
return ((successful_finds != 0) ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -267,18 +269,14 @@ describe_command (command, dflags)
|
||||||
puts ("function");
|
puts ("function");
|
||||||
else if (dflags & CDESC_SHORTDESC)
|
else if (dflags & CDESC_SHORTDESC)
|
||||||
{
|
{
|
||||||
#define PRETTY_PRINT_FUNC 1
|
|
||||||
char *result;
|
char *result;
|
||||||
|
|
||||||
printf (_("%s is a function\n"), command);
|
printf (_("%s is a function\n"), command);
|
||||||
|
|
||||||
/* We're blowing away THE_PRINTED_COMMAND here... */
|
/* We're blowing away THE_PRINTED_COMMAND here... */
|
||||||
|
|
||||||
result = named_function_string (command,
|
result = named_function_string (command, function_cell (func), FUNC_MULTILINE|FUNC_EXTERNAL);
|
||||||
(COMMAND *) function_cell (func),
|
|
||||||
PRETTY_PRINT_FUNC);
|
|
||||||
printf ("%s\n", result);
|
printf ("%s\n", result);
|
||||||
#undef PRETTY_PRINT_FUNC
|
|
||||||
}
|
}
|
||||||
else if (dflags & CDESC_REUSABLE)
|
else if (dflags & CDESC_REUSABLE)
|
||||||
printf ("%s\n", command);
|
printf ("%s\n", command);
|
||||||
|
|
@ -390,7 +388,7 @@ describe_command (command, dflags)
|
||||||
if (dflags & CDESC_TYPE)
|
if (dflags & CDESC_TYPE)
|
||||||
puts ("file");
|
puts ("file");
|
||||||
else if (dflags & CDESC_SHORTDESC)
|
else if (dflags & CDESC_SHORTDESC)
|
||||||
printf ("%s is %s\n", command, full_path);
|
printf (_("%s is %s\n"), command, full_path);
|
||||||
else if (dflags & (CDESC_REUSABLE|CDESC_PATH_ONLY))
|
else if (dflags & (CDESC_REUSABLE|CDESC_PATH_ONLY))
|
||||||
printf ("%s\n", full_path);
|
printf ("%s\n", full_path);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,37 +1,39 @@
|
||||||
This file is ulimit.def, from which is created ulimit.c.
|
This file is ulimit.def, from which is created ulimit.c.
|
||||||
It implements the builtin "ulimit" in Bash.
|
It implements the builtin "ulimit" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES ulimit.c
|
$PRODUCES ulimit.c
|
||||||
|
|
||||||
$BUILTIN ulimit
|
$BUILTIN ulimit
|
||||||
$FUNCTION ulimit_builtin
|
$FUNCTION ulimit_builtin
|
||||||
$DEPENDS_ON !_MINIX
|
$DEPENDS_ON !_MINIX
|
||||||
$SHORT_DOC ulimit [-SHacdfilmnpqstuvx] [limit]
|
$SHORT_DOC ulimit [-SHacdefilmnpqrstuvx] [limit]
|
||||||
Ulimit provides control over the resources available to processes
|
Modify shell resource limits.
|
||||||
started by the shell, on systems that allow such control. If an
|
|
||||||
option is given, it is interpreted as follows:
|
|
||||||
|
|
||||||
|
Provides control over the resources available to the shell and processes
|
||||||
|
it creates, on systems that allow such control.
|
||||||
|
|
||||||
|
Options:
|
||||||
-S use the `soft' resource limit
|
-S use the `soft' resource limit
|
||||||
-H use the `hard' resource limit
|
-H use the `hard' resource limit
|
||||||
-a all current limits are reported
|
-a all current limits are reported
|
||||||
|
-b the socket buffer size
|
||||||
-c the maximum size of core files created
|
-c the maximum size of core files created
|
||||||
-d the maximum size of a process's data segment
|
-d the maximum size of a process's data segment
|
||||||
-e the maximum scheduling priority (`nice')
|
-e the maximum scheduling priority (`nice')
|
||||||
|
|
@ -49,14 +51,18 @@ option is given, it is interpreted as follows:
|
||||||
-v the size of virtual memory
|
-v the size of virtual memory
|
||||||
-x the maximum number of file locks
|
-x the maximum number of file locks
|
||||||
|
|
||||||
If LIMIT is given, it is the new value of the specified resource;
|
If LIMIT is given, it is the new value of the specified resource; the
|
||||||
the special LIMIT values `soft', `hard', and `unlimited' stand for
|
special LIMIT values `soft', `hard', and `unlimited' stand for the
|
||||||
the current soft limit, the current hard limit, and no limit, respectively.
|
current soft limit, the current hard limit, and no limit, respectively.
|
||||||
Otherwise, the current value of the specified resource is printed.
|
Otherwise, the current value of the specified resource is printed. If
|
||||||
If no option is given, then -f is assumed. Values are in 1024-byte
|
no option is given, then -f is assumed.
|
||||||
increments, except for -t, which is in seconds, -p, which is in
|
|
||||||
increments of 512 bytes, and -u, which is an unscaled number of
|
Values are in 1024-byte increments, except for -t, which is in seconds,
|
||||||
processes.
|
-p, which is in increments of 512 bytes, and -u, which is an unscaled
|
||||||
|
number of processes.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless an invalid option is supplied or an error occurs.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#if !defined (_MINIX)
|
#if !defined (_MINIX)
|
||||||
|
|
@ -98,7 +104,7 @@ extern int errno;
|
||||||
# if defined (HPUX) && defined (RLIMIT_NEEDS_KERNEL)
|
# if defined (HPUX) && defined (RLIMIT_NEEDS_KERNEL)
|
||||||
# undef _KERNEL
|
# undef _KERNEL
|
||||||
# endif
|
# endif
|
||||||
#else
|
#elif defined (HAVE_SYS_TIMES_H)
|
||||||
# include <sys/times.h>
|
# include <sys/times.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -172,6 +178,14 @@ extern int errno;
|
||||||
#define LIMIT_HARD 0x01
|
#define LIMIT_HARD 0x01
|
||||||
#define LIMIT_SOFT 0x02
|
#define LIMIT_SOFT 0x02
|
||||||
|
|
||||||
|
/* "Blocks" are defined as 512 bytes when in Posix mode and 1024 bytes
|
||||||
|
otherwise. */
|
||||||
|
#define POSIXBLK -2
|
||||||
|
|
||||||
|
#define BLOCKSIZE(x) (((x) == POSIXBLK) ? (posixly_correct ? 512 : 1024) : (x))
|
||||||
|
|
||||||
|
extern int posixly_correct;
|
||||||
|
|
||||||
static int _findlim __P((int));
|
static int _findlim __P((int));
|
||||||
|
|
||||||
static int ulimit_internal __P((int, char *, int, int));
|
static int ulimit_internal __P((int, char *, int, int));
|
||||||
|
|
@ -193,13 +207,19 @@ typedef struct {
|
||||||
int option; /* The ulimit option for this limit. */
|
int option; /* The ulimit option for this limit. */
|
||||||
int parameter; /* Parameter to pass to get_limit (). */
|
int parameter; /* Parameter to pass to get_limit (). */
|
||||||
int block_factor; /* Blocking factor for specific limit. */
|
int block_factor; /* Blocking factor for specific limit. */
|
||||||
char *description; /* Descriptive string to output. */
|
const char * const description; /* Descriptive string to output. */
|
||||||
char *units; /* scale */
|
const char * const units; /* scale */
|
||||||
} RESOURCE_LIMITS;
|
} RESOURCE_LIMITS;
|
||||||
|
|
||||||
static RESOURCE_LIMITS limits[] = {
|
static RESOURCE_LIMITS limits[] = {
|
||||||
|
#ifdef RLIMIT_PTHREAD
|
||||||
|
{ 'T', RLIMIT_PTHREAD, 1, "number of threads", (char *)NULL },
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_SBSIZE
|
||||||
|
{ 'b', RLIMIT_SBSIZE, 1, "socket buffer size", "bytes" },
|
||||||
|
#endif
|
||||||
#ifdef RLIMIT_CORE
|
#ifdef RLIMIT_CORE
|
||||||
{ 'c', RLIMIT_CORE, 1024, "core file size", "blocks" },
|
{ 'c', RLIMIT_CORE, POSIXBLK, "core file size", "blocks" },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_DATA
|
#ifdef RLIMIT_DATA
|
||||||
{ 'd', RLIMIT_DATA, 1024, "data seg size", "kbytes" },
|
{ 'd', RLIMIT_DATA, 1024, "data seg size", "kbytes" },
|
||||||
|
|
@ -207,7 +227,7 @@ static RESOURCE_LIMITS limits[] = {
|
||||||
#ifdef RLIMIT_NICE
|
#ifdef RLIMIT_NICE
|
||||||
{ 'e', RLIMIT_NICE, 1, "scheduling priority", (char *)NULL },
|
{ 'e', RLIMIT_NICE, 1, "scheduling priority", (char *)NULL },
|
||||||
#endif
|
#endif
|
||||||
{ 'f', RLIMIT_FILESIZE, 1024, "file size", "blocks" },
|
{ 'f', RLIMIT_FILESIZE, POSIXBLK, "file size", "blocks" },
|
||||||
#ifdef RLIMIT_SIGPENDING
|
#ifdef RLIMIT_SIGPENDING
|
||||||
{ 'i', RLIMIT_SIGPENDING, 1, "pending signals", (char *)NULL },
|
{ 'i', RLIMIT_SIGPENDING, 1, "pending signals", (char *)NULL },
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -356,7 +376,7 @@ ulimit_builtin (list)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
print_all_limits (mode == 0 ? LIMIT_SOFT : mode);
|
print_all_limits (mode == 0 ? LIMIT_SOFT : mode);
|
||||||
return (EXECUTION_SUCCESS);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* default is `ulimit -f' */
|
/* default is `ulimit -f' */
|
||||||
|
|
@ -425,12 +445,12 @@ ulimit_internal (cmd, cmdarg, mode, multiple)
|
||||||
else if (all_digits (cmdarg))
|
else if (all_digits (cmdarg))
|
||||||
{
|
{
|
||||||
limit = string_to_rlimtype (cmdarg);
|
limit = string_to_rlimtype (cmdarg);
|
||||||
block_factor = limits[limind].block_factor;
|
block_factor = BLOCKSIZE(limits[limind].block_factor);
|
||||||
real_limit = limit * block_factor;
|
real_limit = limit * block_factor;
|
||||||
|
|
||||||
if ((real_limit / block_factor) != limit)
|
if ((real_limit / block_factor) != limit)
|
||||||
{
|
{
|
||||||
sh_erange (cmdarg, "limit");
|
sh_erange (cmdarg, _("limit"));
|
||||||
return (EXECUTION_FAILURE);
|
return (EXECUTION_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -687,7 +707,9 @@ printone (limind, curlim, pdesc)
|
||||||
int pdesc;
|
int pdesc;
|
||||||
{
|
{
|
||||||
char unitstr[64];
|
char unitstr[64];
|
||||||
|
int factor;
|
||||||
|
|
||||||
|
factor = BLOCKSIZE(limits[limind].block_factor);
|
||||||
if (pdesc)
|
if (pdesc)
|
||||||
{
|
{
|
||||||
if (limits[limind].units)
|
if (limits[limind].units)
|
||||||
|
|
@ -704,7 +726,7 @@ printone (limind, curlim, pdesc)
|
||||||
else if (curlim == RLIM_SAVED_CUR)
|
else if (curlim == RLIM_SAVED_CUR)
|
||||||
puts ("soft");
|
puts ("soft");
|
||||||
else
|
else
|
||||||
print_rlimtype ((curlim / limits[limind].block_factor), 1);
|
print_rlimtype ((curlim / factor), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set all limits to NEWLIM. NEWLIM currently must be RLIM_INFINITY, which
|
/* Set all limits to NEWLIM. NEWLIM currently must be RLIM_INFINITY, which
|
||||||
|
|
@ -740,7 +762,7 @@ set_all_limits (mode, newlim)
|
||||||
for (retval = i = 0; limits[i].option > 0; i++)
|
for (retval = i = 0; limits[i].option > 0; i++)
|
||||||
if (set_limit (i, newlim, mode) < 0)
|
if (set_limit (i, newlim, mode) < 0)
|
||||||
{
|
{
|
||||||
builtin_error ("%s: cannot modify limit: %s", limits[i].description,
|
builtin_error (_("%s: cannot modify limit: %s"), limits[i].description,
|
||||||
strerror (errno));
|
strerror (errno));
|
||||||
retval = 1;
|
retval = 1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,36 +1,42 @@
|
||||||
This file is umask.def, from which is created umask.c.
|
This file is umask.def, from which is created umask.c.
|
||||||
It implements the builtin "umask" in Bash.
|
It implements the builtin "umask" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2004 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$PRODUCES umask.c
|
$PRODUCES umask.c
|
||||||
|
|
||||||
$BUILTIN umask
|
$BUILTIN umask
|
||||||
$FUNCTION umask_builtin
|
$FUNCTION umask_builtin
|
||||||
$SHORT_DOC umask [-p] [-S] [mode]
|
$SHORT_DOC umask [-p] [-S] [mode]
|
||||||
The user file-creation mask is set to MODE. If MODE is omitted, or if
|
Display or set file mode mask.
|
||||||
`-S' is supplied, the current value of the mask is printed. The `-S'
|
|
||||||
option makes the output symbolic; otherwise an octal number is output.
|
Sets the user file-creation mask to MODE. If MODE is omitted, prints
|
||||||
If `-p' is supplied, and MODE is omitted, the output is in a form
|
the current value of the mask.
|
||||||
that may be used as input. If MODE begins with a digit, it is
|
|
||||||
interpreted as an octal number, otherwise it is a symbolic mode string
|
If MODE begins with a digit, it is interpreted as an octal number;
|
||||||
like that accepted by chmod(1).
|
otherwise it is a symbolic mode string like that accepted by chmod(1).
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-p if MODE is omitted, output in a form that may be reused as input
|
||||||
|
-S makes the output symbolic; otherwise an octal number is output
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns success unless MODE is invalid or an invalid option is given.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
@ -137,8 +143,7 @@ umask_builtin (list)
|
||||||
printf ("%04lo\n", (unsigned long)umask_arg);
|
printf ("%04lo\n", (unsigned long)umask_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
fflush (stdout);
|
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||||
return (EXECUTION_SUCCESS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print the umask in a symbolic form. In the output, a letter is
|
/* Print the umask in a symbolic form. In the output, a letter is
|
||||||
|
|
|
||||||
|
|
@ -1,44 +1,54 @@
|
||||||
This file is wait.def, from which is created wait.c.
|
This file is wait.def, from which is created wait.c.
|
||||||
It implements the builtin "wait" in Bash.
|
It implements the builtin "wait" in Bash.
|
||||||
|
|
||||||
Copyright (C) 1987-2005 Free Software Foundation, Inc.
|
Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
|
||||||
|
|
||||||
$BUILTIN wait
|
$BUILTIN wait
|
||||||
$FUNCTION wait_builtin
|
$FUNCTION wait_builtin
|
||||||
$DEPENDS_ON JOB_CONTROL
|
$DEPENDS_ON JOB_CONTROL
|
||||||
$PRODUCES wait.c
|
$PRODUCES wait.c
|
||||||
$SHORT_DOC wait [n]
|
$SHORT_DOC wait [id]
|
||||||
Wait for the specified process and report its termination status. If
|
Wait for job completion and return exit status.
|
||||||
N is not given, all currently active child processes are waited for,
|
|
||||||
and the return code is zero. N may be a process ID or a job
|
Waits for the process identified by ID, which may be a process ID or a
|
||||||
specification; if a job spec is given, all processes in the job's
|
job specification, and reports its termination status. If ID is not
|
||||||
pipeline are waited for.
|
given, waits for all currently active child processes, and the return
|
||||||
|
status is zero. If ID is a a job specification, waits for all processes
|
||||||
|
in the job's pipeline.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of ID; fails if ID is invalid or an invalid option is
|
||||||
|
given.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
$BUILTIN wait
|
$BUILTIN wait
|
||||||
$FUNCTION wait_builtin
|
$FUNCTION wait_builtin
|
||||||
$DEPENDS_ON !JOB_CONTROL
|
$DEPENDS_ON !JOB_CONTROL
|
||||||
$SHORT_DOC wait [n]
|
$SHORT_DOC wait [pid]
|
||||||
Wait for the specified process and report its termination status. If
|
Wait for process completion and return exit status.
|
||||||
N is not given, all currently active child processes are waited for,
|
|
||||||
and the return code is zero. N is a process ID; if it is not given,
|
Waits for the specified process and reports its termination status. If
|
||||||
all child processes of the shell are waited for.
|
PID is not given, all currently active child processes are waited for,
|
||||||
|
and the return code is zero. PID must be a process ID.
|
||||||
|
|
||||||
|
Exit Status:
|
||||||
|
Returns the status of ID; fails if ID is invalid or an invalid option is
|
||||||
|
given.
|
||||||
$END
|
$END
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
|
||||||
60
command.h
60
command.h
|
|
@ -1,23 +1,23 @@
|
||||||
/* command.h -- The structures used internally to represent commands, and
|
/* command.h -- The structures used internally to represent commands, and
|
||||||
the extern declarations of the functions used to create them. */
|
the extern declarations of the functions used to create them. */
|
||||||
|
|
||||||
/* Copyright (C) 1993-2005 Free Software Foundation, Inc.
|
/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#if !defined (_COMMAND_H_)
|
#if !defined (_COMMAND_H_)
|
||||||
#define _COMMAND_H_
|
#define _COMMAND_H_
|
||||||
|
|
@ -31,7 +31,8 @@ enum r_instruction {
|
||||||
r_duplicating_input, r_duplicating_output, r_deblank_reading_until,
|
r_duplicating_input, r_duplicating_output, r_deblank_reading_until,
|
||||||
r_close_this, r_err_and_out, r_input_output, r_output_force,
|
r_close_this, r_err_and_out, r_input_output, r_output_force,
|
||||||
r_duplicating_input_word, r_duplicating_output_word,
|
r_duplicating_input_word, r_duplicating_output_word,
|
||||||
r_move_input, r_move_output, r_move_input_word, r_move_output_word
|
r_move_input, r_move_output, r_move_input_word, r_move_output_word,
|
||||||
|
r_append_err_and_out
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Redirection errors. */
|
/* Redirection errors. */
|
||||||
|
|
@ -44,7 +45,7 @@ enum r_instruction {
|
||||||
(ri == r_output_direction || ri == r_err_and_out)
|
(ri == r_output_direction || ri == r_err_and_out)
|
||||||
|
|
||||||
#define OUTPUT_REDIRECT(ri) \
|
#define OUTPUT_REDIRECT(ri) \
|
||||||
(ri == r_output_direction || ri == r_input_output || ri == r_err_and_out)
|
(ri == r_output_direction || ri == r_input_output || ri == r_err_and_out || ri == r_append_err_and_out)
|
||||||
|
|
||||||
#define INPUT_REDIRECT(ri) \
|
#define INPUT_REDIRECT(ri) \
|
||||||
(ri == r_input_direction || ri == r_inputa_direction || ri == r_input_output)
|
(ri == r_input_direction || ri == r_inputa_direction || ri == r_input_output)
|
||||||
|
|
@ -54,6 +55,7 @@ enum r_instruction {
|
||||||
ri == r_input_output || \
|
ri == r_input_output || \
|
||||||
ri == r_err_and_out || \
|
ri == r_err_and_out || \
|
||||||
ri == r_appending_to || \
|
ri == r_appending_to || \
|
||||||
|
ri == r_append_err_and_out || \
|
||||||
ri == r_output_force)
|
ri == r_output_force)
|
||||||
|
|
||||||
/* redirection needs translation */
|
/* redirection needs translation */
|
||||||
|
|
@ -64,7 +66,7 @@ enum r_instruction {
|
||||||
/* Command Types: */
|
/* Command Types: */
|
||||||
enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
|
enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
|
||||||
cm_connection, cm_function_def, cm_until, cm_group,
|
cm_connection, cm_function_def, cm_until, cm_group,
|
||||||
cm_arith, cm_cond, cm_arith_for, cm_subshell };
|
cm_arith, cm_cond, cm_arith_for, cm_subshell, cm_coproc };
|
||||||
|
|
||||||
/* Possible values for the `flags' field of a WORD_DESC. */
|
/* Possible values for the `flags' field of a WORD_DESC. */
|
||||||
#define W_HASDOLLAR 0x000001 /* Dollar sign present. */
|
#define W_HASDOLLAR 0x000001 /* Dollar sign present. */
|
||||||
|
|
@ -88,6 +90,8 @@ enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
|
||||||
#define W_HASQUOTEDNULL 0x040000 /* word contains a quoted null character */
|
#define W_HASQUOTEDNULL 0x040000 /* word contains a quoted null character */
|
||||||
#define W_DQUOTE 0x080000 /* word should be treated as if double-quoted */
|
#define W_DQUOTE 0x080000 /* word should be treated as if double-quoted */
|
||||||
#define W_NOPROCSUB 0x100000 /* don't perform process substitution */
|
#define W_NOPROCSUB 0x100000 /* don't perform process substitution */
|
||||||
|
#define W_HASCTLESC 0x200000 /* word contains literal CTLESC characters */
|
||||||
|
#define W_ASSIGNASSOC 0x400000 /* word looks like associative array assignment */
|
||||||
|
|
||||||
/* 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 &' */
|
||||||
|
|
@ -95,6 +99,8 @@ enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
|
||||||
#define SUBSHELL_COMSUB 0x04 /* subshell caused by `command` or $(command) */
|
#define SUBSHELL_COMSUB 0x04 /* subshell caused by `command` or $(command) */
|
||||||
#define SUBSHELL_FORK 0x08 /* subshell caused by executing a disk command */
|
#define SUBSHELL_FORK 0x08 /* subshell caused by executing a disk command */
|
||||||
#define SUBSHELL_PIPE 0x10 /* subshell from a pipeline element */
|
#define SUBSHELL_PIPE 0x10 /* subshell from a pipeline element */
|
||||||
|
#define SUBSHELL_PROCSUB 0x20 /* subshell caused by <(command) or >(command) */
|
||||||
|
#define SUBSHELL_COPROC 0x40 /* subshell from a coproc pipeline */
|
||||||
|
|
||||||
/* A structure which represents a word. */
|
/* A structure which represents a word. */
|
||||||
typedef struct word_desc {
|
typedef struct word_desc {
|
||||||
|
|
@ -156,6 +162,7 @@ typedef struct element {
|
||||||
#define CMD_AMPERSAND 0x200 /* command & */
|
#define CMD_AMPERSAND 0x200 /* command & */
|
||||||
#define CMD_STDIN_REDIR 0x400 /* async command needs implicit </dev/null */
|
#define CMD_STDIN_REDIR 0x400 /* async command needs implicit </dev/null */
|
||||||
#define CMD_COMMAND_BUILTIN 0x0800 /* command executed by `command' builtin */
|
#define CMD_COMMAND_BUILTIN 0x0800 /* command executed by `command' builtin */
|
||||||
|
#define CMD_COPROC_SUBSHELL 0x1000
|
||||||
|
|
||||||
/* What a command looks like. */
|
/* What a command looks like. */
|
||||||
typedef struct command {
|
typedef struct command {
|
||||||
|
|
@ -185,6 +192,7 @@ typedef struct command {
|
||||||
struct arith_for_com *ArithFor;
|
struct arith_for_com *ArithFor;
|
||||||
#endif
|
#endif
|
||||||
struct subshell_com *Subshell;
|
struct subshell_com *Subshell;
|
||||||
|
struct coproc_com *Coproc;
|
||||||
} value;
|
} value;
|
||||||
} COMMAND;
|
} COMMAND;
|
||||||
|
|
||||||
|
|
@ -198,6 +206,10 @@ typedef struct connection {
|
||||||
|
|
||||||
/* Structures used to represent the CASE command. */
|
/* Structures used to represent the CASE command. */
|
||||||
|
|
||||||
|
/* Values for FLAGS word in a PATTERN_LIST */
|
||||||
|
#define CASEPAT_FALLTHROUGH 0x01
|
||||||
|
#define CASEPAT_TESTNEXT 0x02
|
||||||
|
|
||||||
/* Pattern/action structure for CASE_COM. */
|
/* Pattern/action structure for CASE_COM. */
|
||||||
typedef struct pattern_list {
|
typedef struct pattern_list {
|
||||||
struct pattern_list *next; /* Clause to try in case this one failed. */
|
struct pattern_list *next; /* Clause to try in case this one failed. */
|
||||||
|
|
@ -322,7 +334,25 @@ typedef struct subshell_com {
|
||||||
COMMAND *command;
|
COMMAND *command;
|
||||||
} SUBSHELL_COM;
|
} SUBSHELL_COM;
|
||||||
|
|
||||||
|
typedef struct coproc {
|
||||||
|
char *c_name;
|
||||||
|
pid_t c_pid;
|
||||||
|
int c_rfd;
|
||||||
|
int c_wfd;
|
||||||
|
int c_rsave;
|
||||||
|
int c_wsave;
|
||||||
|
int c_flags;
|
||||||
|
int c_status;
|
||||||
|
} Coproc;
|
||||||
|
|
||||||
|
typedef struct coproc_com {
|
||||||
|
int flags;
|
||||||
|
char *name;
|
||||||
|
COMMAND *command;
|
||||||
|
} COPROC_COM;
|
||||||
|
|
||||||
extern COMMAND *global_command;
|
extern COMMAND *global_command;
|
||||||
|
extern Coproc sh_coproc;
|
||||||
|
|
||||||
/* Possible command errors */
|
/* Possible command errors */
|
||||||
#define CMDERR_DEFAULT 0
|
#define CMDERR_DEFAULT 0
|
||||||
|
|
|
||||||
24
config-bot.h
24
config-bot.h
|
|
@ -1,23 +1,23 @@
|
||||||
/* config-bot.h */
|
/* config-bot.h */
|
||||||
/* modify settings or make new ones based on what autoconf tells us. */
|
/* modify settings or make new ones based on what autoconf tells us. */
|
||||||
|
|
||||||
/* Copyright (C) 1989-2007 Free Software Foundation, Inc.
|
/* Copyright (C) 1989-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
/*********************************************************/
|
/*********************************************************/
|
||||||
/* Modify or set defines based on the configure results. */
|
/* Modify or set defines based on the configure results. */
|
||||||
|
|
|
||||||
49
config-top.h
49
config-top.h
|
|
@ -1,25 +1,22 @@
|
||||||
/* config-top.h */
|
/* config-top.h - various user-settable options not under the control of autoconf. */
|
||||||
|
|
||||||
/* This contains various user-settable options not under the control of
|
/* Copyright (C) 2002-2009 Free Software Foundation, Inc.
|
||||||
autoconf. */
|
|
||||||
|
|
||||||
/* Copyright (C) 2002 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it under
|
Bash is free software: you can redistribute it and/or modify
|
||||||
the terms of the GNU General Public License as published by the Free
|
it under the terms of the GNU General Public License as published by
|
||||||
Software Foundation; either version 2, or (at your option) any later
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
|
Bash is distributed in the hope that it will be useful,
|
||||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with Bash; see the file COPYING. If not, write to the Free Software
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
/* Define CONTINUE_AFTER_KILL_ERROR if you want the kill command to
|
/* Define CONTINUE_AFTER_KILL_ERROR if you want the kill command to
|
||||||
continue processing arguments after one of them fails. This is
|
continue processing arguments after one of them fails. This is
|
||||||
|
|
@ -46,9 +43,14 @@
|
||||||
#define V9_ECHO
|
#define V9_ECHO
|
||||||
|
|
||||||
/* Define DONT_REPORT_SIGPIPE if you don't want to see `Broken pipe' messages
|
/* Define DONT_REPORT_SIGPIPE if you don't want to see `Broken pipe' messages
|
||||||
when a job like `cat jobs.c | exit 1' is executed. */
|
when a job like `cat jobs.c | exit 1' terminates due to a SIGPIPE. */
|
||||||
#define DONT_REPORT_SIGPIPE
|
#define DONT_REPORT_SIGPIPE
|
||||||
|
|
||||||
|
/* Define DONT_REPORT_BROKEN_PIPE_WRITE_ERRORS if you don't want builtins
|
||||||
|
like `echo' and `printf' to report errors when output does not succeed
|
||||||
|
due to EPIPE. */
|
||||||
|
/* #define DONT_REPORT_BROKEN_PIPE_WRITE_ERRORS */
|
||||||
|
|
||||||
/* The default value of the PATH variable. */
|
/* The default value of the PATH variable. */
|
||||||
#ifndef DEFAULT_PATH_VALUE
|
#ifndef DEFAULT_PATH_VALUE
|
||||||
#define DEFAULT_PATH_VALUE \
|
#define DEFAULT_PATH_VALUE \
|
||||||
|
|
@ -83,5 +85,16 @@
|
||||||
/* #define NON_INTERACTIVE_LOGIN_SHELLS */
|
/* #define NON_INTERACTIVE_LOGIN_SHELLS */
|
||||||
|
|
||||||
/* Define this if you want bash to try to check whether it's being run by
|
/* Define this if you want bash to try to check whether it's being run by
|
||||||
sshd and source the .bashrc if so (like the rshd behavior). */
|
sshd and source the .bashrc if so (like the rshd behavior). This checks
|
||||||
|
for the presence of SSH_CLIENT or SSH2_CLIENT in the initial environment,
|
||||||
|
which can be fooled under certain not-uncommon circumstances. */
|
||||||
/* #define SSH_SOURCE_BASHRC */
|
/* #define SSH_SOURCE_BASHRC */
|
||||||
|
|
||||||
|
/* Define if you want the case-capitalizing operators (~[~]) and the
|
||||||
|
`capcase' variable attribute (declare -c). */
|
||||||
|
#define CASEMOD_CAPCASE
|
||||||
|
|
||||||
|
/* This is used as the name of a shell function to call when a command
|
||||||
|
name is not found. If you want to name it something other than the
|
||||||
|
default ("command_not_found_handle"), change it here. */
|
||||||
|
/* #define NOTFOUND_HOOK "command_not_found_handle" */
|
||||||
|
|
|
||||||
49
config.h.in
49
config.h.in
|
|
@ -1,22 +1,22 @@
|
||||||
/* config.h -- Configuration file for bash. */
|
/* config.h -- Configuration file for bash. */
|
||||||
|
|
||||||
/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
|
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Bash, the Bourne Again SHell.
|
This file is part of GNU Bash, the Bourne Again SHell.
|
||||||
|
|
||||||
Bash is free software; you can redistribute it and/or modify it
|
Bash is free software: you can redistribute it and/or modify
|
||||||
under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Bash is distributed in the hope that it will be useful, but WITHOUT
|
Bash is distributed in the hope that it will be useful,
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Bash; see the file COPYING. If not, write to the Free
|
along with Bash. If not, see <http://www.gnu.org/licenses/>.
|
||||||
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
*/
|
||||||
|
|
||||||
#ifndef _CONFIG_H_
|
#ifndef _CONFIG_H_
|
||||||
#define _CONFIG_H_
|
#define _CONFIG_H_
|
||||||
|
|
@ -123,6 +123,10 @@
|
||||||
=~ binary operator in the [[...]] conditional command. */
|
=~ binary operator in the [[...]] conditional command. */
|
||||||
#define COND_REGEXP
|
#define COND_REGEXP
|
||||||
|
|
||||||
|
/* Define COPROCESS_SUPPORT if you want support for ksh-like coprocesses and
|
||||||
|
the `coproc' reserved word */
|
||||||
|
#define COPROCESS_SUPPORT
|
||||||
|
|
||||||
/* Define ARITH_FOR_COMMAND if you want the ksh93-style
|
/* Define ARITH_FOR_COMMAND if you want the ksh93-style
|
||||||
for (( init; test; step )) do list; done
|
for (( init; test; step )) do list; done
|
||||||
arithmetic for command. */
|
arithmetic for command. */
|
||||||
|
|
@ -155,6 +159,13 @@
|
||||||
/* Define AFS if you are using Transarc's AFS. */
|
/* Define AFS if you are using Transarc's AFS. */
|
||||||
#undef AFS
|
#undef AFS
|
||||||
|
|
||||||
|
/* Define for case-modifying variable attributes; variables modified on
|
||||||
|
assignment */
|
||||||
|
#undef CASEMOD_ATTRS
|
||||||
|
|
||||||
|
/* Define for case-modifying word expansions */
|
||||||
|
#undef CASEMOD_EXPANSIONS
|
||||||
|
|
||||||
#undef ENABLE_NLS
|
#undef ENABLE_NLS
|
||||||
|
|
||||||
/* End of configuration settings controllable by autoconf. */
|
/* End of configuration settings controllable by autoconf. */
|
||||||
|
|
@ -356,7 +367,7 @@
|
||||||
#undef HAVE_SYS_ERRLIST
|
#undef HAVE_SYS_ERRLIST
|
||||||
|
|
||||||
#undef HAVE_TZNAME
|
#undef HAVE_TZNAME
|
||||||
|
#undef HAVE_DECL_TZNAME
|
||||||
|
|
||||||
/* Characteristics of some of the system structures. */
|
/* Characteristics of some of the system structures. */
|
||||||
|
|
||||||
|
|
@ -531,6 +542,14 @@
|
||||||
/* Define if you have the fcntl function. */
|
/* Define if you have the fcntl function. */
|
||||||
#undef HAVE_FCNTL
|
#undef HAVE_FCNTL
|
||||||
|
|
||||||
|
/* Define if you have the fdprintf function. */
|
||||||
|
#undef HAVE_FDPRINTF
|
||||||
|
|
||||||
|
/* Define if you have the fpurge/__fpurge function. */
|
||||||
|
#undef HAVE_FPURGE
|
||||||
|
#undef HAVE___FPURGE
|
||||||
|
#undef HAVE_DECL_FPURGE
|
||||||
|
|
||||||
/* Define if you have the getaddrinfo function. */
|
/* Define if you have the getaddrinfo function. */
|
||||||
#undef HAVE_GETADDRINFO
|
#undef HAVE_GETADDRINFO
|
||||||
|
|
||||||
|
|
@ -633,6 +652,9 @@
|
||||||
/* Define if you have the mbrtowc function. */
|
/* Define if you have the mbrtowc function. */
|
||||||
#undef HAVE_MBRTOWC
|
#undef HAVE_MBRTOWC
|
||||||
|
|
||||||
|
/* Define if you have the mbscmp function. */
|
||||||
|
#undef HAVE_MBSCMP
|
||||||
|
|
||||||
/* Define if you have the mbsrtowcs function. */
|
/* Define if you have the mbsrtowcs function. */
|
||||||
#undef HAVE_MBSRTOWCS
|
#undef HAVE_MBSRTOWCS
|
||||||
|
|
||||||
|
|
@ -678,6 +700,9 @@
|
||||||
/* Define if you have the setenv function. */
|
/* Define if you have the setenv function. */
|
||||||
#undef HAVE_SETENV
|
#undef HAVE_SETENV
|
||||||
|
|
||||||
|
/* Define if you have the setitimer function. */
|
||||||
|
#undef HAVE_SETITIMER
|
||||||
|
|
||||||
/* Define if you have the setlinebuf function. */
|
/* Define if you have the setlinebuf function. */
|
||||||
#undef HAVE_SETLINEBUF
|
#undef HAVE_SETLINEBUF
|
||||||
|
|
||||||
|
|
|
||||||
24522
configure
vendored
Executable file → Normal file
24522
configure
vendored
Executable file → Normal file
File diff suppressed because it is too large
Load diff
76
configure.in
76
configure.in
|
|
@ -1,31 +1,30 @@
|
||||||
dnl
|
dnl
|
||||||
dnl Configure script for bash-3.2
|
dnl Configure script for bash-4.0
|
||||||
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.
|
||||||
|
|
||||||
# Copyright (C) 1987-2007 Free Software Foundation, Inc.
|
# Copyright (C) 1987-2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
# any later version.
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
# 02111-1307, USA.
|
|
||||||
|
|
||||||
AC_REVISION([for Bash 3.2, version 3.190])dnl
|
AC_REVISION([for Bash 4.0, version 4.009])dnl
|
||||||
|
|
||||||
define(bashvers, 3.2)
|
define(bashvers, 4.0)
|
||||||
define(relstatus, release)
|
define(relstatus, rc1)
|
||||||
|
|
||||||
AC_INIT([bash], bashvers-relstatus, [bug-bash@gnu.org])
|
AC_INIT([bash], bashvers-relstatus, [bug-bash@gnu.org])
|
||||||
|
|
||||||
|
|
@ -43,7 +42,7 @@ RELSTATUS=relstatus
|
||||||
|
|
||||||
dnl defaults for debug settings
|
dnl defaults for debug settings
|
||||||
case "$RELSTATUS" in
|
case "$RELSTATUS" in
|
||||||
alp*|bet*|dev*|rc*) DEBUG='-DDEBUG' MALLOC_DEBUG='-DMALLOC_DEBUG' ;;
|
alp*|bet*|dev*|rc*|maint*) DEBUG='-DDEBUG' MALLOC_DEBUG='-DMALLOC_DEBUG' ;;
|
||||||
*) DEBUG= MALLOC_DEBUG= ;;
|
*) DEBUG= MALLOC_DEBUG= ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
@ -149,7 +148,7 @@ if test "$opt_curses" = yes; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test -z "${DEBUGGER_START_FILE}"; then
|
if test -z "${DEBUGGER_START_FILE}"; then
|
||||||
DEBUGGER_START_FILE=${ac_default_prefix}/share/bashdb/bashdb-main.inc
|
DEBUGGER_START_FILE='${datadir}/bashdb/bashdb-main.inc'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl optional shell features in config.h.in
|
dnl optional shell features in config.h.in
|
||||||
|
|
@ -176,6 +175,7 @@ opt_xpg_echo=no
|
||||||
opt_strict_posix=no
|
opt_strict_posix=no
|
||||||
opt_cond_command=yes
|
opt_cond_command=yes
|
||||||
opt_cond_regexp=yes
|
opt_cond_regexp=yes
|
||||||
|
opt_coproc=yes
|
||||||
opt_arith_for_command=yes
|
opt_arith_for_command=yes
|
||||||
opt_net_redirs=yes
|
opt_net_redirs=yes
|
||||||
opt_progcomp=yes
|
opt_progcomp=yes
|
||||||
|
|
@ -183,6 +183,8 @@ opt_separate_help=no
|
||||||
opt_multibyte=yes
|
opt_multibyte=yes
|
||||||
opt_debugger=yes
|
opt_debugger=yes
|
||||||
opt_single_longdoc_strings=yes
|
opt_single_longdoc_strings=yes
|
||||||
|
opt_casemod_attrs=yes
|
||||||
|
opt_casemod_expansions=yes
|
||||||
|
|
||||||
dnl options that affect how bash is compiled and linked
|
dnl options that affect how bash is compiled and linked
|
||||||
opt_static_link=no
|
opt_static_link=no
|
||||||
|
|
@ -201,7 +203,8 @@ if test $opt_minimal_config = yes; then
|
||||||
opt_brace_expansion=no opt_disabled_builtins=no opt_command_timing=no
|
opt_brace_expansion=no opt_disabled_builtins=no opt_command_timing=no
|
||||||
opt_extended_glob=no opt_cond_command=no opt_arith_for_command=no
|
opt_extended_glob=no opt_cond_command=no opt_arith_for_command=no
|
||||||
opt_net_redirs=no opt_progcomp=no opt_separate_help=no
|
opt_net_redirs=no opt_progcomp=no opt_separate_help=no
|
||||||
opt_multibyte=yes opt_cond_regexp=no
|
opt_multibyte=yes opt_cond_regexp=no opt_coproc=no
|
||||||
|
opt_casemod_attrs=no opt_casemod_expansions=no
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE(alias, AC_HELP_STRING([--enable-alias], [enable shell aliases]), opt_alias=$enableval)
|
AC_ARG_ENABLE(alias, AC_HELP_STRING([--enable-alias], [enable shell aliases]), opt_alias=$enableval)
|
||||||
|
|
@ -209,9 +212,12 @@ AC_ARG_ENABLE(arith-for-command, AC_HELP_STRING([--enable-arith-for-command], [e
|
||||||
AC_ARG_ENABLE(array-variables, AC_HELP_STRING([--enable-array-variables], [include shell array variables]), opt_array_variables=$enableval)
|
AC_ARG_ENABLE(array-variables, AC_HELP_STRING([--enable-array-variables], [include shell array variables]), opt_array_variables=$enableval)
|
||||||
AC_ARG_ENABLE(bang-history, AC_HELP_STRING([--enable-bang-history], [turn on csh-style history substitution]), opt_bang_history=$enableval)
|
AC_ARG_ENABLE(bang-history, AC_HELP_STRING([--enable-bang-history], [turn on csh-style history substitution]), opt_bang_history=$enableval)
|
||||||
AC_ARG_ENABLE(brace-expansion, AC_HELP_STRING([--enable-brace-expansion], [include brace expansion]), opt_brace_expansion=$enableval)
|
AC_ARG_ENABLE(brace-expansion, AC_HELP_STRING([--enable-brace-expansion], [include brace expansion]), opt_brace_expansion=$enableval)
|
||||||
|
AC_ARG_ENABLE(casemod-attributes, AC_HELP_STRING([--enable-casemod-attributes], [include case-modifying variable attributes]), opt_casemod_attrs=$enableval)
|
||||||
|
AC_ARG_ENABLE(casemod-expansions, AC_HELP_STRING([--enable-casemod-expansions], [include case-modifying word expansions]), opt_casemod_expansions=$enableval)
|
||||||
AC_ARG_ENABLE(command-timing, AC_HELP_STRING([--enable-command-timing], [enable the time reserved word and command timing]), opt_command_timing=$enableval)
|
AC_ARG_ENABLE(command-timing, AC_HELP_STRING([--enable-command-timing], [enable the time reserved word and command timing]), opt_command_timing=$enableval)
|
||||||
AC_ARG_ENABLE(cond-command, AC_HELP_STRING([--enable-cond-command], [enable the conditional command]), opt_cond_command=$enableval)
|
AC_ARG_ENABLE(cond-command, AC_HELP_STRING([--enable-cond-command], [enable the conditional command]), opt_cond_command=$enableval)
|
||||||
AC_ARG_ENABLE(cond-regexp, AC_HELP_STRING([--enable-cond-regexp], [enable extgended regular expression matching in conditional commands]), opt_cond_regexp=$enableval)
|
AC_ARG_ENABLE(cond-regexp, AC_HELP_STRING([--enable-cond-regexp], [enable extended regular expression matching in conditional commands]), opt_cond_regexp=$enableval)
|
||||||
|
AC_ARG_ENABLE(coprocesses, AC_HELP_STRING([--enable-coprocesses], [enable coprocess support and the coproc reserved word]), opt_coproc=$enableval)
|
||||||
AC_ARG_ENABLE(debugger, AC_HELP_STRING([--enable-debugger], [enable support for bash debugger]), opt_debugger=$enableval)
|
AC_ARG_ENABLE(debugger, AC_HELP_STRING([--enable-debugger], [enable support for bash debugger]), opt_debugger=$enableval)
|
||||||
AC_ARG_ENABLE(directory-stack, AC_HELP_STRING([--enable-directory-stack], [enable builtins pushd/popd/dirs]), opt_dirstack=$enableval)
|
AC_ARG_ENABLE(directory-stack, AC_HELP_STRING([--enable-directory-stack], [enable builtins pushd/popd/dirs]), opt_dirstack=$enableval)
|
||||||
AC_ARG_ENABLE(disabled-builtins, AC_HELP_STRING([--enable-disabled-builtins], [allow disabled builtins to still be invoked]), opt_disabled_builtins=$enableval)
|
AC_ARG_ENABLE(disabled-builtins, AC_HELP_STRING([--enable-disabled-builtins], [allow disabled builtins to still be invoked]), opt_disabled_builtins=$enableval)
|
||||||
|
|
@ -296,6 +302,9 @@ fi
|
||||||
if test $opt_cond_regexp = yes ; then
|
if test $opt_cond_regexp = yes ; then
|
||||||
AC_DEFINE(COND_REGEXP)
|
AC_DEFINE(COND_REGEXP)
|
||||||
fi
|
fi
|
||||||
|
if test $opt_coproc = yes; then
|
||||||
|
AC_DEFINE(COPROCESS_SUPPORT)
|
||||||
|
fi
|
||||||
if test $opt_arith_for_command = yes; then
|
if test $opt_arith_for_command = yes; then
|
||||||
AC_DEFINE(ARITH_FOR_COMMAND)
|
AC_DEFINE(ARITH_FOR_COMMAND)
|
||||||
fi
|
fi
|
||||||
|
|
@ -311,6 +320,12 @@ fi
|
||||||
if test $opt_debugger = yes; then
|
if test $opt_debugger = yes; then
|
||||||
AC_DEFINE(DEBUGGER)
|
AC_DEFINE(DEBUGGER)
|
||||||
fi
|
fi
|
||||||
|
if test $opt_casemod_attrs = yes; then
|
||||||
|
AC_DEFINE(CASEMOD_ATTRS)
|
||||||
|
fi
|
||||||
|
if test $opt_casemod_expansions = yes; then
|
||||||
|
AC_DEFINE(CASEMOD_EXPANSIONS)
|
||||||
|
fi
|
||||||
|
|
||||||
if test $opt_memscramble = yes; then
|
if test $opt_memscramble = yes; then
|
||||||
AC_DEFINE(MEMSCRAMBLE)
|
AC_DEFINE(MEMSCRAMBLE)
|
||||||
|
|
@ -553,7 +568,7 @@ if test $opt_history = yes || test $opt_bang_history = yes; then
|
||||||
# static version specified as -llibname to override the
|
# static version specified as -llibname to override the
|
||||||
# dynamic version
|
# dynamic version
|
||||||
case "${host_os}" in
|
case "${host_os}" in
|
||||||
darwin8*) HISTORY_LIB='${HISTORY_LIBRARY}' ;;
|
darwin[[89]]*) HISTORY_LIB='${HISTORY_LIBRARY}' ;;
|
||||||
*) HISTORY_LIB=-lhistory ;;
|
*) HISTORY_LIB=-lhistory ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
@ -698,7 +713,7 @@ dnl checks for system calls
|
||||||
AC_CHECK_FUNCS(dup2 eaccess fcntl getdtablesize getgroups gethostname \
|
AC_CHECK_FUNCS(dup2 eaccess fcntl getdtablesize getgroups gethostname \
|
||||||
getpagesize getpeername getrlimit getrusage gettimeofday \
|
getpagesize getpeername getrlimit getrusage gettimeofday \
|
||||||
kill killpg lstat readlink sbrk select setdtablesize \
|
kill killpg lstat readlink sbrk select setdtablesize \
|
||||||
tcgetpgrp uname ulimit waitpid)
|
setitimer tcgetpgrp uname ulimit waitpid)
|
||||||
AC_REPLACE_FUNCS(rename)
|
AC_REPLACE_FUNCS(rename)
|
||||||
|
|
||||||
dnl checks for c library functions
|
dnl checks for c library functions
|
||||||
|
|
@ -713,6 +728,7 @@ AC_CHECK_FUNCS(isascii isblank isgraph isprint isspace isxdigit)
|
||||||
AC_CHECK_FUNCS(getpwent getpwnam getpwuid)
|
AC_CHECK_FUNCS(getpwent getpwnam getpwuid)
|
||||||
AC_REPLACE_FUNCS(getcwd memset strcasecmp strerror strftime strnlen strpbrk strstr)
|
AC_REPLACE_FUNCS(getcwd memset strcasecmp strerror strftime strnlen strpbrk strstr)
|
||||||
AC_REPLACE_FUNCS(strtod strtol strtoul strtoll strtoull strtoimax strtoumax)
|
AC_REPLACE_FUNCS(strtod strtol strtoul strtoll strtoull strtoimax strtoumax)
|
||||||
|
AC_REPLACE_FUNCS(fdprintf)
|
||||||
|
|
||||||
AC_CHECK_DECLS([confstr])
|
AC_CHECK_DECLS([confstr])
|
||||||
AC_CHECK_DECLS([printf])
|
AC_CHECK_DECLS([printf])
|
||||||
|
|
@ -782,7 +798,7 @@ AC_CHECK_LIB(dl, dlopen)
|
||||||
AC_CHECK_FUNCS(dlopen dlclose dlsym)
|
AC_CHECK_FUNCS(dlopen dlclose dlsym)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl this defines SYS_SIGLIST_DECLARED
|
dnl this defines HAVE_DECL_SYS_SIGLIST
|
||||||
AC_DECL_SYS_SIGLIST
|
AC_DECL_SYS_SIGLIST
|
||||||
|
|
||||||
dnl network functions -- check for inet_aton again
|
dnl network functions -- check for inet_aton again
|
||||||
|
|
@ -893,6 +909,7 @@ dnl presence and behavior of C library functions
|
||||||
BASH_FUNC_STRSIGNAL
|
BASH_FUNC_STRSIGNAL
|
||||||
BASH_FUNC_OPENDIR_CHECK
|
BASH_FUNC_OPENDIR_CHECK
|
||||||
BASH_FUNC_ULIMIT_MAXFDS
|
BASH_FUNC_ULIMIT_MAXFDS
|
||||||
|
BASH_FUNC_FPURGE
|
||||||
BASH_FUNC_GETENV
|
BASH_FUNC_GETENV
|
||||||
if test "$ac_cv_func_getcwd" = "yes"; then
|
if test "$ac_cv_func_getcwd" = "yes"; then
|
||||||
BASH_FUNC_GETCWD
|
BASH_FUNC_GETCWD
|
||||||
|
|
@ -972,7 +989,7 @@ dnl like glob and readline
|
||||||
LOCAL_DEFS=-DSHELL
|
LOCAL_DEFS=-DSHELL
|
||||||
|
|
||||||
dnl use this section to possibly define more cpp variables, specify local
|
dnl use this section to possibly define more cpp variables, specify local
|
||||||
dnl libraries, and specify any additional local cc flags
|
dnl libraries, and specify any additional local cc or ld flags
|
||||||
dnl
|
dnl
|
||||||
dnl this should really go away someday
|
dnl this should really go away someday
|
||||||
|
|
||||||
|
|
@ -992,6 +1009,9 @@ sco3.2v4*) LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -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 -DSOLARIS" ;;
|
solaris2.5*) LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;;
|
||||||
|
solaris2.8*) LOCAL_CFLAGS=-DSOLARIS LOCAL_LDFLAGS='-z interpose' ;;
|
||||||
|
solaris2.9*) LOCAL_CFLAGS=-DSOLARIS LOCAL_LDFLAGS='-z interpose' ;;
|
||||||
|
solaris2.10*) LOCAL_CFLAGS=-DSOLARIS LOCAL_LDFLAGS='-z interpose' ;;
|
||||||
solaris2*) LOCAL_CFLAGS=-DSOLARIS ;;
|
solaris2*) LOCAL_CFLAGS=-DSOLARIS ;;
|
||||||
lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
|
lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
|
||||||
linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading
|
linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading
|
||||||
|
|
@ -1074,11 +1094,22 @@ case "$BUILD_DIR" in
|
||||||
*) ;;
|
*) ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
if test -z "$localedir"; then
|
||||||
|
localedir='${datarootdir}/locale'
|
||||||
|
fi
|
||||||
|
if test -z "$datarootdir"; then
|
||||||
|
datarootdir='${prefix}/share'
|
||||||
|
fi
|
||||||
|
|
||||||
AC_SUBST(PROFILE_FLAGS)
|
AC_SUBST(PROFILE_FLAGS)
|
||||||
|
|
||||||
AC_SUBST(incdir)
|
AC_SUBST(incdir)
|
||||||
AC_SUBST(BUILD_DIR)
|
AC_SUBST(BUILD_DIR)
|
||||||
|
|
||||||
|
# Some versions of autoconf don't substitute these automatically
|
||||||
|
AC_SUBST(datarootdir)
|
||||||
|
AC_SUBST(localedir)
|
||||||
|
|
||||||
AC_SUBST(YACC)
|
AC_SUBST(YACC)
|
||||||
AC_SUBST(AR)
|
AC_SUBST(AR)
|
||||||
AC_SUBST(ARFLAGS)
|
AC_SUBST(ARFLAGS)
|
||||||
|
|
@ -1104,8 +1135,7 @@ AC_OUTPUT([Makefile builtins/Makefile lib/readline/Makefile lib/glob/Makefile \
|
||||||
lib/intl/Makefile \
|
lib/intl/Makefile \
|
||||||
lib/malloc/Makefile lib/sh/Makefile lib/termcap/Makefile \
|
lib/malloc/Makefile lib/sh/Makefile lib/termcap/Makefile \
|
||||||
lib/tilde/Makefile doc/Makefile support/Makefile po/Makefile.in \
|
lib/tilde/Makefile doc/Makefile support/Makefile po/Makefile.in \
|
||||||
examples/loadables/Makefile examples/loadables/perl/Makefile \
|
examples/loadables/Makefile examples/loadables/perl/Makefile],
|
||||||
pathnames.h],
|
|
||||||
[
|
[
|
||||||
# Makefile uses this timestamp file to record whether config.h is up to date.
|
# Makefile uses this timestamp file to record whether config.h is up to date.
|
||||||
echo timestamp > stamp-h
|
echo timestamp > stamp-h
|
||||||
|
|
|
||||||
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