1
0
Fork 0
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:
Sven Wischnowsky 2001-06-27 11:22:04 +00:00
parent b053d02cdb
commit b275190ff4
7 changed files with 44 additions and 3 deletions

View File

@ -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

View File

@ -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) ... ])(

View File

@ -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>)(

View File

@ -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. */

View File

@ -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);

View File

@ -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},

View File

@ -1314,6 +1314,7 @@ enum {
ALWAYSTOEND,
APPENDHISTORY,
AUTOCD,
AUTOCONTINUE,
AUTOLIST,
AUTOMENU,
AUTONAMEDIRS,