| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
| |
Also add new -L option to kill for a more verbose listing of signals
|
| |
|
| |
|
| |
|
|
|
|
| |
with paths starting with - or +
|
| |
|
|
|
|
|
| |
* no job control inside <<(substition)
* allow interrupt of multios reading from a terminal
|
| |
|
| |
|
|
|
|
|
|
| |
This is a special case where TRAPEXIT is unset within a TRAPEXIT
as it should never run in a nested context, so just save the
function structure temporarily on the heap.
|
| |
|
|
|
|
| |
Also ! continue ||
|
| |
|
|
|
|
|
| |
This served as a workaround for ancient compilers where casts to
unsigned char were broken.
|
|
|
|
|
| |
If this is not done, special cases such as failures in special builtins
or errors in math expressions skip the trap execution.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
Also correct ChangeLog
|
| |
|
| |
|
|
|
|
|
|
|
|
|
| |
of a pipeline.
Backs out part of 188c5cd5 (workers/50874). With this change, after a
new subshell is forked upon suspend of the right side of a pipeline, the
previous foreground subjob is resumed first and the new subshell remains
stopped until that job finishes.
|
| |
|
|
|
|
|
|
|
|
|
| |
inittyptab() must be called when returning from a function with
"setopt localoptions MULTIBYTE|BANGHIST|SHSTDIN", and also in
function dosetopt() when setting these options (via $options, for
example). We intentionally did not take account of the options
EMACS/VI because these options are obsolete and their use is
not recommended.
|
| |
|
| |
|
|
|
|
|
| |
Some signed-to-unsigned casts needed for a couple of cases of pointers
used as indices.
|
|
|
|
|
|
|
|
| |
Don't attempt to query invalid job off end of table, resulting in
crashes from $jobtstates.
If background task started in subshell, look at tatsks within subshell
instead of main shell. Document and add test.
|
|
|
|
|
| |
The =(<<<foo) optimization forgot to add a newline, but =(cat<<<foo)
always did, make the behavior consistent, and document it.
|
|
|
|
|
| |
Previously, doing this would just run stty with no arguments, which
normally causes it to print some terminal settings to stdout.
|
| |
|
|
|
|
|
|
|
|
| |
If the file was sourced from an interactive shell with
INTERACTIVE_COMMENTS not set, comments were not parsed.
Note there is a remaining edge case where the sourced
file is in fact entered at the comment line.
|
|
|
|
|
| |
With POSIX_TRAPS set, an ignored signal stays ignored when entering
a subshell.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
zsh typically runs the final command in a pipeline in the main shell
instead of a subshell. However, POSIX specifies that all commands in a
pipeline run in a subshell, but permits zsh's behavior as an extension.
The default /bin/sh implementations on various Linux distros and the
BSDs always use a subshell for all components of a pipeline.
Since zsh may be used as /bin/sh in some cases (such as macOS Catalina),
it makes sense to have the common sh behavior when emulating sh, so do
that by checking for being the final item of a multi-item pipeline and
creating a subshell in that case.
From the comment above execpline(), we know the following:
last1 is a flag that this command is the last command in a shell that
is about to exit, so we can exec instead of forking. It gets passed
all the way down to execcmd() which actually makes the decision. A 0
is always passed if the command is not the last in the pipeline. […]
If last1 is zero but the command is at the end of a pipeline, we pass
2 down to execcmd().
So there are three cases to consider in this code:
• last1 is 0, which means we are not at the end of a pipeline, in which
case we should not change behavior.
• last1 is 1, which means we are effectively running in a subshell,
because nothing that happens due to the exec is going to affect the
actual shell, since it will have been replaced. So there is nothing
to do here.
• last1 is 2, which means our command is at the end of the pipeline, so
in sh mode we should create a subshell by forking.
input is nonzero if the input to this process is a pipe that we've
opened. At the end of a multi-stage pipeline, it will necessarily be
nonzero.
Note that several of the tests may appear bizarre, since most developers
do not place useless variable assignments directly at the end of a
pipeline. However, as the function tests demonstrate, there are cases
where assignments may occur when a shell function is used at the end of
a command. The remaining assignment tests simply test additional cases,
such as the use of local, that would otherwise be untested.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This change modifies the zsh binary safety check surrounding execve() so
it can run shell scripts having concatenated binary content. We're using
the same safety check as FreeBSD /bin/sh [1]. POSIX was recently revised
to require this behavior:
"The input file may be of any type, but the initial portion of the
file intended to be parsed according to the shell grammar (XREF to
XSH 2.10.2 Shell Grammar Rules) shall consist of characters and
shall not contain the NUL character. The shell shall not enforce
any line length limits."
"Earlier versions of this standard required that input files to the
shell be text files except that line lengths were unlimited.
However, that was overly restrictive in relation to the fact that
shells can parse a script without a trailing newline, and in
relation to a common practice of concatenating a shell script
ending with an 'exit' or 'exec $command' with a binary data payload
to form a single-file self-extracting archive." [2] [3]
One example use case of such scripts, is the Cosmopolitan C Library [4]
which configuse the GNU Linker to output a polyglot shell+binary format
that runs on Linux / Mac / Windows / FreeBSD / OpenBSD.
[1] https://github.com/freebsd/freebsd-src/commit/9a1cd363318b7e9e70ef6af27d1675b371c16b1a
[2] http://austingroupbugs.net/view.php?id=1250
[3] http://austingroupbugs.net/view.php?id=1226#c4394
[4] https://justine.lol/cosmopolitan/index.html
|
|
|
|
|
|
|
| |
From nice(2):
To detect an error, set errno to 0 before the call, and check
whether it is nonzero after nice() returns -1.
|
| |
|
| |
|
|
|
|
|
| |
When running a function, remove special files used for substitution
after the function has run rather than before.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
functions as though they were a single function named "(anon)".
Before:
% zmodload zsh/zprof
% () :
% () :
% zprof
num calls time self name
-----------------------------------------------------------------------------------
1) 2 0.08 0.04 100.00% 0.08 0.04 100.00% (anon)
After:
% zmodload zsh/zprof
% () :
% () :
% zprof
num calls time self name
-----------------------------------------------------------------------------------
1) 1 0.04 0.04 50.45% 0.04 0.04 50.45% (anon) [:3]
2) 1 0.04 0.04 49.55% 0.04 0.04 49.55% (anon) [:2]
|
|
|
|
| |
Config/version.mk was bumped in the previous commit.
|
| |
|
|
|
|
| |
The value is overwritten five lines below, without being read in the interim.
|