mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-23 16:40:24 +02:00
23671: command not found handler
This commit is contained in:
parent
a1374319dc
commit
eea6647c65
3 changed files with 41 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2007-07-13 Peter Stephenson <pws@csr.com>
|
||||||
|
|
||||||
|
* 23671: Doc/Zsh/exec.yo, Src/exec.c: Function
|
||||||
|
command_not_found_handler can be defined to handle command
|
||||||
|
not found.
|
||||||
|
|
||||||
2007-07-12 Clint Adams <clint@zsh.org>
|
2007-07-12 Clint Adams <clint@zsh.org>
|
||||||
|
|
||||||
* 23674: Completion/Unix/Command/_git: merge in git clone
|
* 23674: Completion/Unix/Command/_git: merge in git clone
|
||||||
|
|
|
@ -5,6 +5,8 @@ sect(Command Execution)
|
||||||
)\
|
)\
|
||||||
cindex(command execution)
|
cindex(command execution)
|
||||||
cindex(execution, of commands)
|
cindex(execution, of commands)
|
||||||
|
cindex(command not found, handling of)
|
||||||
|
findex(command_not_found_handler)
|
||||||
If a command name contains no slashes, the shell attempts to locate
|
If a command name contains no slashes, the shell attempts to locate
|
||||||
it. If there exists a shell function by that name, the function
|
it. If there exists a shell function by that name, the function
|
||||||
is invoked as described in noderef(Functions). If there exists
|
is invoked as described in noderef(Functions). If there exists
|
||||||
|
@ -23,3 +25,13 @@ is a file beginning with `tt(#!)', the remainder of the first line
|
||||||
specifies an interpreter for the program. The shell will
|
specifies an interpreter for the program. The shell will
|
||||||
execute the specified interpreter on operating systems that do
|
execute the specified interpreter on operating systems that do
|
||||||
not handle this executable format in the kernel.
|
not handle this executable format in the kernel.
|
||||||
|
|
||||||
|
If no external command is found but a function tt(command_not_found_handler)
|
||||||
|
exists the shell executes this function with all
|
||||||
|
command line arguments. The function should return status zero if it
|
||||||
|
successfully handled the command, or non-zero status if it failed.
|
||||||
|
In the latter case the standard handling is applied: `command not
|
||||||
|
found' is printed to standard error and the shell exits with status 127.
|
||||||
|
Note that the handler is executed in a subshell forked to execute
|
||||||
|
an external command, hence changes to directories, shell parameters,
|
||||||
|
etc. have no effect on the main shell.
|
||||||
|
|
23
Src/exec.c
23
Src/exec.c
|
@ -468,6 +468,25 @@ isgooderr(int e, char *dir)
|
||||||
e != ENOENT && e != ENOTDIR);
|
e != ENOENT && e != ENOTDIR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Attempt to handle command not found.
|
||||||
|
* Return 0 if the condition was handled, non-zero otherwise.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**/
|
||||||
|
static int
|
||||||
|
commandnotfound(char *arg0, LinkList args)
|
||||||
|
{
|
||||||
|
Shfunc shf = (Shfunc)
|
||||||
|
shfunctab->getnode(shfunctab, "command_not_found_handler");
|
||||||
|
|
||||||
|
if (!shf)
|
||||||
|
return 127;
|
||||||
|
|
||||||
|
pushnode(args, arg0);
|
||||||
|
return doshfunc(shf->node.nam, shf->funcdef, args, shf->node.flags, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* execute an external command */
|
/* execute an external command */
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
|
@ -562,6 +581,8 @@ execute(LinkList args, int flags, int defpath)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ps) {
|
if (!ps) {
|
||||||
|
if (commandnotfound(arg0, args) == 0)
|
||||||
|
_exit(0);
|
||||||
zerr("command not found: %s", arg0);
|
zerr("command not found: %s", arg0);
|
||||||
_exit(127);
|
_exit(127);
|
||||||
}
|
}
|
||||||
|
@ -624,6 +645,8 @@ execute(LinkList args, int flags, int defpath)
|
||||||
|
|
||||||
if (eno)
|
if (eno)
|
||||||
zerr("%e: %s", eno, arg0);
|
zerr("%e: %s", eno, arg0);
|
||||||
|
else if (commandnotfound(arg0, args) == 0)
|
||||||
|
_exit(0);
|
||||||
else
|
else
|
||||||
zerr("command not found: %s", arg0);
|
zerr("command not found: %s", arg0);
|
||||||
_exit((eno == EACCES || eno == ENOEXEC) ? 126 : 127);
|
_exit((eno == EACCES || eno == ENOEXEC) ? 126 : 127);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue