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 PATH
con
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 deman
. Además del comandoman
, la documentación puede estar disponible en medianteinfo
. 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:
- Nombre: Asunto del manual seguido de una breve descripción;
- Sinopsis: La sintaxis del comando;
- Descripción: Descripción detallada;
- Opciones: Revisión de todas las opciones y sus funciones;
- Archivos: Archivos relacionados con el tema;
- Ver también: Otros manuales relacionados con el tema.
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:
- Sección 1: Programas disponibles para el usuario;
- Sección 2: Funciones del sistema Unix y C;
- Sección 3: Funciones de la biblioteca de lenguaje C;
- Sección 4: Archivos especiales (dispositivos en /dev);
- Sección 5: Convenciones y formatos de archivo;
- Sección 6: Juegos;
- Sección 7: Varios (macros de texto, etc.);
- Sección 8: Procedimientos administrativos (demonios, etc.).
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:
-type x
: La letra x define el tipo de archivo (d para directorio, f para archivo común y l para enlace simbólico).-name nombre
: El nombre de archivo. Puede ser un nombre parcial, como 'foto*', para localizar todos los nombres que comienzan con el término foto. Es recomendable utilizar las comillas simples en ese caso.-user usuario
: El usuario dueño del archivo.-atime -/+n
: Archivo acessado antes o después n. n corresponde a la expresión n * 24 horas. O sea, se fuera utilizado-atime -1
serán listados los archivos acesados hace menos de 24 horas. Si fuera utilizado-atime +2
, serán listados los archivos acesados hace más de 48 horas.-ctime -/+n
: Archivo creado antes o después n. Vale el mismo principio de-atime
.-mtime -/+n
: Archivo modificado antes o después de n. Vale el mismo principio de-atime
.-amin -/+n
: Archivo acesado antes o después de n. n corresponde a cantidad de minutos. Por ejemplo,-amin -15
listará todos los archivos acesados hace menos de 15 minutos. Con-amin +30
, serán listados los archivos acesados hace más de 30 minutos.-cmin -/+n
: Archivo creado antes o después de n. Vale el mismo principio de-amin
.-mmin -/+n
: Archivo modificado antes o después de n Vale el mismo principio. de-amin
.-newer archivo
: El archivo buscado fue creado o modificado después de archivo.-perm modo
: El archivo buscado tiene permiso especificada igual al modo, como las letras r, w y x.-perm -modo
: El archivo buscado tiene todos los permisos listados en modo.-perm +modo
: El archivo buscado tiene cualquiera de los permisos listados en modo.
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:
-i
: Modo interactivo. Pregunta antes de sobrescribir un archivo.-p
: Copia también los atributos del archivo original.-r
: Copia recursivamente el contenido del directorio de origen.
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
.