EPET N° 1 "UNESCO"

Curso Esencia Linux



Tema 2: Ubicarse en un Sistema Linux

Peso: 9

2.1: Lo básico de la Linea de Comando

Peso: 3

La manera tradicional de interactuar con una computadora con Linux ‒ especialmente un servidor de red ‒ es usando la linea de comando. La linea de comando presenta el indicador de la línea de comandos indicando que el sistema está listo para recibir instrucciones. Normalmente, el indicador terminado con el carácter $ indica que es un usuario común el que está utilizando el sistema. Cuando termina con el carácter #, indica que se trata del usuario root.

El usuario root

El usuario root puede realizar todo tipo de operaciones en el sistema. Por cuestiones de seguridad y privacidad, toda tarea y archivo tiene un usuario “dueño”. Cada usuario puede intervenir sólo con las tareas y archivos que le pertenecen. El usuario root puede intervenir en cualquier tarea o archivo

La linea de comando se abre con un programa llamado emulador de terminal. Normalmente, se lo llama terminal solo en el menú de aplicaciones.

El shell Bash

En el ambiente de linea de comando, el shell es el programa que actúa como intermediario entre el usuario y los recursos de la computadora, como si fuese un ambiente de programación en tiempo real para ejecutar tareas. El shell predeterminado en la mayoría de las distribuciones Linux es el Bash (Bourne Again Shell), al cual se refieren los procedimientos aquí presentados.

Un comando shell sólo puede consistir en el nombre del programa que desea ejecutar. Además de los que ofrecen otros programas instalados en la computadora, existen varios comandos de shell disponibles. Uno de los comandos incorporados más simples es echo que simplemente muestra el contenido en la pantalla:

$ echo Linux Essentials
Linux Essentials

El signo $ se muestra sólo para indicar el indicador de la línea de comandos, no se debe escribir. Después de escribir el comando echo Linux Essentials, el comando debe ser enviado presionando la tecla Intro. La respuesta del comando se mostrará justo debajo del comando. Para evitar que el comando echo quiebre la linea (coloque el indicador en la linea de abajo) al final de la salida, se usa echo -n Linux Essentials. Para que el comando echo pueda utilizar caracteres especiales, se debe introducir la opción -e. Por ejemplo, para crear un salto de línea entre las dos palabras:

$ echo -e "Linux\nEssentials"
Linux
Essentials

El término \n representa un salto de línea.

Algunos comandos pueden usar tantas opciones y argumentos que ocupan más de una línea. Para dividir un comando en más de una línea, se utiliza el signo \ (barra invertida) antes de cada salto de línea. Por ejemplo, para descomponer el comando find /usr/share/doc -ipath '*howto*' -type d -ctime -100 -exec ls -ld '{}' ';' en dos líneas:

$ find /usr/share/doc -ipath '*howto*' -type d \
-ctime -100 -exec ls -ld '{}' ';'

El comando find se usa para localizar archivos en el sistema de archivos y es un ejemplo de un programa que puede recibir muchos argumentos y opciones. Un argumento o parámetro de comando es un término que el programa espera para realizar la acción deseada. En el ejemplo anterior, se utilizó el argumento /usr/share/doc para indicar a find donde debería iniciar la búsqueda.

Una opción de comando es una letra o palabra, normalmente precedida de un guión, que cambia el comportamiento de un comando. En el ejemplo anterior, dos opciones utilizadas fueron -ipath '*howto*" e -type d, que indican algunos filtros de find.

Lo que se espera de la mayoría de los comandos es que produzcan la salida con el resultado inmediatamente después de pulsar la tecla Intro. Dependiendo de las circunstancias, la salida del comando puede tardar más de lo esperado. Si un programa está tardando demasiado en terminar o no quiere esperar a que termine por cualquier otra razón, presionando la combinación de teclas Ctrl + c hará que el programa se detenga y que el intérprete de comandos vuelva a estar disponible.

Variables

