mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-05-20 06:56:05 +02:00
add autocontinue option to automatically make stopped jos running when they are being disowned; make that the default for `%job &!' and `%job &|' (15115)
This commit is contained in:
parent
b053d02cdb
commit
b275190ff4
|
@ -1,3 +1,10 @@
|
|||
2001-06-27 Sven Wischnowsky <wischnow@zsh.org>
|
||||
|
||||
* 15115: Doc/Zsh/builtins.yo, Doc/Zsh/options.yo, Src/exec.c,
|
||||
Src/jobs.c, Src/options.c, Src/zsh.h: add autocontinue option
|
||||
to automatically make stopped jos running when they are being
|
||||
disowned; make that the default for `%job &!' and `%job &|'
|
||||
|
||||
2001-06-26 Andrej Borsenkow <bor@zsh.org>
|
||||
|
||||
* 15099: Test/D03procsubst.ztst, Test/ztst.zsh: add some support
|
||||
|
|
|
@ -230,6 +230,12 @@ Remove the specified var(job)s from the job table; the shell will
|
|||
no longer report their status, and will not complain if you
|
||||
try to exit an interactive shell with them running or stopped.
|
||||
If no var(job) is specified, disown the current job.
|
||||
|
||||
If the var(job)s are currently stopped and the tt(AUTO_CONTINUE) option
|
||||
is not set, a warning is printed containing information about how to
|
||||
make them running after they have been disowned. If one of the latter
|
||||
two forms is used, the var(job)s will automatically be made running,
|
||||
independent of the setting of the tt(AUTO_CONTINUE) option.
|
||||
)
|
||||
findex(echo)
|
||||
item(tt(echo) [ tt(-neE) ] [ var(arg) ... ])(
|
||||
|
|
|
@ -91,6 +91,14 @@ If a command is issued that can't be executed as a normal command,
|
|||
and the command is the name of a directory, perform the tt(cd)
|
||||
command to that directory.
|
||||
)
|
||||
pindex(AUTO_CONTINUE)
|
||||
cindex(jobs, continuing automatically)
|
||||
cindex(continuing jobs automatically)
|
||||
item(tt(AUTO_CONT))(
|
||||
With this option set, stopped jobs that are removed from the job table
|
||||
with the tt(disown) builtin command are automatically sent a tt(CONT)
|
||||
signal to make them running.
|
||||
)
|
||||
pindex(AUTO_LIST)
|
||||
cindex(completion, listing choices)
|
||||
item(tt(AUTO_LIST) (tt(-9)) <D>)(
|
||||
|
|
10
Src/exec.c
10
Src/exec.c
|
@ -1645,7 +1645,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
|||
int nullexec = 0, assign = 0, forked = 0;
|
||||
int is_shfunc = 0, is_builtin = 0, is_exec = 0;
|
||||
/* Various flags to the command. */
|
||||
int cflags = 0, checked = 0;
|
||||
int cflags = 0, checked = 0, oautocont = opts[AUTOCONTINUE];
|
||||
LinkList redir;
|
||||
wordcode code;
|
||||
Wordcode beg = state->pc, varspc;
|
||||
|
@ -1680,6 +1680,8 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
|||
* reference to a job in the job table. */
|
||||
if (type == WC_SIMPLE && args && nonempty(args) &&
|
||||
*(char *)peekfirst(args) == '%') {
|
||||
if (how & Z_DISOWN)
|
||||
opts[AUTOCONTINUE] = 1;
|
||||
pushnode(args, dupstring((how & Z_DISOWN)
|
||||
? "disown" : (how & Z_ASYNC) ? "bg" : "fg"));
|
||||
how = Z_SYNC;
|
||||
|
@ -1833,6 +1835,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
|||
if (cflags & BINF_BUILTIN) {
|
||||
zwarn("no such builtin: %s", cmdarg, 0);
|
||||
lastval = 1;
|
||||
opts[AUTOCONTINUE] = oautocont;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -1856,6 +1859,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
|||
|
||||
if (errflag) {
|
||||
lastval = 1;
|
||||
opts[AUTOCONTINUE] = oautocont;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1899,6 +1903,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
|||
|
||||
if (errflag) {
|
||||
lastval = 1;
|
||||
opts[AUTOCONTINUE] = oautocont;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1981,6 +1986,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
|||
if ((pid = zfork()) == -1) {
|
||||
close(synch[0]);
|
||||
close(synch[1]);
|
||||
opts[AUTOCONTINUE] = oautocont;
|
||||
return;
|
||||
} if (pid) {
|
||||
close(synch[1]);
|
||||
|
@ -2006,6 +2012,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
|||
}
|
||||
}
|
||||
addproc(pid, text);
|
||||
opts[AUTOCONTINUE] = oautocont;
|
||||
return;
|
||||
}
|
||||
/* pid == 0 */
|
||||
|
@ -2373,6 +2380,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
|
|||
|
||||
zsfree(STTYval);
|
||||
STTYval = 0;
|
||||
opts[AUTOCONTINUE] = oautocont;
|
||||
}
|
||||
|
||||
/* Arrange to have variables restored. */
|
||||
|
|
14
Src/jobs.c
14
Src/jobs.c
|
@ -1215,7 +1215,7 @@ init_hackzero(char **argv, char **envp)
|
|||
int
|
||||
bin_fg(char *name, char **argv, char *ops, int func)
|
||||
{
|
||||
int job, lng, firstjob = -1, retval = 0;
|
||||
int job, lng, firstjob = -1, retval = 0, ofunc = func;
|
||||
|
||||
if (ops['Z']) {
|
||||
int len;
|
||||
|
@ -1299,6 +1299,8 @@ bin_fg(char *name, char **argv, char *ops, int func)
|
|||
for (; (firstjob != -1) || *argv; (void)(*argv && argv++)) {
|
||||
int stopped, ocj = thisjob;
|
||||
|
||||
func = ofunc;
|
||||
|
||||
if (func == BIN_WAIT && isanum(*argv)) {
|
||||
/* wait can take a pid; the others can't. */
|
||||
pid_t pid = (long)atoi(*argv);
|
||||
|
@ -1326,6 +1328,13 @@ bin_fg(char *name, char **argv, char *ops, int func)
|
|||
unqueue_signals();
|
||||
return 1;
|
||||
}
|
||||
/* If AUTO_CONTINUE is set (automatically make stopped jobs running
|
||||
* on disown), we actually do a bg and then delete the job table entry. */
|
||||
|
||||
if (isset(AUTOCONTINUE) && func == BIN_DISOWN &&
|
||||
jobtab[job].stat & STAT_STOPPED)
|
||||
func = BIN_BG;
|
||||
|
||||
/* We have a job number. Now decide what to do with it. */
|
||||
switch (func) {
|
||||
case BIN_FG:
|
||||
|
@ -1386,7 +1395,8 @@ bin_fg(char *name, char **argv, char *ops, int func)
|
|||
if (func != BIN_BG) {
|
||||
waitjobs();
|
||||
retval = lastval2;
|
||||
}
|
||||
} else if (ofunc == BIN_DISOWN)
|
||||
deletejob(jobtab + job);
|
||||
break;
|
||||
case BIN_JOBS:
|
||||
printjob(job + jobtab, lng, 2);
|
||||
|
|
|
@ -75,6 +75,7 @@ static struct optname optns[] = {
|
|||
{NULL, "alwaystoend", 0, ALWAYSTOEND},
|
||||
{NULL, "appendhistory", OPT_ALL, APPENDHISTORY},
|
||||
{NULL, "autocd", OPT_EMULATE, AUTOCD},
|
||||
{NULL, "autocontinue", 0, AUTOCONTINUE},
|
||||
{NULL, "autolist", OPT_ALL, AUTOLIST},
|
||||
{NULL, "automenu", OPT_ALL, AUTOMENU},
|
||||
{NULL, "autonamedirs", 0, AUTONAMEDIRS},
|
||||
|
|
Loading…
Reference in New Issue