El objetivo del proyecto es hacer un shell que simule los shells del sistema operativo linux.
Las funcionalidades son las siguientes:
- Al ejecutar el programa este debe imprimir un prompt (ejemplo "$ ")
- Ejecutar comandos e imprimir su salida
- Poder ejecutar el comando
cd
(y que cambie de directorio) - Redirigir entrada y salida estándar de comandos hacia/desde ficheros con
>
,<
,>>
- Redirigir la salida estándar de un comando hacia la entrada de otro con un pipe
|
- Una vez terminado el comando previo, se debe mostrar el prompt nuevamente.
- Solamente habrá un espacio entre cada uno de los tokens de la entrada
- comandos
- parámetros
- operadores de redirección (
>
,|
, etc.)
y hasta aquí tienen 3 puntos en el proyecto
- Implementar más de una tubería (1pt adicional)
- Implementar el operador
&
y tener procesos en el background (1pt adicional)
- jobs => listar todos los procesos que están corriendo en el background
- fg => envía el proceso hacia el foreground
- NOTA: aquí tiene que funcionar algo como
command1 < file1 | command2 > file2 &
- Permitir cualquier cantidad de espacios o no entre los comandos y parámetros (0.5pt adicional)
- Implementar un historial de comandos (un comando
history
) que permita imprimir enumeradamente los últimos 50 comandos ejecutados en la consola (0.5pt adicional). Un comando no va a parar al historial si:
- Se repite el último comando.
- El comando empieza con espacio.
- Implementar Re-utilización de comandos.
-
El comando history muestra la secuencia de comandos, con un número a su izquierda. Con este número es posible llamar de nuevo el comando utilizando el caracter admiración "!" (comando
![número]
). El último comando se repite con doble admiración "!!" (0.5pt adicional) -
Ejecutar el último comando (
command
) que se ha ejecutado escribiendo![command]
(0.5pt adicional) -
NOTA: Por ejemplo history retorna: 1 history 2 ls 3 cd /dev 4 ls 5 rm *.bak 6 cd /etc 7 history
De manera que si hacemos:
!5
ejecuta "rm *.bak"!!
ejecuta "history"!cd
ejecuta "cd /etc"