Las variables utilizadas en el shell son similares a las utilizadas en los lenguajes de programación. Una variable es un nombre que contiene un valor, que puede ser letras o números. Los nombres de las variables están limitados a caracteres alfanuméricos, es decir, pueden contener letras y números, pero siempre deben comenzar con una letra. La asignación de un valor a una variable se hace con un signo igual, donde el nombre de la variable está a la izquierda y el contenido de la variable está a la derecha:

$ lpi="Linux Professional Institute"

No habrá espacios antes o después del signo de igualdad. Si hay espacios en el contenido de la variable, es importante usar comillas dobles o simples para no confundir el shell. El valor de una variable se puede mostrar colocando el signo $ delante del nombre:

$ echo $lpi
Linux Professional Institute

Las variables pueden ser creadas por usuarios comunes o predefinidas por el sistema operativo. Tanto las variables predefinidas como las variables definidas para la sesión actual pueden ser utilizadas por los programas para obtener configuraciones importantes del sistema. Cuando se definen en una sesión de shell interactiva, las variables también se denominan variables de entorno. El propio shell utiliza variables de entorno para definir varios de sus ajustes.

El shell interpreta la primera palabra proporcionada como un comando interno o el nombre de un programa. Es necesario proporcionar la ubicación del programa, a menos que esté ubicado en uno de los directorios contenidos en la variable global PATH. Si el programa está en el directorio actual y fuera de los directorios contenidos en PATH, su nombre debe ir precedido de ./, por ejemplo ./script.sh.

El contenido de la variable PATH se puede mostrar con el comando echo echo:

$ echo $PATH
/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

Si el programa o script se encuentra en un directorio que no está en la variable PATH, el usuario puede incluirlo para usarlo temporariamente, hasta el fin de la sesión de shell. Esto evita la necesidad de especificar la ruta al programa, como en el caso de ./ en ./script.sh, o una ruta más larga. Si el programa está en el directorio actual, puede usar primero el comando pwd para obtener la ruta al directorio actual en su totalidad:

$ pwd
/home/daniel

La ruta /home/daniel puede incluirse en la variable PATHcon el comando export:

$ export PATH=/home/daniel:$PATH

De esta manera, al final de la sesión de shell actual, la variable PATH tendrá un nuevo directorio:

$ echo $PATH
/home/daniel:/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

Esta acción sólo es necesaria si escribe sus propios programas. De manera predeterminada, todos los programas están en los directorios originales definidos en la variable PATH. La ubicación específica de un comando se puede determinar con otro comando, which:

$ which man
/usr/bin/man

Otra forma de determinar la ubicación de un comando en el sistema de archivos es usar el comando type:

$ type man
man é /usr/bin/man

Si el comando introducido es un comando Bash interno, la salida producida por type será diferente:

$ type echo
echo es un comando interno de shell

En el caso del programa man, Bash pudo identificar su ubicación porque el directorio /usr/bin está en la variable PATH.

Todas las variables globales se escriben en mayúsculas. En entornos Unix, hay una diferencia entre mayúsculas y minúsculas. Por lo tanto, el uso de Path o path no funcionará. Las variables globales se crean al cargar el sistema y se exportan con el comando export para que estén disponibles en todas las futuras sesiones de shell.

Hay varias otras variables globales definidas al inicio del shell que pueden guiar el comportamiento de los programas. La variable HISTFILE, por ejemplo, almacena la ruta al historial de comandos introducidos. De manera predeterminada, el historial se almacena en el archivo .bash_history, en el directorio raíz del usuario. El historial es útil para recuperar comandos escritos anteriormente. Al presionar la flecha hacia arriba, se muestran los comandos escritos anteriormente. Todo el historial de comandos se muestra con el comando history.

Sustitución de comandos

La salida de un comando puede ser almacenada dentro de una variable, usando comillas invertidas:

$ ahora=`date`

El comando date muestra la fecha y la hora del sistema. En este caso, la fecha y la hora se han almacenado en la variable ahora cuyo contenido se puede mostrar con el comando, echo:

