diff --git a/src/execution/execution_helpers.c b/src/execution/execution_helpers.c index 5157290..4d1848a 100644 --- a/src/execution/execution_helpers.c +++ b/src/execution/execution_helpers.c @@ -125,6 +125,7 @@ static int try_builtin(char **argv, struct hash_map *vars); static int builtin_break(char **argv); static int builtin_continue(char **argv); +static int builtin_unset(char **argv, struct hash_map *vars); static int exec_assignment(struct list *assignment_list, struct hash_map *vars) { @@ -487,6 +488,23 @@ static int builtin_cd(char **argv, struct hash_map *vars) return 0; } +static int builtin_unset(char **argv, struct hash_map *vars) +{ + if (!argv) + return 0; + for (int i = 1; argv[i]; i++) + { + const char *name = argv[i]; + if (name == NULL || name[0] == '\0') + continue; + // remove from shell variables + hash_map_remove(vars, name); + // remove from environment variables + unsetenv(name); + } + return 0; +} + /** * @brief Tries to execute a builtin command if the command matches a builtin * @@ -500,6 +518,8 @@ static int try_builtin(char **argv, struct hash_map *vars) if (strcmp(argv[0], "echo") == 0) return builtin_echo(argv); + if (strcmp(argv[0], "unset") == 0) + return builtin_unset(argv, vars); if (strcmp(argv[0], "true") == 0) return builtin_true(argv); if (strcmp(argv[0], "false") == 0)