# Nociones básicas de la Terminal

## Directorio de trabajo (working directory)

Una terminal tiene asociado un directorio de trabajo, que viene a ser básicamente el directorio del sistema de archivos en el que nos encontramos. Por defecto, cuando abrimos una nueva terminal Bash, el directorio de trabajo inicial es el directorio del usuario del sistema, o más comunmente denominado directorio *home* (casa) del usuario. Si, por ejemplo, nuestro nombre de usuario en el sistema es `jsilvestre`, entonces el directorio de trabajo incial es `/home/jsilvestre`. A partir de dicho directorio podemos realizar multitud de operaciones con ficheros, descargar archivos de internet, ejecutar programas, etc.

{% hint style="info" %}
En la terminal, podeis consultar en cualquier momento cuál es el directorio de trabajo actual, invocando el comando **`pwd`** (ver sección ["Comandos Básicos"](https://dsic.gitbook.io/prg-gia/h/p0/operativa-headless-uso-de-la-terminal-de-comandos/comandos-basicos)).
{% endhint %}

## Rutas (Paths) de directorios y ficheros

Muchos de los comandos que vamos a utilizar requieren uno o varios directorios o ficheros como argumentos. En general, hablaremos de rutas (paths) a directorios o ficheros, que pueden ser:

* **Relativas** al directorio de trabajo actual: p.e. `PRA/p0` (directorio), `PRA/README.txt` (fichero).
* **Absolutas** en el sistema de ficheros: p.e. `/home/jsilvestre/PRA/p0` (directorio), `/home/jsilvestre/PRA/README.txt` (fichero).

Cuando especificamos rutas relativas, podemos hacer uso de las siguientes referencias:

* **Referencia `..`** al directorio superior. Por ejemplo:
  * `../test.cpp`: apunta al fichero `test.cpp` ubicado en el directorio superior.
  * `../../../`: apunta al directorio que se encuentra tres niveles por encima del directorio de trabajo actual.
  * `../../source/app.cpp` &#x20;
* Una **referencia `.`** al directorio actual. Por ejemplo:
  * `./test.cpp`: apunta al fichero **test.cpp** ubicado en el directorio actual.&#x20;
  * `./PRA`: apunta al subdirectorio `PRA` ubicado en el directorio actual.

{% hint style="warning" %}
**Evitad usar espacios en blanco para nombrar directorios y ficheros.** De lo contrario, tendréis que "escapar" los espacios en blanco, o bien usar comillas simples/dobles, lo cual es extremadamente "engorroso" y suele ser una fuente de errores absurdos perfectamente evitables. Usad guión `-` *(dash)* o guión bajo `_` *(underscore)* como alternativas al espacio en blanco. P.e. `"implementacion_super_eficiente.cpp"`.
{% endhint %}

{% hint style="info" %}
Como regla general, se recomienda usar el conjunto de caracteres: `{a-z, A-Z, 0-9, _, -} para nombrar ficheros y directorios.`
{% endhint %}

## Variables de entorno

La terminal bash proporciona una serie de variables de entorno globales y de usuario. Las variables de entorno son pares `nombre-variable = valor-variable` que tienen la capacidad de alterar el funcionamiento de los programas del sistema operativo que las consultan. Para acceder a ellas, se debe utilizar el carácter `$` (dólar) delante del identificador de la variable. Algunas variables de entorno relevantes y predefinidas en sistemas GNU/Linux son:

* **`$HOME`**: contiene la ruta absoluta al directorio home del usuario. P.e. `/home/jsilvestre`.
* **`$USER`**: contiene el nombre de usuario del usuario del sistema que está ejecutando la terminal o el proceso correspondiente. P.e. `jsilvestre`.
* **`$PATH`**: Esta variable contiene una lista de directorios separados por dos puntos (:) en los que el sistema busca ficheros ejecutables (programas). Cuando se invoca un comando en la terminal, el shell busca dicho comando en los diferentes directorios mencionados en la variable `$PATH`. Si se encuentra el comando, se ejecuta. De lo contrario, devuelve el error "comando no encontrado".

{% hint style="info" %}
En la terminal, podeis inspeccionar el contenido de estas variables de entorno usando el comando echo. Por ejemplo:

**`echo $HOME`**
{% endhint %}