$ echo $ahora
jue nov 25 21:38:15 -03 2019

También puede utilizar la salida de un comando como argumento para otro, utilizando comillas invertidas:

$ echo "La fecha actual es `date`"
La fecha actual es jue nov 25 21:38:15 -03 2019

Alternativamente, se puede utilizar el formato $() en lugar de las comillas simples. El mismo resultado que en los ejemplos anteriores se obtendría con $(date) en lugar de `date`.

Englobamiento

Las operaciones de archivo y directorio permiten el uso de caracteres comodín, que son patrones de sustitución de caracteres. El carácter * reemplaza cualquier cadena de caracteres:

$ ls /etc/host*
/etc/host.conf  /etc/hostname  /etc/hosts  /etc/hosts.allow  /etc/hosts.deny

El carácter ? reemplaza solo un carácter:

$ ls /dev/sda?
/dev/sda1  /dev/sda2  /dev/sda3  /dev/sda4

El uso de corchetes permite indicar una lista de caracteres:

$ ls /dev/hd[abc]
/dev/hda /dev/hdb /dev/hdc

Las llaves indican una lista de términos separados por comas:

$ ls /dev/{hda,fdO}
/dev/fdO /dev/hda

El uso de exclamación antes de un comodín lo excluye de la operación:

ls /dev/tty[!56789]
/dev/tty0  /dev/tty1  /dev/tty2  /dev/tty3  /dev/tty4

