Add in exec support (patch from Torbj?rn Axelsson <torax@cendio.se>)

and disable backticks (since they are still wierdly broken in some
cases.
This commit is contained in:
Eric Andersen 2000-09-21 02:48:07 +00:00
parent d1de4a16ad
commit d2f5677762
3 changed files with 48 additions and 3 deletions

17
lash.c
View File

@ -26,7 +26,7 @@
*/ */
#define BB_FEATURE_SH_BACKTICKS //#define BB_FEATURE_SH_BACKTICKS
//#define BB_FEATURE_SH_IF_EXPRESSIONS //#define BB_FEATURE_SH_IF_EXPRESSIONS
#define BB_FEATURE_SH_ENVIRONMENT #define BB_FEATURE_SH_ENVIRONMENT
//#define DEBUG_SHELL //#define DEBUG_SHELL
@ -108,6 +108,7 @@ struct builtInCommand {
/* function prototypes for builtins */ /* function prototypes for builtins */
static int builtin_cd(struct job *cmd, struct jobSet *junk); static int builtin_cd(struct job *cmd, struct jobSet *junk);
static int builtin_env(struct job *dummy, struct jobSet *junk); static int builtin_env(struct job *dummy, struct jobSet *junk);
static int builtin_exec(struct job *cmd, struct jobSet *junk);
static int builtin_exit(struct job *cmd, struct jobSet *junk); static int builtin_exit(struct job *cmd, struct jobSet *junk);
static int builtin_fg_bg(struct job *cmd, struct jobSet *jobList); static int builtin_fg_bg(struct job *cmd, struct jobSet *jobList);
static int builtin_help(struct job *cmd, struct jobSet *junk); static int builtin_help(struct job *cmd, struct jobSet *junk);
@ -139,6 +140,7 @@ static int busy_loop(FILE * input);
static struct builtInCommand bltins[] = { static struct builtInCommand bltins[] = {
{"bg", "Resume a job in the background", builtin_fg_bg}, {"bg", "Resume a job in the background", builtin_fg_bg},
{"cd", "Change working directory", builtin_cd}, {"cd", "Change working directory", builtin_cd},
{"exec", "Exec command, replacing this shell with the exec'd process", builtin_exec},
{"exit", "Exit from shell()", builtin_exit}, {"exit", "Exit from shell()", builtin_exit},
{"fg", "Bring job into the foreground", builtin_fg_bg}, {"fg", "Bring job into the foreground", builtin_fg_bg},
{"jobs", "Lists the active jobs", builtin_jobs}, {"jobs", "Lists the active jobs", builtin_jobs},
@ -219,6 +221,19 @@ static int builtin_env(struct job *dummy, struct jobSet *junk)
return (0); return (0);
} }
/* built-in 'exec' handler */
static int builtin_exec(struct job *cmd, struct jobSet *junk)
{
if (cmd->progs[0].argv[1])
{
cmd->progs[0].argv++;
execvp(cmd->progs[0].argv[0], cmd->progs[0].argv);
fatalError("Exec to %s failed: %s\n", cmd->progs[0].argv[0],
strerror(errno));
}
return TRUE;
}
/* built-in 'exit' handler */ /* built-in 'exit' handler */
static int builtin_exit(struct job *cmd, struct jobSet *junk) static int builtin_exit(struct job *cmd, struct jobSet *junk)
{ {

17
sh.c
View File

@ -26,7 +26,7 @@
*/ */
#define BB_FEATURE_SH_BACKTICKS //#define BB_FEATURE_SH_BACKTICKS
//#define BB_FEATURE_SH_IF_EXPRESSIONS //#define BB_FEATURE_SH_IF_EXPRESSIONS
#define BB_FEATURE_SH_ENVIRONMENT #define BB_FEATURE_SH_ENVIRONMENT
//#define DEBUG_SHELL //#define DEBUG_SHELL
@ -108,6 +108,7 @@ struct builtInCommand {
/* function prototypes for builtins */ /* function prototypes for builtins */
static int builtin_cd(struct job *cmd, struct jobSet *junk); static int builtin_cd(struct job *cmd, struct jobSet *junk);
static int builtin_env(struct job *dummy, struct jobSet *junk); static int builtin_env(struct job *dummy, struct jobSet *junk);
static int builtin_exec(struct job *cmd, struct jobSet *junk);
static int builtin_exit(struct job *cmd, struct jobSet *junk); static int builtin_exit(struct job *cmd, struct jobSet *junk);
static int builtin_fg_bg(struct job *cmd, struct jobSet *jobList); static int builtin_fg_bg(struct job *cmd, struct jobSet *jobList);
static int builtin_help(struct job *cmd, struct jobSet *junk); static int builtin_help(struct job *cmd, struct jobSet *junk);
@ -139,6 +140,7 @@ static int busy_loop(FILE * input);
static struct builtInCommand bltins[] = { static struct builtInCommand bltins[] = {
{"bg", "Resume a job in the background", builtin_fg_bg}, {"bg", "Resume a job in the background", builtin_fg_bg},
{"cd", "Change working directory", builtin_cd}, {"cd", "Change working directory", builtin_cd},
{"exec", "Exec command, replacing this shell with the exec'd process", builtin_exec},
{"exit", "Exit from shell()", builtin_exit}, {"exit", "Exit from shell()", builtin_exit},
{"fg", "Bring job into the foreground", builtin_fg_bg}, {"fg", "Bring job into the foreground", builtin_fg_bg},
{"jobs", "Lists the active jobs", builtin_jobs}, {"jobs", "Lists the active jobs", builtin_jobs},
@ -219,6 +221,19 @@ static int builtin_env(struct job *dummy, struct jobSet *junk)
return (0); return (0);
} }
/* built-in 'exec' handler */
static int builtin_exec(struct job *cmd, struct jobSet *junk)
{
if (cmd->progs[0].argv[1])
{
cmd->progs[0].argv++;
execvp(cmd->progs[0].argv[0], cmd->progs[0].argv);
fatalError("Exec to %s failed: %s\n", cmd->progs[0].argv[0],
strerror(errno));
}
return TRUE;
}
/* built-in 'exit' handler */ /* built-in 'exit' handler */
static int builtin_exit(struct job *cmd, struct jobSet *junk) static int builtin_exit(struct job *cmd, struct jobSet *junk)
{ {

View File

@ -26,7 +26,7 @@
*/ */
#define BB_FEATURE_SH_BACKTICKS //#define BB_FEATURE_SH_BACKTICKS
//#define BB_FEATURE_SH_IF_EXPRESSIONS //#define BB_FEATURE_SH_IF_EXPRESSIONS
#define BB_FEATURE_SH_ENVIRONMENT #define BB_FEATURE_SH_ENVIRONMENT
//#define DEBUG_SHELL //#define DEBUG_SHELL
@ -108,6 +108,7 @@ struct builtInCommand {
/* function prototypes for builtins */ /* function prototypes for builtins */
static int builtin_cd(struct job *cmd, struct jobSet *junk); static int builtin_cd(struct job *cmd, struct jobSet *junk);
static int builtin_env(struct job *dummy, struct jobSet *junk); static int builtin_env(struct job *dummy, struct jobSet *junk);
static int builtin_exec(struct job *cmd, struct jobSet *junk);
static int builtin_exit(struct job *cmd, struct jobSet *junk); static int builtin_exit(struct job *cmd, struct jobSet *junk);
static int builtin_fg_bg(struct job *cmd, struct jobSet *jobList); static int builtin_fg_bg(struct job *cmd, struct jobSet *jobList);
static int builtin_help(struct job *cmd, struct jobSet *junk); static int builtin_help(struct job *cmd, struct jobSet *junk);
@ -139,6 +140,7 @@ static int busy_loop(FILE * input);
static struct builtInCommand bltins[] = { static struct builtInCommand bltins[] = {
{"bg", "Resume a job in the background", builtin_fg_bg}, {"bg", "Resume a job in the background", builtin_fg_bg},
{"cd", "Change working directory", builtin_cd}, {"cd", "Change working directory", builtin_cd},
{"exec", "Exec command, replacing this shell with the exec'd process", builtin_exec},
{"exit", "Exit from shell()", builtin_exit}, {"exit", "Exit from shell()", builtin_exit},
{"fg", "Bring job into the foreground", builtin_fg_bg}, {"fg", "Bring job into the foreground", builtin_fg_bg},
{"jobs", "Lists the active jobs", builtin_jobs}, {"jobs", "Lists the active jobs", builtin_jobs},
@ -219,6 +221,19 @@ static int builtin_env(struct job *dummy, struct jobSet *junk)
return (0); return (0);
} }
/* built-in 'exec' handler */
static int builtin_exec(struct job *cmd, struct jobSet *junk)
{
if (cmd->progs[0].argv[1])
{
cmd->progs[0].argv++;
execvp(cmd->progs[0].argv[0], cmd->progs[0].argv);
fatalError("Exec to %s failed: %s\n", cmd->progs[0].argv[0],
strerror(errno));
}
return TRUE;
}
/* built-in 'exit' handler */ /* built-in 'exit' handler */
static int builtin_exit(struct job *cmd, struct jobSet *junk) static int builtin_exit(struct job *cmd, struct jobSet *junk)
{ {