Commit Graph

129 Commits

Author SHA1 Message Date
kre
2d8874d9a7 More standard (and saner) implementation of the ! reserved word.
Unless the shell is compiled with the (compilation time) option
BOGUS_NOT_COMMAND (as in CFLAGS+=-DBOGUS_NOT_COMMAND) which it
will not normally be, the ! command (reserved word) will only
be permitted at the start of a pipeline (which includes the
degenerate pipeline with no '|'s in it of course - ie: a simple cmd)
and not in the middle of a pipeline sequence (no "cmd | ! cmd" nonsense.)
If the latter is really required, then "cmd | { ! cmd; }" works as
a standard equivalent.

In POSIX mode, permit only one !  ("! pipeline" is ok. "! ! pipeline" is not).
Again, if needed (and POSIX conformance is wanted) "! { ! pipeline; }"
works as an alternative - and is safer, some shells treat "! ! cmd" as
being identical to "cmd" (this one did until recently.)
2017-05-27 11:19:57 +00:00
kre
db7849a108 NFC: changes to comments only - expand/add comments relating to ${#...}
parsing, and all its peculiarities.
2017-05-14 11:17:04 +00:00
kre
26a83a43ec Fix some parser weirdness...
${#VAR:-foo} (or any other modifier on ${#VAR} is a syntax error.
On the other hand ${##} is not, nor is ${##13} though they mean
quite different things (the latter is an idiom everyone should learn,
... $# except we refuse to admit the possibility that it is 13...
Even I cannot explain what ${#-foo} used to do, but it wasn't sane!
(It should be just $# as $# is never unset, but ...)
Shell syntax is truly a wondrous thing!
2017-05-11 15:07:37 +00:00
kre
e64f57b73d NFC: Whitespace, KNF, and (some) consistency. 2017-05-10 11:06:47 +00:00
kre
aa563ca425 If we are going to permit
! ! pipeline
(And for now the other places where ! is permitted)
we should at least generate the logically correct exit
status:
	! ! (exit 5); echo $?
should print 1, not 5.   ksh and bosh do it this way - and it makes sense.
bash and the FreeBSD sh echo "5" (as did we until now.)
dash, zsh, yash all enforce the standard syntax, and prohibit this.
2017-05-09 05:14:03 +00:00
kre
09a5470484 Remove bogus extra \n from syntax error message. 2017-05-09 02:47:47 +00:00
kre
7d41ae4eb6 Implement the ';&' (used instead of ';;') case statement list terminator
which causes fall through the to command list of the following pattern
(wuthout evaluating that pattern).   This has been approved for inclusion
in the next major version of the POSIX standard (Issue 8), and is
implemented by most other shells.

Now all form a circle and together attempt to summon the great wizd
in the hopes that his magic spells can transform the poor attempt
at documenting this feature into something rational...
2017-05-04 04:37:51 +00:00
kre
1b5660ae57 Fix the heredoc line counting bug that I caused when the heredoc
processing was changed just over a year ago (rev 1.111).
2017-05-03 21:36:16 +00:00
kre
eaa91315bd Deal with \newline line continuations more correctly.
They can occur anywhere (*anywhere*) not only where it
happens to be convenient to the parser...

This fix from FreeBSD (thanks again folks).

To make this work, pushstring()'s signature needed to change to allow a
const char * as its string arg, which meant sprinkling some const other
places for a brighter appearance (and handling fallout).

All this because I wanted to see what number would come from

echo $\
{\
L\
I\
N\
E\
N\
O\
}

and was surprised at the result!    That works now...

The bug would also affect stuff like

true &\
& false

and all kinds of other uses where the \newline occurred in the
"wrong" place.

An ATF test for sh syntax is coming... (sometime.)
2017-05-03 04:51:04 +00:00
kre
95edbff793 PR bin/51145 PR bin/48489
More fixes to the shell parser to prevent empty simple commands (where
empty means no significant text at all) - as discussed on tech-userlevel
this still allows { } (which can be useful in function definitions, not
really anywhere else though) except in posix mode.  ( ) now generates
a syntax error, as should any other place where commands are required but
nothing is present.  (nb, redirections, var assignments, even var expansions
that expand to nothing, are all OK, and avoid the error - just comments, or
whits space, are not.)    This is (aside from allowing { } at all) all in
accordance with the posix spec.
2016-06-01 02:47:05 +00:00
kre
183536927f PR bin/48489 -- Shell "simple commands" are now not allowed to be
completely empty, they must have something (var assignment, redirect,
or command, or multiple of those) to avoid a syntax error.  This
matches the requirements of the grammar in the standard.   Correct the
parser (using FreeBSD's sh as a guide) and update the man page to
remove text that noted a couple of places this was previously OK.

OK christos@
2016-05-09 20:36:07 +00:00
kre
a18b822d05 Allow function names to be any shell word not containing '/'.
This allows anything that could be a filesystem command to be
implemented as a function instead.  The restriction on '/'
is because of the way that functions are (required to be) searched
for relative to PATH searching - a function with a name containing '/'
could never be executed, so simply prohibit defining such a thing.

ok christos@
2016-05-03 03:16:55 +00:00
christos
1fad4bb60c Fix handing of user file descriptors outside the 0..9 range.
Also, move (most of) the shell's internal use fd's to much
higher values (depending upon what ulimit -n allows) so they
are less likely to clash with user supplied fd numbers.  A future
patch will (hopefully) avoid this problem completely by dynamically
moving the shell's internal fds around as needed. (From kre@)
2016-05-02 01:46:31 +00:00
christos
478a0487ac Allow a heredoc to be positioned outside a `` command substitution.
POSIX just says "here docs begin after the next newline [token]".
Nothing about "provided it is inside any `` the redirect operator
appears in...    As best I can tell, NetBSD now has the only shell to
handle this "correctly" (which raises the question whether it is
correct - but if not, only erroneous scripts are affected.)
This is required by some (probably broken) autoconfigure related
scripts. (from kre@)
2016-04-04 12:39:08 +00:00
christos
65cf828420 After discussions with Jilles Tjoelker (FreeBSD shell) and
following a suggestion from him, the way the fix to PR bin/50993
was implemented has changed a little.   There are three steps involved
in processing a here document, reading it, parsing it, and then
evaluating it before applying it to the correct file descriptor for
the command to use.  The third of those is not related to this
problem, and has not changed.  The bug was caused by combining the
first two steps into one (and not doing it correctly - which would be
hard that way.)  The fix is to split the first two stages into
separate events.   The original fix moved the 2nd stage (parsing)
to just immediately before the 3rd stage (evaluation.)  Jilles
pointed out some unwanted side effects from doing it that way, and
suggested moving the 2nd stage to immediately after the first.
This commit makes that change.  The effect is to revert the changes
to expand.c and parser.h (which are no longer needed) and simplify
slightly the change to parser.c. (from kre@)
2016-03-31 23:11:05 +00:00
christos
ddf72776f1 PR bin/51027 - fix the parsing of references to shell parameters
when given without braces (ie: $2 etc).  Only the first 9 shell
parameters ($1 .. $9) and the special parameter ($0) can be
referenced this way, $10 is ${1}0 not ${10}.   Make it so.
This bug brought to notice by Sven Mascheck's web pages which
discuss (among other things) the history of this (and other ash
based) shells .. see http://www.in-ulm.de/~mascheck/ (from kre@)
2016-03-31 16:12:52 +00:00
christos
21cf17379f This is an internally visible change - no effect visible to the
user is expected. With the previous commits to parser.c, we no
longer need to handle reading here documents in the (massive)
readtoken1() function. That allows its code to be simplified and
made easier to read and understand (several goto's goto goto heaven.
RIP) (from kre@)
2016-03-31 16:12:09 +00:00
christos
7c8885a4e7 Move the parseredir internal subroutine out of readtoken1() into being
a real function of its own (also inspired by FreeBSD - though for
this one other sh differences require slightly different code.) (from kre@)
2016-03-27 14:40:20 +00:00
christos
1d1484aa26 PR bin/50993 - this is a significant rewrite of the way that here
documents are processed.  Now, when first detected, they are
simply read (the only change made to the text is to join lines
ended with a \ to the subsequent line, otherwise end marker detection
does not work correctly (for here docs with an unquoted endmarker
only of course.)  This patch also moves the "internal subroutine"
for looking for the end marker out of readtoken1() (which had to
happen as readtoken1 is no longer reading the here doc when it is
needed) - that uses code mostly taken from FreeBSD's sh (thanks!)
and along the way results in some restrictions on what the end
marker can be being removed.   We still do not allow all we should.
(from kre@)
2016-03-27 14:39:33 +00:00
christos
1d4fbce984 Cease "support" for <redirect> fn() { ...
Any redirect (or redirects) before a function definition were
allowed by the parser, but otherwise totally ignored.  The standard
syntax does not permit redirects there, now, neither do we. (from kre@)
2016-03-27 14:36:29 +00:00
christos
f9acd92dd8 Finish constifying the new parsebackquote() function. Save a
variable or two...   Should change nothing. (from kre@)
2016-03-27 14:35:30 +00:00
christos
ca12a0b88a General KNF and source code cleanups, avoid scattering the
magic string " \t\n" all over the place, slightly improved
syntax error messages, restructured some of the code for
clarity, don't allow IFS to be imported through the environment,
and remove the (never) conditionally compiled ATTY option.
Apart from one or two syntax error messages, and ignoring IFS
if present in the environment, this is intended to have no
user visible changes. (from kre@)
2016-03-27 14:34:46 +00:00
christos
29494835fd fix constness (from kre) 2016-03-21 02:37:26 +00:00
christos
db56d5516c Move the command substitution "internal subroutine" part of
readtoken1() into a real function of its own (inspired by a
similar change made by FreeBSD - the other internal routines
they moved out are expected to move out here as well soon.)
This change helps avoid gcc 5.3 demanded (not required!) volatile
noise which would slow down parsing. (from kre)
2016-03-20 22:56:39 +00:00
christos
fc55d6ef49 sprinkle more volatile (needed for the rescue build with gcc-5.3) 2016-03-18 18:07:28 +00:00
christos
65639a43f1 put back some volatile, gcc complains (x86_64) 2016-03-08 14:11:56 +00:00
christos
b506e0ff4c Remove most volatility from readtoken1() restoring execution
speed to approximately where it was before the changes made
in version 1.96 (which assumed this would eventually happen.)
2016-03-08 14:10:04 +00:00
christos
0c52b5f165 Bug fixes to handling of unterminated here documents
(they should be, and now are, a syntax error), and
miscellaneous other minor cleanups. (from kre)
2016-02-28 23:12:23 +00:00
christos
78204bbf10 remove useless casts 2016-02-27 16:28:50 +00:00
christos
d73fcc53c6 CID 1354293: handle EOF 2016-02-27 16:23:22 +00:00
christos
aeba4f7b70 Fix quoting inside heredoc's. (from kre) 2016-02-23 14:51:25 +00:00
christos
606614c83d PR bin/43469 - correctly handle quoting of the pattern part of ${var%pat}
type expansions. (from kre)
2016-02-22 20:02:00 +00:00
christos
863fff4621 Fix for PR bin/48631 - allow commands controlled
by case statements to be nothing more than redirects (from kre)
2016-02-22 19:42:46 +00:00
christos
b8f416fe8e Finish the fix for PR/48631 - that is, make the parser correctly
handle the token syntax it really should be handling (including
some that posix does not require, but is right anyway.) This is
quite similar to, and to some extent inspired by the way the FreeBSD
sh parser.c works, but the actual implementation is quite different.
(from kre)
2016-02-22 19:38:10 +00:00
christos
87624d803c KNF / whitespace fixes. No changes of substance. (from kre) 2016-02-22 19:25:26 +00:00
christos
2f573a20ed PR/50827: Richard Hansen: Fix default variable assignment with arithmetic,
from kre.
2016-02-19 13:50:37 +00:00
christos
5cad352e4f remove unused assignment 2014-08-29 09:35:19 +00:00
christos
d03f4b6b66 Eat trailing backslash like bash and pdksh (not zsh). CBACK+CEOF = TEOF 2014-08-29 09:26:39 +00:00
christos
7de48e21c0 PR/49125: Havard Eidnes: /bin/sh does not support redirecting to or from FDs > 9
According to:
http://pubs.opengroup.org/onlinepubs/009604599/utilities/xcu_chap02.html#tag_02_07

Redirection support for fds > 9 is optional but allowed.
2014-08-19 12:36:58 +00:00
christos
bc1be752a1 whitespace fixes 2014-01-01 19:50:44 +00:00
christos
316fbf0f9f There was a case where \n did not increase plinno 2014-01-01 19:06:45 +00:00
christos
87802d4338 clarify further. 2014-01-01 18:29:39 +00:00
christos
724ab0808b explain the previous fix. 2014-01-01 16:55:28 +00:00
christos
9bcdabb166 allow case statement without any patterns. 2013-12-31 22:53:57 +00:00
christos
b258a62a64 add stdio.h 2013-10-02 21:48:55 +00:00
christos
018a6f7864 add crude $LINENO support for FreeBSD 2013-10-02 19:52:58 +00:00
wiz
123b56dc76 Initialize two variables for clang. 2012-06-17 20:48:27 +00:00
christos
a080d61232 include <limits.h> for CHAR_MIN/CHAR_MAX 2012-03-28 20:11:25 +00:00
christos
1cd38287c6 PR/43597: Don't break from parsing word tokens in we are in double quotes.
Fixes: sh -c 'echo "${foo:="first-word"} second-word"'
2012-03-25 18:49:13 +00:00
plunky
9f61b80465 NULL does not need a cast 2011-08-31 16:24:54 +00:00