Los comodines precedidos por una barra invertida (\) no realizan sustitución. Se denominan caracteres escapados. En las comillas dobles, sólo los caracteres especiales (`) y $ tienen efecto. Entre comillas simples, ningún carácter especial tiene efecto.

Comandos secuenciales

La gran mayoría de las tareas dependen de la ejecución de más de un comando. Para ejecutar tres comandos en secuencia, independientemente del resultado de cada uno, se utiliza el formato:

comando1 ; comando2 ; comando3

Ejecutar el siguiente comando sólo si el anterior fue exitoso (si devolvió 0):

comando1 && comando2 && comando3

Ejecutar el siguiente comando sólo si el anterior no ha tenido éxito (si ha devuelto otro que no sea 0):

comando1 || comando2 || comando3

Todos los comandos obedecen estas formas estandarizadas de uso. Sin embargo, cada comando tiene un propósito y opciones diferentes, y es necesario consultar su documentación para conocer en detalle su uso.

2.2: Uso de la línea de comandos para obtener ayuda

Peso: 2

Debido al gran número de comandos disponibles en el entorno Linux, es bastante difícil memorizar el propósito de todos los comandos y opciones. Para hacer más fácil escribir un comando o una ruta existente, el shell ofrece la función de autocompletar, operada con la tecla [TAB]. Después de digitar las primeras letras de un comando o ruta de directorio, la tecla [TAB] completa la línea de acuerdo con los comandos y rutas encontrados.

Muchas de las preguntas sobre el uso de un comando se pueden responder proporcionando la opción --help al propio comando. Sin embargo, la fuente de información más completa sobre un programa se encuentra en su manual. Prácticamente todos los comandos y archivos de configuración de Linux vienen con un manual. Este manual es accesible a través del comando man, que muestra en detalle las funciones del elemento en cuestión. Para ver un manual, basta con usar el comando man, usando el comando o archivo como argumento.

El comando info

El comando info es una especie de alternativa a los manuales de man. Además del comando man, la documentación puede estar disponible en mediante info. En general, la información disponible en las páginas info también está disponible en páginas de manual, pero de forma menos detallada. De manera estándar, los archivos de este tipo de documentación son almacenados en /usr/share/info.

En su mayoría, los manuales tienen la siguiente organización:

La navegación dentro del manual se puede realizar con las flechas del teclado y las teclas Re Pag y Av Pag. También es posible realizar una búsqueda de texto pulsando la tecla / (barra), que abre un campo en la parte inferior del terminal para introducir el término a buscar. La búsqueda se realiza pulsando Intro. Para encontrar la siguiente ocurrencia, basta presionar n. Para encontrar la ocurrencia anterior, basta presionar ?. Presionar la tecla q finaliza el lector del manual y retorna al indicador de la línea de comandos.

Búsqueda de manuales

Se puede buscar la ocurrencia de un término en la sección nombre de los manuales con el comando correspondiente. Este comando devuelve una breve descripción de cada ocurrencia encontrada y el nombre del comando o archivo respectivo.

Una manera de encontrar los manuales de referencia para un programa en particular es usar el comando whatis. La base de datos del comando whatis almacena la sección nombre de los manuales del sistema. La base de datos se actualiza normalmente mediante una planificación del sistema. Para cada recurso de manual localizado, whatis muestra una breve descripción:

$ whatis man
man (1)              - an interface to the on-line reference manuals
man (7)              - macros to format man pages

Los números entre paréntesis se refieren a la sección a la que pertenece el manual. Las secciones existentes se enumeran a continuación:

Para acceder a un elemento de una sección específica, el número de sección precede al nombre del elemento. Por ejemplo, acceda al manual de printf en la sección número 3:

man 3 printf

De manera predeterminada, los archivos de los manuales se almacenan en /usr/man y /usr/share/man, en subdirectorios correspondientes a cada sección. Se pueden especificar otras ubicaciones con la variable MANPATH.

El comando whereis puede ser utilizado para localizar el archivo del manual. Además, muestra el directorio donde se encuentra el comando y, si lo hubiere, el código fuente:

$ whereis find
find: /usr/bin/find /usr/bin/X11/find /usr/share/man/man1/find.1.gz

Para encontrar archivos y directorios en general, puede utilizar el comando locate. Se proporciona un nombre o parte de la ruta como argumento, que mostrará todas las ocurrencias correspondientes.

Otra documentación

Los proyectos GNU usualmente incluyen documentación como guías y ejemplos de uso. Estos documentos no tienen un formato universal, pero pueden ofrecerse en documentos de texto plano, HTML o PDF. Estos archivos se encuentran en /usr/share/doc, en directorios correspondientes a los programas.

2.3: Utilizando Directorios y Listando Archivos

Peso: 2

Excepto para el usuario administrador root, cuyo directorio es /root, el directorio inicial es el directorio personal del usuario, ubicado en /home, que lleva el nombre del usuario (utilizado para ingresar al sistema). Para cambiar el directorio, se utiliza el comando cd, seguido de la ruta absoluta o relativa al directorio deseado.

Se puede acceder a las rutas de los directorios y archivos por su ruta absoluta o relativa. Las rutas absolutas son las iniciadas por la barra raíz (/) y las rutas relativas son las que se refieren al directorio actual. El punto (.) se refiere al directorio actual, y los dos puntos (..) se refieren al directorio que contiene el directorio actual.

Sin argumentos, el comando cd lleva al directorio raíz del usuario. Otra forma de indicar el directorio raíz es usar el signo ~. Este puede ser utilizado, por ejemplo, para ir hasta un directorio en el directorio personal, cd ~/Documentos, o para indicar un archivo en el directorio personal, ls ~/Documentos/doc.txt.

El comando ls se usa para listar archivos y contenido de un directorio. La opción -l muestra detalles sobre el/los archivo/s, -s muestra el tamaño en bytes y -d muestra las propiedades de un directorio, no su contenido. Ejemplo de salida de ls -l:

$ ls -l /
total 64
lrwxrwxrwx    1 root root     7 feb  7  2018 bin -> usr/bin
dr-xr-xr-x.   7 root root  4096 feb 26 10:06 boot
drwxr-xr-x   20 root root  4300 feb 26 10:10 dev
drwxr-xr-x. 194 root root 12288 feb 26 10:10 etc
drwxr-xr-x.   4 root root  4096 feb  7  2018 home
lrwxrwxrwx    1 root root     7 feb  7  2018 lib -> usr/lib
lrwxrwxrwx    1 root root     9 feb  7  2018 lib64 -> usr/lib64
drwx------    2 root root 16384 nov 15  2016 lost+found
drwxr-xr-x.   2 root root  4096 feb  7  2018 media
drwxr-xr-x.   2 root root  4096 set 18 00:04 mnt
drwxr-xr-x.   4 root root  4096 feb  7  2018 opt
dr-xr-xr-x  209 root root     0 feb 26 10:08 proc
dr-xr-x---.  27 root root  4096 feb 26 10:53 root
drwxr-xr-x   53 root root  1560 feb 26 11:08 run
lrwxrwxrwx    1 root root     8 feb  7  2018 sbin -> usr/sbin
drwxr-xr-x.   2 root root  4096 feb  7  2018 srv
dr-xr-xr-x   13 root root     0 feb 26 10:10 sys
drwxrwxrwt   14 root root   320 feb 26 12:13 tmp
drwxr-xr-x.  14 root root  4096 ago 28 08:41 usr
drwxr-xr-x.  26 root root  4096 ago 30 12:43 var

A la izquierda del nombre de cada elemento se muestra información diversa, como los permisos de acceso, el usuario al que pertenece el archivo y la fecha de modificación.

Los archivos que comienzan con un punto “.” no son mostrados por el comando ls. Para que estos archivos también sean mostrados, es necesario utilizar ls con la opción -a. También es posible utilizar englobamiento en los listados. Por ejemplo, para listar todos los archivos que terminem con el sufijo .txt, se utiliza ls *.txt.

Para obtener una lista de los contenidos de todos los subdirectorios, se puede utilizar el comando ls -R o el comando find. El principal comando de localización de archivos en linea de comando es find, cuya sintaxis básica es find directorio criterio.

El argumento directorio indica donde find debe iniciar la busqueda, y el criterio puede ser el nombre de archivo o directorio a ser procurado o una regla para la busqueda. Existen decenas de criterios de busqueda, los más comunes son:

El comando find puede ser utilizado, por ejemplo, para obtener una lista con todos los archivos creados en el directorio personal o en sus subdirectorios en las últimas 24 horas:

$ find /usr/lib -type f -ctime -1

La opción -find f determina que sean buscados solamente archivos (excluyendo directorios y otros archivos especiales) y la opción -ctime -1 determina que la fecha de creación de los archivos sea inferior a 1 dia en relación a la fecha actual.

2.4: Crear, mover y borrar archivos

Peso: 2

El comando cp es utilizado para copiar archivos. Sus opciones principales son:

Es importante saber que cuando se copia un directorio recursivamente, el uso de la barra / al final del directorio origen hará que sólo se copien los contenidos del directorio al destino; el no uso de la barra hará que el directorio origen y sus contenidos se copien al destino.

El comando mv mueve y renombra archivos y directorios. Usado con la opción -i, pide confirmación antes de sobrescribir un archivo de destino.

Un archivo vacio puede ser creado con el comando touch. Por ejemplo, touch archivo.txt crea el archivo vacio archivo.txt. El comando touch también puede ser utilizado únicamente para cambiar la fecha de un archivo. Usado sin argumentos, touch modifica la fecha y hora de creación y modificación de un archivo a los valores actuales del sistema. Para cambiar solo la fecha de modificación, se usa la opción -m, y para cambiar solo la fecha de acesso, se usa la opción -a. Otros valores de tiempo pueden ser pasados con la opción -t.

El comando mkdir crea directorios. Para crear un árbol de directorios recursivamente, sin necesidad de crearlos uno por uno, se usa la opción -p:

mkdir -p camino/completo/para/directorio

Para cambiar los permisos de directorio al momento de creación, los mismas son transmitidos al mkdir con la opción -m. Los directorios vacios se pueden eliminar con el comando rmdir. Con la opción -p, rmdir remueve el directorio indicado y los directorios superiores, siempre que estén vacíos.

Para borrar un archivo, el comando es rm. Para borrar directorios con contenido, se usa rm -r. Para forzar la eliminación, se utiliza la opción -f.