chore: removed unused files
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -69,5 +69,3 @@ dkms.conf
|
|||||||
|
|
||||||
# debug information files
|
# debug information files
|
||||||
*.dwo
|
*.dwo
|
||||||
|
|
||||||
minishell-codex/
|
|
||||||
72
AGENTS.md
72
AGENTS.md
@@ -1,72 +0,0 @@
|
|||||||
# Repository Guidelines
|
|
||||||
|
|
||||||
## Project Structure & Module Organization
|
|
||||||
- `src/` holds the shell implementation, with submodules for `builtins/`, `executor/`, `parser/`, and `variables/`.
|
|
||||||
- `src/builtins/` currently includes: `cd`, `echo`, `env`, `exit`, `export`, `pwd`, `unset`.
|
|
||||||
- `src/executor/` includes pipeline/process orchestration plus file redirections in `redirections.c`.
|
|
||||||
- `include/` contains public headers used across modules.
|
|
||||||
- `lib/` is populated at build time with third-party 42 libraries (libft, get_next_line, ft_printf, ft_args).
|
|
||||||
- `docs/` stores project references and manual test notes (see `docs/tests.md`).
|
|
||||||
- `build/` is the object output directory generated by `make`.
|
|
||||||
|
|
||||||
## Build, Test, and Development Commands
|
|
||||||
- `make` or `make all`: build `minishell` (auto-clones required libs into `lib/`).
|
|
||||||
- `make clean`: remove objects in `build/`.
|
|
||||||
- `make fclean`: remove objects and the `minishell` binary (also cleans libs).
|
|
||||||
- `make re`: full rebuild.
|
|
||||||
- `./minishell`: run locally after a build.
|
|
||||||
- `make DEBUG=lldb` or `make DEBUG=valgrind` or `make DEBUG=address`: rebuild with debug/ASan-friendly flags.
|
|
||||||
|
|
||||||
## Coding Style & Naming Conventions
|
|
||||||
- The codebase follows 42 **Norminette v4** rules. Run `norminette *.c *.h` (or on specific files) before submitting changes.
|
|
||||||
- Keep file names lowercase with underscores (e.g., `src/builtins/echo/echo.c`).
|
|
||||||
- Keep headers in `include/` and expose only what modules need.
|
|
||||||
- Before adding or changing code, check `allowed.txt` to know which functions are permitted.
|
|
||||||
- Any function not listed in `allowed.txt` is not allowed in this project.
|
|
||||||
|
|
||||||
## Parser & Lexer Functionality (Current `src/parser`)
|
|
||||||
- Runtime entrypoint is `parse(line, minishell)` from `src/minishell.c` (`readline -> parse -> execute`).
|
|
||||||
- `parse` calls `lex(line)` and then converts token lists to `t_command` nodes with `parse_tokens`.
|
|
||||||
- `command_new` builds one command from tokens up to `TOKEN_PIPE`.
|
|
||||||
- `words_add` stores consecutive `TOKEN_WORD` tokens in `command->argv` and increments `argc`.
|
|
||||||
- `expand_envs` is currently a TODO (no `$VAR` expansion is applied in parser stage).
|
|
||||||
- Redirection tokens are converted into `t_redirection` and stored in `t_command.redirections`; heredocs are stored in `t_command.heredocs`.
|
|
||||||
- Path resolution is handled in executor (`executor_resolve_command_path`) before `execve`.
|
|
||||||
- `src/parser/lexer.c` provides a separate lexer (`lex`) that tokenizes into `TOKEN_WORD`, `TOKEN_PIPE`, `TOKEN_REDIRECT_IN`, `TOKEN_REDIRECT_OUT`, `TOKEN_APPEND`, and `TOKEN_HEREDOC`.
|
|
||||||
- The lexer tracks single/double quote context so metacharacters inside quotes remain part of words.
|
|
||||||
- Meta runs are read as contiguous chunks in `read_token` (for example, repeated `|`/`<`/`>` are captured as one token value).
|
|
||||||
- Current parser flow consumes lexer output directly.
|
|
||||||
|
|
||||||
## Executor Redirections (Current `src/executor`)
|
|
||||||
- File redirections are applied in `src/executor/redirections.c` via `open` + `dup2` before command execution.
|
|
||||||
- Supported file redirections: input `<`, output truncate `>`, output append `>>`.
|
|
||||||
- Redirections are applied for both forked commands (child path) and single builtins executed in parent.
|
|
||||||
- Parent-builtin redirections save/restore `STDIN_FILENO` and `STDOUT_FILENO` after builtin execution.
|
|
||||||
|
|
||||||
## Parser & Lexer Known Gaps
|
|
||||||
- Heredoc tokens are parsed and stored, but runtime heredoc execution/input feeding is still pending in executor.
|
|
||||||
- No explicit unmatched-quote syntax error handling is implemented in parser/lexer path.
|
|
||||||
|
|
||||||
## Testing Guidelines
|
|
||||||
- There is no automated test runner. Use manual checks in `docs/tests.md` and basic shell behavior checks (pipes, redirects, builtins).
|
|
||||||
- A local builtin edge-case script exists at `tests/builtins_edge_cases.sh` (expects a compiled `./minishell`).
|
|
||||||
- When debugging memory issues, run under valgrind and use the suppression file in `valgrind/readline.supp`.
|
|
||||||
|
|
||||||
## Builtins Status
|
|
||||||
- `cd`: handles `HOME` fallback, `cd -` via `OLDPWD`, updates `PWD`/`OLDPWD`, and returns failure on invalid usage (`too many arguments`, missing `HOME`/`OLDPWD`).
|
|
||||||
- `echo`: supports repeated `-n` flags (`-n`, `-nnn`) and prints remaining args preserving spaces between tokens.
|
|
||||||
- `env`: prints current environment as `KEY=VALUE`; returns failure when called with extra arguments.
|
|
||||||
- `exit`: validates numeric argument (with overflow checks), returns `1` on `too many arguments` without exiting, and exits with `2` on non-numeric argument.
|
|
||||||
- `export`: supports `NAME=VALUE` and `NAME` (stored as empty value), validates identifiers, and returns failure when any identifier is invalid.
|
|
||||||
- `pwd`: prints working directory using dynamic `getcwd` and returns failure if `getcwd` fails.
|
|
||||||
- `unset`: validates identifiers and removes matching variables from the environment map.
|
|
||||||
|
|
||||||
## Commit & Pull Request Guidelines
|
|
||||||
- Commit messages in this repo use a simple `type: summary` format (examples: `update: ...`, `fix: ...`). Keep summaries short and specific.
|
|
||||||
- For PRs, include:
|
|
||||||
1. What changed and why.
|
|
||||||
2. How to test (commands or manual steps).
|
|
||||||
3. Notes on any parser/executor/builtin behavior changes.
|
|
||||||
|
|
||||||
## Configuration Tips
|
|
||||||
- The project depends on `readline`; ensure your system has `libreadline-dev` or equivalent before building.
|
|
||||||
177
allowed.txt
177
allowed.txt
@@ -1,177 +0,0 @@
|
|||||||
[minishell_allowed]
|
|
||||||
readline
|
|
||||||
rl_clear_history
|
|
||||||
rl_on_new_line
|
|
||||||
rl_replace_line
|
|
||||||
rl_redisplay
|
|
||||||
add_history
|
|
||||||
printf
|
|
||||||
malloc
|
|
||||||
free
|
|
||||||
write
|
|
||||||
access
|
|
||||||
open
|
|
||||||
read
|
|
||||||
close
|
|
||||||
fork
|
|
||||||
wait
|
|
||||||
waitpid
|
|
||||||
wait3
|
|
||||||
wait4
|
|
||||||
signal
|
|
||||||
sigaction
|
|
||||||
sigemptyset
|
|
||||||
sigaddset
|
|
||||||
kill
|
|
||||||
exit
|
|
||||||
getcwd
|
|
||||||
chdir
|
|
||||||
stat
|
|
||||||
lstat
|
|
||||||
fstat
|
|
||||||
unlink
|
|
||||||
execve
|
|
||||||
dup
|
|
||||||
dup2
|
|
||||||
pipe
|
|
||||||
opendir
|
|
||||||
readdir
|
|
||||||
closedir
|
|
||||||
strerror
|
|
||||||
perror
|
|
||||||
isatty
|
|
||||||
ttyname
|
|
||||||
ttyslot
|
|
||||||
ioctl
|
|
||||||
getenv
|
|
||||||
tcsetattr
|
|
||||||
tcgetattr
|
|
||||||
tgetent
|
|
||||||
tgetflag
|
|
||||||
tgetnum
|
|
||||||
tgetstr
|
|
||||||
tgoto
|
|
||||||
tputs
|
|
||||||
|
|
||||||
[libft]
|
|
||||||
ft_atoi
|
|
||||||
ft_atoi_base
|
|
||||||
ft_atol
|
|
||||||
ft_bzero
|
|
||||||
ft_calloc
|
|
||||||
ft_cdlstadd_back
|
|
||||||
ft_cdlstadd_front
|
|
||||||
ft_cdlstclear
|
|
||||||
ft_cdlstdelone
|
|
||||||
ft_cdlstiter
|
|
||||||
ft_cdlstlast
|
|
||||||
ft_cdlstmap
|
|
||||||
ft_cdlstnew
|
|
||||||
ft_cdlstsize
|
|
||||||
ft_clstadd_back
|
|
||||||
ft_clstadd_front
|
|
||||||
ft_clstclear
|
|
||||||
ft_clstdelone
|
|
||||||
ft_clstiter
|
|
||||||
ft_clstlast
|
|
||||||
ft_clstmap
|
|
||||||
ft_clstnew
|
|
||||||
ft_clstsize
|
|
||||||
ft_dlstadd_back
|
|
||||||
ft_dlstadd_front
|
|
||||||
ft_dlstclear
|
|
||||||
ft_dlstdelone
|
|
||||||
ft_dlstiter
|
|
||||||
ft_dlstlast
|
|
||||||
ft_dlstmap
|
|
||||||
ft_dlstnew
|
|
||||||
ft_dlstsize
|
|
||||||
ft_eputchar
|
|
||||||
ft_eputendl
|
|
||||||
ft_eputnbr
|
|
||||||
ft_eputstr
|
|
||||||
ft_free
|
|
||||||
ft_free_split
|
|
||||||
ft_hashmap_clear
|
|
||||||
ft_hashmap_clear_keys
|
|
||||||
ft_hashmap_contains_key
|
|
||||||
ft_hashmap_entries
|
|
||||||
ft_hashmap_get
|
|
||||||
ft_hashmap_hashstr
|
|
||||||
ft_hashmap_new
|
|
||||||
ft_hashmap_put
|
|
||||||
ft_hashmap_remove
|
|
||||||
ft_hashmap_strcmp
|
|
||||||
ft_hashstr
|
|
||||||
ft_iabs
|
|
||||||
ft_imin
|
|
||||||
ft_isalnum
|
|
||||||
ft_isalpha
|
|
||||||
ft_isascii
|
|
||||||
ft_iscntrl
|
|
||||||
ft_isdigit
|
|
||||||
ft_islower
|
|
||||||
ft_isprint
|
|
||||||
ft_isspace
|
|
||||||
ft_isupper
|
|
||||||
ft_itoa
|
|
||||||
ft_itoa_base
|
|
||||||
ft_lstadd_back
|
|
||||||
ft_lstadd_front
|
|
||||||
ft_lstclear
|
|
||||||
ft_lstclear_nodes
|
|
||||||
ft_lstdelone
|
|
||||||
ft_lstiter
|
|
||||||
ft_lstlast
|
|
||||||
ft_lstmap
|
|
||||||
ft_lstnew
|
|
||||||
ft_lstsize
|
|
||||||
ft_ltoa
|
|
||||||
ft_memchr
|
|
||||||
ft_memcmp
|
|
||||||
ft_memcpy
|
|
||||||
ft_memmove
|
|
||||||
ft_memset
|
|
||||||
ft_nsplit
|
|
||||||
ft_pow
|
|
||||||
ft_putchar
|
|
||||||
ft_putchar_fd
|
|
||||||
ft_putendl
|
|
||||||
ft_putendl_fd
|
|
||||||
ft_putnbr
|
|
||||||
ft_putnbr_fd
|
|
||||||
ft_putstr
|
|
||||||
ft_putstr_fd
|
|
||||||
ft_realloc
|
|
||||||
ft_split
|
|
||||||
ft_strchr
|
|
||||||
ft_strcmp
|
|
||||||
ft_strdup
|
|
||||||
ft_strisnum
|
|
||||||
ft_striteri
|
|
||||||
ft_strjoin
|
|
||||||
ft_strlcat
|
|
||||||
ft_strlcpy
|
|
||||||
ft_strlen
|
|
||||||
ft_strmapi
|
|
||||||
ft_strncmp
|
|
||||||
ft_strncpy
|
|
||||||
ft_strnjoin
|
|
||||||
ft_strnstr
|
|
||||||
ft_strrchr
|
|
||||||
ft_strtrim
|
|
||||||
ft_substr
|
|
||||||
ft_swap
|
|
||||||
ft_tolower
|
|
||||||
ft_toupper
|
|
||||||
ft_uitoa
|
|
||||||
ft_uitoa_base
|
|
||||||
ft_ultoa_base
|
|
||||||
|
|
||||||
[get_next_line]
|
|
||||||
get_next_line
|
|
||||||
|
|
||||||
[ft_printf]
|
|
||||||
ft_eprintf
|
|
||||||
ft_fprintf
|
|
||||||
ft_printf
|
|
||||||
@@ -1,151 +0,0 @@
|
|||||||
# Correcciones en Builtins
|
|
||||||
|
|
||||||
Este documento resume los fallos detectados en los builtins actuales y la
|
|
||||||
solucion aplicada en codigo.
|
|
||||||
|
|
||||||
## 1) Infraestructura de builtins (`include/builtins.h`, `src/builtins/builtins.c`)
|
|
||||||
|
|
||||||
### Fallo
|
|
||||||
- Uso inconsistente de tipos (`u_int8_t`/`unsigned char` frente a `uint8_t`).
|
|
||||||
- `set_builtins` no comprobaba fallos de registro por builtin (duplicado de
|
|
||||||
clave o insercion en hashmap), pudiendo dejar estado parcial.
|
|
||||||
- `is_builtin` podia dereferenciar punteros nulos.
|
|
||||||
|
|
||||||
### Por que fallaba
|
|
||||||
- `u_int8_t` no es el tipo estandar C99 y depende de plataforma/headers.
|
|
||||||
- Si falla una insercion, la tabla quedaba inicializada parcialmente sin
|
|
||||||
rollback.
|
|
||||||
- En errores de inicializacion, consultar `is_builtin` podia romper.
|
|
||||||
|
|
||||||
### Solucion
|
|
||||||
- Unificacion de firmas a `uint8_t`.
|
|
||||||
- Nuevo helper `register_builtin()` con validacion tras `ft_hashmap_put`.
|
|
||||||
- Si falla cualquier alta: limpieza de `minishell->builtins` y retorno de
|
|
||||||
error.
|
|
||||||
- Guardas nulas en `is_builtin`.
|
|
||||||
|
|
||||||
## 2) `cd` (`src/builtins/cd/cd.c`)
|
|
||||||
|
|
||||||
### Fallo
|
|
||||||
- `cd` con demasiados argumentos devolvia `2` (bash devuelve `1`).
|
|
||||||
- `cd` sin `HOME` acababa llamando a `chdir(NULL)`.
|
|
||||||
- El manejo de error usaba comprobaciones invertidas (`access`) y codigos
|
|
||||||
incorrectos.
|
|
||||||
- No se actualizaban `PWD` y `OLDPWD` tras `chdir` exitoso.
|
|
||||||
- `cd -` (usar `OLDPWD`) no estaba soportado.
|
|
||||||
|
|
||||||
### Por que fallaba
|
|
||||||
- Codigos de salida incompatibles con el comportamiento esperado del shell.
|
|
||||||
- `HOME` no definido no se controlaba antes del `chdir`.
|
|
||||||
- La logica de `access` estaba al reves y mezclaba condiciones.
|
|
||||||
- Variables de entorno del directorio quedaban desincronizadas.
|
|
||||||
- Faltaba resolver el caso especial de `-` hacia `OLDPWD`.
|
|
||||||
|
|
||||||
### Solucion
|
|
||||||
- Refactor en `resolve_cd_path()` para validar argumentos y `HOME`.
|
|
||||||
- Retorno `EXIT_FAILURE` en `too many arguments` y `HOME not set`.
|
|
||||||
- Error de `chdir` simplificado a `perror("minishell: cd")` + retorno `1`.
|
|
||||||
- Actualizacion de `OLDPWD` y `PWD` mediante `getcwd(NULL, 0)` + `set_env()`.
|
|
||||||
- Soporte de `cd -`: usa `OLDPWD`, valida `OLDPWD not set` e imprime el nuevo
|
|
||||||
directorio tras el cambio.
|
|
||||||
|
|
||||||
## 3) `exit` (`src/builtins/exit/exit.c`)
|
|
||||||
|
|
||||||
### Fallo
|
|
||||||
- Habia un `printf` de debug en ejecucion real.
|
|
||||||
- `exit <no_numerico>` devolvia `2` pero no cerraba el shell.
|
|
||||||
- `exit n m` devolvia `2`; en bash es `1` y no sale del shell.
|
|
||||||
- Validacion numerica basada en `ft_strisnum` sin control de overflow.
|
|
||||||
- Se mostraba `exit` incluso en contexto no interactivo.
|
|
||||||
|
|
||||||
### Por que fallaba
|
|
||||||
- Debug residual contamina salida.
|
|
||||||
- Semantica de `exit` incompleta respecto a bash.
|
|
||||||
- Valores fuera de rango podian tratarse como validos por conversion directa.
|
|
||||||
- Mensaje `exit` debe mostrarse solo en shell interactivo.
|
|
||||||
|
|
||||||
### Solucion
|
|
||||||
- Eliminado debug print.
|
|
||||||
- Nuevo flujo `resolve_exit_status()`:
|
|
||||||
- Sin argumentos: usa `msh->exit_status`.
|
|
||||||
- Argumento no numerico o fuera de `long`: mensaje
|
|
||||||
`numeric argument required`, `msh->exit = true`, estado `2`.
|
|
||||||
- Demasiados argumentos: mensaje de error y estado `1`, sin salir.
|
|
||||||
- Parser numerico propio (`get_uint8_from_num` + `has_overflow`) con soporte
|
|
||||||
de signo y control de overflow.
|
|
||||||
- `ft_eputendl("exit")` solo si `isatty(STDIN_FILENO)`.
|
|
||||||
|
|
||||||
## 4) `pwd` (`src/builtins/pwd/pwd.c`)
|
|
||||||
|
|
||||||
### Fallo
|
|
||||||
- Si `getcwd` fallaba, el builtin devolvia `EXIT_SUCCESS`.
|
|
||||||
- Uso de buffer fijo (`PATH_MAX`) menos robusto para rutas largas.
|
|
||||||
|
|
||||||
### Por que fallaba
|
|
||||||
- El shell reportaba exito aunque no pudiera obtener el directorio.
|
|
||||||
- Un buffer fijo puede truncar o fallar en escenarios de rutas profundas.
|
|
||||||
|
|
||||||
### Solucion
|
|
||||||
- Cambio a `getcwd(NULL, 0)` con memoria dinamica.
|
|
||||||
- Si falla, `perror("minishell: pwd")` y retorno `EXIT_FAILURE`.
|
|
||||||
- `free()` del buffer dinamico tras imprimir.
|
|
||||||
|
|
||||||
## 5) `echo` (`src/builtins/echo/echo.c`, `src/builtins/echo/echo_def.c`)
|
|
||||||
|
|
||||||
### Cambio aplicado
|
|
||||||
- Ajuste de tipos de retorno auxiliares a `uint8_t` para mantener consistencia
|
|
||||||
con `builtins.h`.
|
|
||||||
|
|
||||||
### Nota
|
|
||||||
- No se detectaron fallos funcionales criticos adicionales en la logica actual
|
|
||||||
de `echo` durante esta revision.
|
|
||||||
|
|
||||||
## 6) Builtins faltantes: `env`, `export`, `unset`
|
|
||||||
|
|
||||||
### Fallo
|
|
||||||
- Los builtins `env`, `export` y `unset` no estaban implementados ni
|
|
||||||
registrados en `set_builtins`.
|
|
||||||
|
|
||||||
### Por que fallaba
|
|
||||||
- Comandos basicos de shell no existian en la tabla de builtins.
|
|
||||||
- Cualquier prueba/flujo que dependiera de gestion de variables exportadas
|
|
||||||
fallaba (listar, crear y eliminar variables de entorno).
|
|
||||||
|
|
||||||
### Solucion
|
|
||||||
- Nuevos builtins implementados:
|
|
||||||
- `src/builtins/env/env.c`
|
|
||||||
- `src/builtins/export/export.c`
|
|
||||||
- `src/builtins/unset/unset.c`
|
|
||||||
- Registro en `src/builtins/builtins.c` (tabla ampliada de 4 a 7 entradas).
|
|
||||||
- Nuevos prototipos en `include/builtins.h`.
|
|
||||||
- Soporte de borrado real de entorno mediante `unset_env`:
|
|
||||||
- Declaracion en `include/core.h`
|
|
||||||
- Implementacion en `src/variables/environment_unset.c`
|
|
||||||
|
|
||||||
## 7) Comportamiento aplicado en los nuevos builtins
|
|
||||||
|
|
||||||
### `env`
|
|
||||||
- Si recibe argumentos, devuelve error (`minishell: env: too many arguments`)
|
|
||||||
y estado `1`.
|
|
||||||
- Sin argumentos, lista `KEY=VALUE` de las variables de entorno actuales.
|
|
||||||
|
|
||||||
### `export`
|
|
||||||
- `export NAME=VALUE`: crea/actualiza la variable.
|
|
||||||
- `export NAME`: crea/actualiza con valor vacio (`NAME=`) para que aparezca
|
|
||||||
en `env`.
|
|
||||||
- Identificadores invalidos (`1A=2`, etc.) devuelven error
|
|
||||||
`not a valid identifier` y estado `1`.
|
|
||||||
- Sin argumentos, reutiliza el listado de `env`.
|
|
||||||
|
|
||||||
### `unset`
|
|
||||||
- Elimina variables validas del entorno en memoria.
|
|
||||||
- Identificadores invalidos devuelven error
|
|
||||||
`not a valid identifier` y estado `1`.
|
|
||||||
- Si el identificador es valido y no existe, no falla (comportamiento shell).
|
|
||||||
|
|
||||||
## Validacion realizada
|
|
||||||
|
|
||||||
- `norminette` ejecutado sobre los archivos modificados: `OK`.
|
|
||||||
- Build completa no ejecutable en este entorno por falta de acceso de red al
|
|
||||||
clonado de librerias (`github.com`), por lo que no se pudo validar runtime
|
|
||||||
del binario en esta sesion.
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
# Minishell - Resumen para defensa
|
|
||||||
|
|
||||||
Este documento es un guion breve para explicar el proyecto con claridad.
|
|
||||||
|
|
||||||
## 1. Que es minishell
|
|
||||||
- Un shell interactivo basico: lee comandos, los parsea y los ejecuta.
|
|
||||||
- Objetivo didactico: procesos, pipes, fds, señales y parsing.
|
|
||||||
|
|
||||||
## 2. Flujo general (en 20 segundos)
|
|
||||||
1. Prompt con readline.
|
|
||||||
2. Lexer divide la linea en tokens validos (respetando comillas).
|
|
||||||
3. Parser crea comandos, argv y redirecciones.
|
|
||||||
4. Expansion de variables ($VAR, $?).
|
|
||||||
5. Resolver PATH.
|
|
||||||
6. Ejecutar con fork/execve y pipes.
|
|
||||||
7. Actualizar exit status.
|
|
||||||
|
|
||||||
## 3. Puntos clave que suelen preguntar
|
|
||||||
|
|
||||||
### Comillas
|
|
||||||
- Comilla simple: todo literal, no expansion.
|
|
||||||
- Comilla doble: expansion de $VAR, pero no metacaracteres.
|
|
||||||
- Si una comilla no se cierra: error y no se ejecuta nada.
|
|
||||||
|
|
||||||
### Redirecciones
|
|
||||||
- <, >, >>, <<.
|
|
||||||
- Se resuelven antes de ejecutar el comando.
|
|
||||||
- Heredoc: lectura hasta delimitador, sin historial.
|
|
||||||
|
|
||||||
### Pipes
|
|
||||||
- Conecto stdout del comando i con stdin del comando i+1.
|
|
||||||
- Uso pipe() y dup2() en el child.
|
|
||||||
- El padre cierra fds que no usa.
|
|
||||||
|
|
||||||
### Builtins
|
|
||||||
- echo -n, cd, pwd, export, unset, env, exit.
|
|
||||||
- Si no hay pipeline, se ejecutan en el padre para afectar el estado.
|
|
||||||
- En pipeline, se ejecutan en el child.
|
|
||||||
|
|
||||||
### Variables
|
|
||||||
- $VAR: entorno.
|
|
||||||
- $?: ultimo exit status.
|
|
||||||
|
|
||||||
### Senales
|
|
||||||
- Una sola variable global para la senal.
|
|
||||||
- ctrl-C: nueva linea y prompt.
|
|
||||||
- ctrl-D: salir del shell.
|
|
||||||
- ctrl-\: no hace nada.
|
|
||||||
|
|
||||||
## 4. Ejemplos rapidos para demostrar
|
|
||||||
|
|
||||||
1. Pipes
|
|
||||||
- `ls | wc -l`
|
|
||||||
|
|
||||||
2. Redirecciones
|
|
||||||
- `echo hola > out.txt`
|
|
||||||
- `cat < out.txt`
|
|
||||||
|
|
||||||
3. Heredoc
|
|
||||||
- `cat << EOF`
|
|
||||||
- escribir lineas
|
|
||||||
- `EOF`
|
|
||||||
|
|
||||||
4. Expansion
|
|
||||||
- `echo $HOME`
|
|
||||||
- `echo $?`
|
|
||||||
|
|
||||||
## 5. Errores y robustez
|
|
||||||
- No ejecuto si hay errores de parseo.
|
|
||||||
- Mensajes con perror cuando fallan syscalls.
|
|
||||||
- exit_status siempre actualizado.
|
|
||||||
|
|
||||||
## 6. Mensajes finales recomendados
|
|
||||||
- "He separado parsing y ejecucion para que el codigo sea mantenible y
|
|
||||||
la defensa mas clara".
|
|
||||||
- "Sigo el comportamiento de bash como referencia".
|
|
||||||
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
# Errores detectados: parser, expansión y ejecutor
|
|
||||||
|
|
||||||
## Críticos
|
|
||||||
|
|
||||||
1. Segmentation fault al mezclar palabras y redirecciones en un mismo comando.
|
|
||||||
- Síntoma: `echo a > /tmp/x b` puede crashear.
|
|
||||||
- Referencias: `src/parser/parser.c:365`, `src/parser/parser.c:371`, `src/parser/parser.c:187`.
|
|
||||||
|
|
||||||
2. Bucle infinito al recibir EOF en modo no interactivo.
|
|
||||||
- Síntoma: con `printf 'echo ok\n' | ./minishell` entra en loop imprimiendo prompt.
|
|
||||||
- Referencias: `src/minishell.c:40`, `src/minishell.c:42`.
|
|
||||||
|
|
||||||
3. Parseo de pipes inválidos permite ejecución parcial o comandos inválidos.
|
|
||||||
- Síntoma: casos como `| echo x` o `echo hi |` no se bloquean correctamente.
|
|
||||||
- Referencias: `src/parser/parser.c:83`, `src/parser/parser.c:101`, `src/parser/parser.c:221`.
|
|
||||||
|
|
||||||
## Altos
|
|
||||||
|
|
||||||
4. Expansión de variables incompleta e incorrecta en casos especiales.
|
|
||||||
- Síntoma: `$FOO_BAR` y `$_X` fallan; `$?` y `$$` no se expanden correctamente.
|
|
||||||
- Referencias: `src/parser/parser.c:122`, `src/parser/parser.c:156`.
|
|
||||||
|
|
||||||
5. No se eliminan comillas tras parseo/expansión.
|
|
||||||
- Síntoma: `echo "$HOME"` imprime comillas literales.
|
|
||||||
- Referencias: `src/parser/lexer.c:161`, `src/parser/parser.c:142`.
|
|
||||||
|
|
||||||
6. No hay expansión en targets de redirección.
|
|
||||||
- Síntoma: `echo hi > $HOME_test` crea archivo literal `$HOME_test`.
|
|
||||||
- Referencias: `src/parser/parser.c:187`, `src/parser/parser.c:263`.
|
|
||||||
|
|
||||||
7. Heredoc parseado pero no ejecutado en runtime.
|
|
||||||
- Síntoma: se almacena en `heredocs` pero no se aplica en ejecución.
|
|
||||||
- Referencias: `src/parser/parser.c:397`, `src/executor/redirections.c:68`, `src/executor/process_helpers.c:110`.
|
|
||||||
|
|
||||||
8. Lexer acepta operadores inválidos (`||`, `>>>`, `><`) sin validación formal.
|
|
||||||
- Síntoma: tokenización por “runs” de metacaracteres produce entradas inválidas no rechazadas de forma robusta.
|
|
||||||
- Referencias: `src/parser/lexer.c:140`, `src/parser/lexer.c:77`.
|
|
||||||
|
|
||||||
9. Errores de sintaxis no siempre fijan `exit_status` correcto (debería ser `2`).
|
|
||||||
- Síntoma: algunos casos acaban con salida `0`.
|
|
||||||
- Referencias: `src/executor/executor.c:20`, `src/parser/parser.c:101`.
|
|
||||||
|
|
||||||
## Medios
|
|
||||||
|
|
||||||
10. Resolución de rutas explícitas reporta mal algunos errores de permisos/ejecución.
|
|
||||||
- Síntoma: ruta existente no ejecutable puede terminar como `command not found`.
|
|
||||||
- Referencias: `src/executor/path_resolver.c:57`, `src/executor/path_resolver.c:59`, `src/executor/command_exec.c:81`.
|
|
||||||
|
|
||||||
11. Check de puntero nulo defectuoso en el loop principal.
|
|
||||||
- Síntoma: `if (minishell == NULL)` desreferencia igualmente el puntero.
|
|
||||||
- Referencia: `src/minishell.c:35`.
|
|
||||||
|
|
||||||
12. Falta manejo explícito de comillas no cerradas.
|
|
||||||
- Síntoma: entrada con comillas abiertas no genera error sintáctico dedicado.
|
|
||||||
- Referencia: `src/parser/lexer.c:159`.
|
|
||||||
|
|
||||||
@@ -1,292 +0,0 @@
|
|||||||
# Minishell - Guia de estructura y pasos (parte obligatoria)
|
|
||||||
|
|
||||||
Objetivo de este documento
|
|
||||||
- Proponer una estructura de archivos y datos.
|
|
||||||
- Describir el proceso paso a paso como tutorial.
|
|
||||||
- Servir de guion para defensa (explicaciones claras y ordenadas).
|
|
||||||
|
|
||||||
Este documento no implementa nada. Solo define el plan y el por que.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. Vision general del flujo
|
|
||||||
|
|
||||||
El shell se puede explicar como una tuberia de fases:
|
|
||||||
1. Lectura interactiva (prompt + historial).
|
|
||||||
2. Tokenizacion (lexing) con comillas y metacaracteres.
|
|
||||||
3. Parseo (construccion de comandos, redirecciones, pipes).
|
|
||||||
4. Expansion de variables ($VAR y $?).
|
|
||||||
5. Preparacion de ejecucion (resolucion de rutas, heredoc).
|
|
||||||
6. Ejecucion (builtins o execve) con pipes y redirecciones.
|
|
||||||
7. Gestion de exit status y señales.
|
|
||||||
|
|
||||||
Esta separacion permite explicar en defensa cada pieza por separado y justificar
|
|
||||||
las decisiones tecnicas.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. Propuesta de estructuras de datos
|
|
||||||
|
|
||||||
Estas estructuras son solo guia. Adapta nombres a tu estilo y Norminette.
|
|
||||||
|
|
||||||
### 2.1 Token (lexer)
|
|
||||||
Representa una unidad del input (palabra, pipe, redireccion, etc.).
|
|
||||||
|
|
||||||
- enum e_tokentype
|
|
||||||
- TOK_WORD
|
|
||||||
- TOK_PIPE
|
|
||||||
- TOK_REDIR_IN (<)
|
|
||||||
- TOK_REDIR_OUT (>)
|
|
||||||
- TOK_REDIR_APPEND (>>)
|
|
||||||
- TOK_HEREDOC (<<)
|
|
||||||
|
|
||||||
- struct s_token
|
|
||||||
- char *text
|
|
||||||
- t_tokentype type
|
|
||||||
- struct s_token *next
|
|
||||||
|
|
||||||
Uso en defensa: el lexer separa el input en unidades, respetando comillas.
|
|
||||||
|
|
||||||
### 2.2 Redireccion
|
|
||||||
Guarda los datos de redireccion por comando.
|
|
||||||
|
|
||||||
- enum e_redirtype
|
|
||||||
- REDIR_IN
|
|
||||||
- REDIR_OUT
|
|
||||||
- REDIR_APPEND
|
|
||||||
- REDIR_HEREDOC
|
|
||||||
|
|
||||||
- struct s_redir
|
|
||||||
- t_redirtype type
|
|
||||||
- char *target
|
|
||||||
- int fd
|
|
||||||
- struct s_redir *next
|
|
||||||
|
|
||||||
Notas:
|
|
||||||
- target es el filename o delimitador de heredoc.
|
|
||||||
- fd se resuelve en fase de preparacion (open o pipe temporal).
|
|
||||||
|
|
||||||
### 2.3 Comando
|
|
||||||
|
|
||||||
- struct s_command
|
|
||||||
- char **argv
|
|
||||||
- int argc
|
|
||||||
- char *path
|
|
||||||
- t_redir *redirs
|
|
||||||
|
|
||||||
### 2.4 Pipeline
|
|
||||||
Una lista de comandos en orden, unidos por pipes.
|
|
||||||
|
|
||||||
- struct s_pipeline
|
|
||||||
- t_command **cmds
|
|
||||||
- size_t count
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. Lexer: reglas y pasos
|
|
||||||
|
|
||||||
Reglas clave del subject:
|
|
||||||
- No interpretar comillas sin cerrar.
|
|
||||||
- Comilla simple: no se expanden variables ni metacaracteres.
|
|
||||||
- Comilla doble: se expanden variables, pero se respetan caracteres normales.
|
|
||||||
- Metacaracteres: |, <, >, <<, >> separan tokens.
|
|
||||||
|
|
||||||
Pasos recomendados:
|
|
||||||
1. Recorrer la linea caracter a caracter.
|
|
||||||
2. Mantener estado: in_single, in_double.
|
|
||||||
3. Cuando no estas en comillas, detectar metacaracteres y cortar tokens.
|
|
||||||
4. Construir TOK_WORD con el texto exacto (sin eliminar comillas aun).
|
|
||||||
5. Si llegas a fin de linea con in_single o in_double activo, error de parseo.
|
|
||||||
|
|
||||||
Explicacion para defensa:
|
|
||||||
- El lexer no sabe de ejecucion, solo separa en tokens validos.
|
|
||||||
- El manejo de comillas se hace aqui para respetar la sintaxis del shell.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. Parser: construccion de comandos
|
|
||||||
|
|
||||||
Objetivo: transformar tokens en una estructura ejecutable.
|
|
||||||
|
|
||||||
Pasos:
|
|
||||||
1. Recorrer lista de tokens.
|
|
||||||
2. Cada TOK_PIPE cierra un comando actual y abre el siguiente.
|
|
||||||
3. TOK_WORD se agrega a argv.
|
|
||||||
4. TOK_REDIR_* consume el siguiente token (debe ser TOK_WORD) como target.
|
|
||||||
5. Construir lista de redirecciones para cada comando.
|
|
||||||
6. Validar errores: pipe inicial/final, redireccion sin target, etc.
|
|
||||||
|
|
||||||
Explicacion para defensa:
|
|
||||||
- El parser aplica reglas de orden y construye una estructura clara.
|
|
||||||
- Separar argv y redirecciones evita mezclar logica en executor.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. Expansion de variables
|
|
||||||
|
|
||||||
Reglas:
|
|
||||||
- $VAR se sustituye por getenv/tabla interna.
|
|
||||||
- $? se sustituye por el exit_status anterior.
|
|
||||||
- En comilla simple no se expande.
|
|
||||||
- En comilla doble si se expande.
|
|
||||||
|
|
||||||
Proceso recomendado:
|
|
||||||
1. Durante tokenizacion, guardar el texto con sus comillas o bien
|
|
||||||
marcar segmentos con estado de comillas.
|
|
||||||
2. En expansion, recorrer cada palabra y reemplazar $...
|
|
||||||
3. Si variable no existe, reemplazar por string vacio.
|
|
||||||
4. Eliminar comillas despues de la expansion.
|
|
||||||
|
|
||||||
Explicacion para defensa:
|
|
||||||
- La expansion es una fase separada para no complicar el parser.
|
|
||||||
- $?, variable especial, refleja el estado de la ultima ejecucion.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. Redirecciones y heredoc
|
|
||||||
|
|
||||||
Redirecciones basicas:
|
|
||||||
- <: open(file, O_RDONLY)
|
|
||||||
- >: open(file, O_WRONLY | O_CREAT | O_TRUNC)
|
|
||||||
- >>: open(file, O_WRONLY | O_CREAT | O_APPEND)
|
|
||||||
|
|
||||||
Heredoc (<<):
|
|
||||||
1. Leer lineas hasta delimitador exacto.
|
|
||||||
2. Guardar el contenido en un pipe o fichero temporal.
|
|
||||||
3. Usar el extremo de lectura como STDIN del comando.
|
|
||||||
4. No guardar el contenido en historial.
|
|
||||||
|
|
||||||
Explicacion para defensa:
|
|
||||||
- Las redirecciones se resuelven antes de ejecutar el proceso.
|
|
||||||
- Heredoc es una fuente especial de entrada.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. Resolucion de comandos y PATH
|
|
||||||
|
|
||||||
Reglas:
|
|
||||||
- Si argv[0] es una ruta absoluta o relativa (/, ./, ../), usarla tal cual.
|
|
||||||
- Si no, buscar en PATH separando por ':'.
|
|
||||||
- Si es builtin, no se necesita path real.
|
|
||||||
|
|
||||||
Proceso:
|
|
||||||
1. Detectar builtin.
|
|
||||||
2. Si no builtin y no es ruta, recorrer PATH y usar access().
|
|
||||||
3. Guardar path en t_command->path.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 8. Ejecucion
|
|
||||||
|
|
||||||
Caso 1: comando unico builtin
|
|
||||||
- Ejecutar en el proceso padre para que pueda modificar estado del shell
|
|
||||||
(ej: cd, export, unset, exit).
|
|
||||||
|
|
||||||
Caso 2: pipeline o comando externo
|
|
||||||
- Usar fork + execve.
|
|
||||||
- Crear pipes entre comandos.
|
|
||||||
- Aplicar redirecciones antes de ejecutar.
|
|
||||||
|
|
||||||
Proceso para pipeline:
|
|
||||||
1. Para cada comando, crear pipe si hay siguiente.
|
|
||||||
2. fork.
|
|
||||||
3. En child: dup2 para redirecciones y pipes, luego ejecutar.
|
|
||||||
4. En parent: cerrar FDs innecesarios y seguir.
|
|
||||||
5. Esperar procesos, guardar exit status del ultimo comando.
|
|
||||||
|
|
||||||
Explicacion para defensa:
|
|
||||||
- Las pipes conectan stdout del comando i con stdin del comando i+1.
|
|
||||||
- Los builtins dentro de pipeline se ejecutan en child.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 9. Builtins obligatorios
|
|
||||||
|
|
||||||
- echo con -n
|
|
||||||
- cd (ruta relativa o absoluta)
|
|
||||||
- pwd
|
|
||||||
- export (sin opciones)
|
|
||||||
- unset (sin opciones)
|
|
||||||
- env (sin opciones o argumentos)
|
|
||||||
- exit
|
|
||||||
|
|
||||||
Notas de defensa:
|
|
||||||
- export/unset trabajan sobre la tabla de variables del shell.
|
|
||||||
- env imprime variables de entorno.
|
|
||||||
- exit debe actualizar exit_status y terminar el loop principal.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 10. Senales
|
|
||||||
|
|
||||||
Requisitos interactivos:
|
|
||||||
- ctrl-C: imprime nueva linea y muestra prompt.
|
|
||||||
- ctrl-D: termina el shell.
|
|
||||||
- ctrl-\: no hace nada.
|
|
||||||
|
|
||||||
Regla del subject:
|
|
||||||
- Solo una variable global para indicar la senal recibida.
|
|
||||||
|
|
||||||
Proceso:
|
|
||||||
1. Definir una variable global int g_signal.
|
|
||||||
2. Configurar handlers con sigaction.
|
|
||||||
3. En handler: actualizar g_signal y escribir un '\n' si procede.
|
|
||||||
4. En el loop principal: si g_signal indica SIGINT, resetear lineas de readline.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 11. Manejo de errores y salida
|
|
||||||
|
|
||||||
- Mostrar errores con perror o mensajes consistentes.
|
|
||||||
- Si parseo falla, no ejecutar nada.
|
|
||||||
- Mantener exit_status actualizado.
|
|
||||||
|
|
||||||
Explicacion en defensa:
|
|
||||||
- Un shell robusto evita ejecutar comandos parcialmente parseados.
|
|
||||||
- exit_status es clave para $?.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 12. Checklist para defensa (guion rapido)
|
|
||||||
|
|
||||||
1. Explico el flujo completo: lectura -> lexer -> parser -> expansion -> exec.
|
|
||||||
2. Explico como manejo comillas y metacaracteres.
|
|
||||||
3. Explico como construyo argv y redirecciones.
|
|
||||||
4. Explico expansion de $VAR y $?.
|
|
||||||
5. Explico pipes y redirecciones con dup2.
|
|
||||||
6. Explico por que los builtins se ejecutan en parent o child.
|
|
||||||
7. Explico manejo de senales y la variable global unica.
|
|
||||||
8. Explico exit_status y comportamiento de $?.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 13. Sugerencia de estructura de archivos
|
|
||||||
|
|
||||||
- include/
|
|
||||||
- minishell.h
|
|
||||||
- core.h (estructuras globales y estado)
|
|
||||||
- parser.h (tokens, parser)
|
|
||||||
- executor.h
|
|
||||||
- builtins.h
|
|
||||||
|
|
||||||
- src/
|
|
||||||
- core/ (init, signals, util)
|
|
||||||
- parser/ (lexer.c, parser.c, expand.c)
|
|
||||||
- executor/ (executor.c, redirs.c)
|
|
||||||
- builtins/ (echo, cd, pwd, exit, env, export, unset)
|
|
||||||
- variables/ (environment.c)
|
|
||||||
- minishell.c (loop principal)
|
|
||||||
- main.c
|
|
||||||
|
|
||||||
Esto es solo una guia; no es obligatorio seguirla al pie de la letra.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 14. Consejos para la defensa
|
|
||||||
|
|
||||||
- Usa bash como referencia de comportamiento.
|
|
||||||
- Demuestra un par de ejemplos: pipe, redireccion y expansion.
|
|
||||||
- Si algo falla, explica que el parser previene ejecucion parcial.
|
|
||||||
- Recalca el manejo correcto de ctrl-C y ctrl-\.
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,26 +0,0 @@
|
|||||||
Tests eliminados del reporte por ser extras (\ y/o ~):
|
|
||||||
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:52 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:54 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:56 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:58 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:60 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:62 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:64 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:7 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:59 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:61 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:63 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:65 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:67 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:69 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:71 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:314 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:328 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:337 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:606 | motivo: \, ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_redirs.sh:208 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/2_path_check.sh:30 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/8_syntax_errors.sh:19 | motivo: ~
|
|
||||||
|
|
||||||
Total casos eliminados (extras): 22
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
Tests eliminados del reporte por estar fuera del obligatorio:
|
|
||||||
- \ (barra invertida no especificada)
|
|
||||||
- ~ (tilde expansion no obligatoria)
|
|
||||||
- $"..." (extension bash, no requerida)
|
|
||||||
- ; (separador no obligatorio segun subject)
|
|
||||||
- && / || (bonus)
|
|
||||||
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:26 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:28 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:32 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:34 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:52 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:54 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:56 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:58 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:60 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:62 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/0_compare_parsing.sh:64 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/10_parsing_hell.sh:301 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:7 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:31 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:33 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:37 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:39 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:59 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:61 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:63 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:65 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:67 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:69 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:71 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:314 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:328 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:337 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:536 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:538 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:552 | motivo: ; (no obligatorio)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_builtins.sh:606 | motivo: \, ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_redirs.sh:208 | motivo: \
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_variables.sh:40 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_variables.sh:42 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_variables.sh:44 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_variables.sh:48 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_variables.sh:60 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/1_variables.sh:62 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/2_correction.sh:129 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/2_correction.sh:139 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/2_correction.sh:141 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/2_correction.sh:143 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/2_correction.sh:147 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/2_correction.sh:159 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/2_correction.sh:161 | motivo: $"..." (bash extension)
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/2_path_check.sh:30 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/8_syntax_errors.sh:19 | motivo: ~
|
|
||||||
- /home/marcos/programming/minishell_sergio/tests/42_minishell_tester/cmds/mand/8_syntax_errors.sh:68 | motivo: &&/|| (bonus)
|
|
||||||
|
|
||||||
Total casos evaluados en reporte original: 195
|
|
||||||
Total casos eliminados (extras): 48
|
|
||||||
Total casos restantes (mandatory): 147
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
### Multiple redirections
|
|
||||||
|
|
||||||
```
|
|
||||||
cmd > file1 > file2
|
|
||||||
```
|
|
||||||
or
|
|
||||||
```
|
|
||||||
cmd >> file1 >> file2
|
|
||||||
```
|
|
||||||
|
|
||||||
Should create both `file1` and `file2` but store the output in `file2`
|
|
||||||
|
|
||||||
### Environment variables
|
|
||||||
|
|
||||||
#### SHLVL
|
|
||||||
|
|
||||||
Must be increased by 1 if executed from any other shell or 1 if executed
|
|
||||||
Reference in New Issue
Block a user