PRÁCTICA 2
Goyo Celada (gregorio.celada@urjc.es)
Francisco Soltero (franciscojose.soltero@urjc.es)
ÍNDICE
- ¿Qué es un comando/mandato?
- ¿Qué es un intérprete de comandos?
- Procesos. Entrada y salidas estándar (E/S).
- Redireccionamiento de E/S.
- Modos de Ejecución de Procesos en la Shell.
- Comandos para el Control de Procesos.
- Expresiones Regulares.
- Paths relativos y absoluto.
- Variables de Entorno y de Shell.
- Comandos Básicos de Shell.
- Comandos deNavegación.
- Comandos para la Edición de Archivos.
- Comandos para la Manipulación de Archivos.
- ¿Qué es un Script y como secrea?
- Comandos para la Manipulación de Datos.
- Comandos para la Manipulación de Directorios.
- Comandos para Mover Archivos/Directorios.
- Otros comandos.
¿Qué es un Comando/Mandato?
Un comando/mandato, es una instrucción que un usuario introduce en el
terminal con el objetivo de realizar una cierta tarea y/o operación sobre el
sistema operativo.
Los comandos, se componen de tres partes fundamentales que son:
• Nombre del comando
• Opciones del comando
• Valores asociados
Ejemplo:
ls –la /home
• ls, nombre del comando
• -la, opciones del comando
• /home, valores asociados
¿Qué es un Intérprete de Comandos?
“Un intérprete de órdenes o de comandos, es un programa informático que tiene
la capacidad de traducir las órdenes que introducen los usuarios, mediante un
conjunto de instrucciones facilitadas por él mismo directamente al núcleo y al
conjunto de herramientas que forman el sistema operativo.” Wikipedia
“Un intérprete de mandatos o shell es un programa que hace de interfaz de texto
entre el usuario y el Sistema Operativo. Tiene la función de interpretar mandatos y
ejecutar programas. También proporciona funcionalidades de programación en
forma de Scripts.”
Los intérpretes de comandos más conocidos son:
- Windows: cmd.exe
- Mac OS: terminal
- Linux / UNIX: bash, sh, csh, tcsh, ksh
Procesos. Entrada y salidas estándar (E/S).
En Linux, la comunicación entre procesos, llamada comúnmente como Entrada y
Salida (E/S), se produce siempre a través de ficheros. Es por ello que todos los
procesos que se ejecutan dentro de un sistema operativo Linux se componen de
entradas y salidas estándar que les permiten comunicarse entre ellos y con el
exterior.
❑ Entrada estándar: habitualmente procede del teclado y permite
pasar/introducir datos en el proceso en ejecución.
❑ Salida estándar y de error: habitualmente vuelcan datos en la pantalla y
suelen mostrar información generada por el proceso en ejecución.
Procesos. Entrada y salidas estándar (E/S).
Cuando ejecutamos un comando/mandato en un terminal Linux, provocamos que
dicho terminal cree un nuevo proceso y lo ejecute. Es esta acción, el terminal
redirige de forma automática la Entrada Estándar del nuevo proceso al Teclado y
las Salidas Estándar a la Pantalla.
El terminal no solo permite ejecutar un proceso a la vez, sino que permite la
ejecución de múltiples procesos unidos unos a otros con el objetivo de crear una
determinada acción.
Redireccionamiento de E/S.
El terminal permite redirigir la E/S de los comandos que se ejecutan a nuestra
voluntad. Para ello, el terminal cuenta con unos operadores especiales
denominados de redireccionamiento, que permiten redirigir la E/S. Estos son:
❑ proceso > fichero: redirige la Salida Estándar del proceso al fichero.
❑ proceso < fichero: redirige la Entrada Estándar del proceso al
fichero. Es decir, se envía el contenido del fichero a la Entrada Estándar
del proceso
❑ proceso >> fichero: redirige la Salida Estándar del proceso al fichero,
pero no trunca (borra) el fichero, sino que añade el contenido al final del
mismo. Si no existe el fichero, se crea.
❑ proceso 2> fichero: redirige la Salida Estándar de Error del proceso,
al fichero indicado.
Redireccionamiento de E/S. Pipes
El terminal también permite comunicar distintos procesos entre sí mediante un
operador especial denominado Pipe o Tubería. Este símbolo de redirección ( | ,
barra vertical, Alt Gr + 1) permite redirigir la Salida Estándar de un proceso a la
Entrada Estándar de otro. Esquema
proceso1 < fichero.in| proceso 2 | … | procesoN > fichero.out
De esta forma, podemos combinar varios procesos para obtener un determinado
resultado o realizar una determinada tarea. Ejemplo:
➢ ls –la | grep ^- | grep “ \.” > ocultos.list
Crea una lista de los archivos ocultos del directorio actual en el fichero
ocultos.list, seleccionando solo aquellos que sean ficheros (grep ^-,
empiezan por guion), y solo aquellos que sean ocultos (grep “ \.”, líneas
que contienen un espacio y un punto)
Modos de Ejecución de Procesos en la Shell
El terminal dispone de un sistema de gestión de procesos que nos permite
controlar los procesos en ejecución y el modo en el que se ejecutan los mismos.
Linux dispone de dos modos de ejecución de procesos Shell, que son:
❑ Ejecución en Primer Plano: es la ejecución estándar. La Shell ejecuta el
comando dado, y hasta que no finaliza el proceso del mismo, no permite
introducir uno nuevo, lo cual deja bloqueada la Shell hasta su finalización.
Ej: usuario@mipc$ ls -l
❑ Ejecución en Segundo Plano: la Shell ejecuta el comando dado, pero
permite ejecutar otros procesos mientras el proceso en segundo plano se
lleva a cabo. De esta forma, podremos realizar varias tareas simultaneas a
la vez. Para ejecutar un comando en segundo plano es necesario incluir el
carácter & al final del comando. Ej: ls –l &
Comandos para el Control de Procesos
▪ jobs – Listar procesos de Shell
Este comando lista los procesos tanto en ejecución como detenidos en la sesión
actual de la Shell. La primera columna muestra el pid del proceso en ejecución; la
segunda muestra el estado del mismo (Ejecutando, Detenido); y la tercera
muestra el nombre del comando o script en ejecución.
▪ fg <id> – Poner proceso en primer plano o foreground
Este comando pone en primer plano un proceso detenido en background o
segundo plano. Ej: fg1
▪ bg <id> – Poner proceso en segundo plano o background
Este comando pone en segundo plano un proceso en primer plano o foreground.
Ej: bg 2
Path Relativos y Absolutos
Un path es una ruta o dirección que conduce dentro del árbol de directorios a un
determinado archivo y/o directorio. Existen dos tipos de path’s que son:
▪ Relativos: ruta parcial que conduce a un archivo o directorio a partir del
directorio actual (./) en la que nos encontremos o en aquella que
especifiquemos. Ejemplos:
./miscript.sh : hace referencia al fichero miscript.sh, el cual se
encuentra en el directorio actual (./)
../miscript.sh : hace referencia al fichero miscript.sh, el cual se
encuentra en el directorio padre(../)
▪ Absolutos: es la ruta completa a un archivo o directorio a partir del directorio
raíz (/). Ejemplo:
/home/profesor/Documentos : hace referencia al directorio
Documentos, la cual se encuentra en el path /home/profesor/
Expresiones Regulares
Una expresión regular es un patrón compuesto tanto por caracteres normales
como por metacaracteres, el cual permite buscar una cadena de texto concreta
en un texto de dimensiones mayores con el objetivo de filtrar, localizar y extraer
información relevante. Muchos de los comandos de Shell que se estudiarán a
continuación permiten utilizar expresiones regulares como parte de sus
argumentos, dado que resulta una herramienta muy versátil para la realización de
diversas tareas.
Metacaracteres
• . : Representa cualquier carácter.
• ^ : indica el comienzo de una línea. Ej:^ejercicio*.sh
• $ : indica el final de una línea. Ej: *.sh$
• * : indica 0 o más repeticiones de un determinado carácter. Ej: a*
• + : indica 1 o más repeticiones de un determinado carácter. Ej: [0-9]+
• [] : permite especificar un conjunto/rango opcional de caracteres. Ej: [a-zA-Z]
• () : permite agrupar patrones
Expresiones Regulares. Ejemplos
Ejemplos:
➢ ls –l *.sh : muestra los ficheros que tienen por extensión .sh
➢ ls –l eje[1-9].sh$: muestra la lista de los archivos cuyo nombre
empieza por eje, tienen a continuación algún numero comprendido entre
el 1 y el 9 y además tienen extensión .sh.
➢ ls –l | grep –E *\.\(jpg\|png\|gif\): lista los directorios del
directorio actual (ls –l) y a continuación, muestra solo aquellos que
tienen por extensión .jpg, .png, .gif
➢ ifconfig | grep –E *Link*: muestra las líneas de la salida del
comando ifconfig que contienen la palabra Link.
Variables de Entorno y de Shell
La Shell permite crear variables de entorno, que son variables que almacenan
datos de la sesión actual, o datos que nosotros damos a las mismas.
▪ export nombreVariable=valorVariable
El comando export, permite la creación de una nueva variable de entorno, en la
cual tendremos que definir un nombre para la misma en nombreVariable y un
valor en valorVariable.
▪ echo $nombreVariable
El carácter $ nos permite obtener el valor de una variable de entorno que
hayamos definido o que forme parte de las variables de entorno de la Shell.
La Shell dispone de variables de entorno predefinidas como por ejemplo:
❑ $HOME : contiene el directorio actual de trabajo delusuario.
❑ $PATH: contiene las rutas/paths, donde se albergan los comandos de la
Shell
Comandos Básicos de Shell
▪ echo “<texto>” – Muestra una línea de texto
Este comando nos permite mostrar un mensaje de texto por la salida estándar del
intérprete de comandos. Opciones interesantes:
❑ echo –e “echo –e “Mensaje en\n2 líneas”: permite mostrar
mensajes interpretando caracteres especiales como por ejemplo \n.
❑ echo “Fecha:`date`”: permite mostrar mensajes con interpretación
de los comandos embebidos en la propia cadena de texto. Otra forma de
hacer lo mismo: “Fecha: $(date)”.
▪ cat <fichero> – Volcar contenido de un fichero
Este comando vuelca el contenido de un fichero de texto en la salida estándar, es
decir, sobre el propio terminal. Útil para pasar el contenido de un fichero a un
comando.
▪ exit – Cerrar terminal
Este comando cierra la sesión actual sobre el terminal que estemos ejecutando (o
bien con la combinación de teclas ^D -Control+D-)
Comandos de Navegación
▪ cd <directorio> – Cambiar de directorio
Abreviatura de change directory. El comando cd permite navegar al usuario entre
los distintos directorios que componen el árbol de directorios del sistema
operativo. Opciones interesantes:
❑ cd /home/usuario/Documentos: cambia al directorio Documentos, el
cual se encuentra en el path /home/usuario
❑ cd ~ : cambia al directorio $HOME del usuario (/home/usuario) desde
cualquier path en el que nos encontremos.
❑ cd .. : cambia al directorio padre del directorio actual sobre el que nos
encontremos.
▪ pwd – Muestra el path (directorio) actual
Este comando nos devuelve un string en el cual se muestra el path actual sobre el
que nos encontramos.
Comandos de Navegación
▪ ls – Listar archivos y directorios
El comando ls permite listar los archivos y directorios de un determinado path o
ruta del sistema. Opciones interesantes:
o ls –l : muestra una lista ordenada de los archivos y directorios,
mostrando detalles extendidos de los mismos, como sus permisos,
usuario y grupo propietario, tamaño, etc.
o ls –l <archivo/directorio>: al igual que el comando anterior,
muestra los detalles de un archivo o directorio indicado como argumento.
o ls –a : al igual que la opción anterior, muestra una lista ordenada de
los archivos y directorios, pero incluyendo los archivos ocultos.
Comandos para la Edición de Archivos
▪ gedit <fichero> – Editor de Texto enVentana.
Este comando abre el editor de textos y de código Gedit, el cual viene en la
mayor parte de las distribuciones Linux. Este programa permite leer, modificar y
crear archivos de texto y código a los cuales tengamos acceso.
▪ nano/vi/emacs <fichero> - Editor de texto en Terminal
Estos comandos son editores de texto en terminal. Permiten, al igual que gedit,
leer, modificar y crear archivos de texto y código a los cuales tengamos acceso,
todo ello, en el propio terminal. Muy útiles en entornos en los cuales no
tengamos acceso al modo gráfico.
▪ cat <fichero> - Mostrar contenido fichero
Este comando muestra el contenido de un fichero de texto en el propio terminal.
Este comando suele utilizarse en combinación de otros comandos para la
búsqueda y selección de información dentro de los ficheros.
Comandos para la Manipulación de Archivos
▪ touch <fichero> – Crea unfichero
El comando touch crea un fichero de texto con permisos de lectura y escritura
para el usuario y grupo que lo crea. Opciones interesantes:
➢ touch –m <fichero> : actualiza la fecha de modificación del ficherodado.
Este comando permite crear varios archivos a la vez. Para ello podemos indicar
varios nombres de fichero a la par, como por ejemplo:
➢ touch f1 f2 f3 f4 f5
O, podemos usar rangos para crearlos, como por ejemplo:
➢ touch f{1..5}
Comandos para la Manipulación de Archivos
▪ rm <fichero> – Elimina un archivo
Abreviatura de remove. Permite eliminar un archivo del directorio especificado. Si
dicho directorio no se especifica, el comando sobreentiende que el archivose
encuentra en el directorio actual sobre el que nos encontremos. Opciones
interesantes:
❑ rm –f ficheroaborrar.txt: borra un fichero aunque este no
exista. Opción interesante para evitar errores que indiquen que el
fichero no existe.
❑ rm –i ficheroaborrar.txt: borra un fichero de forma interactiva, es
decir, el intérprete nos preguntará si estamos o no seguros de borrar el
fichero.rm
¿Qué es un Script y como se crea?
Un Script es un fichero de texto ejecutable, el cual contiene un conjunto de
instrucciones (comandos) agrupados y combinados con el objetivo de realizar una
tarea concreta. De esta forma, se pueden crear pequeños programas
personalizados y guardarlos para usarlos mástarde.
A continuación se describen los pasos para crear un nuevo script:
1º - Creamos un fichero vacío con el nombre miscript.sh.
Utilizando el comando touch, crearemos un nuevo fichero de texto vacío, el cual
convertiremos más tarde enscript.
usuario@mipc:~$ > touch miscript.sh
2º - Editamos el nuevo fichero con gedit y agregamos el siguiente texto:
#!/bin/bash
¿Qué es un Script y como se crea?
3º - Modificamos los permisos para que el archivo sea ejecutable.
Utilizando el comando chmod, asignaremos permisos de ejecución al fichero
miscript.sh, ejecutando la siguiente línea:
usuario@mipc:~$ chmod u+x miscript.sh
4º - Reeditamos el fichero miscript.sh, agregando los comandos deseados.
Por ejemplo, agregaremos después de #!/bin/bash, la siguiente línea:
echo “Este es mi primer script”;
5º - Ejecutamos elscript
Para ejecutar un script, tan solo tendremos que poner delante del mismo el path
relativo al script,
usuario@mipc:~$ ./miscript.sh
Comandos para la Manipulación de Datos
▪ head – Muestra el comienzo de un archivo de texto
Muestra las 10 primeras líneas de un fichero de texto dado como argumento del
comando. Opciones interesantes:
head –n m <ficheroamostrar>: muestra las primeras m líneas del
ficheroamostrar pasado como argumentoman
▪ tail – Muestra el final de un archivo de texto
Muestra las 10 últimas líneas de un fichero de texto dado como argumento del
comando. Opciones interesantes:
tail –n m <ficheroamostrar>: muestra las últimas m líneas del
ficheroamostrar pasado como argumentoman
Comandos para la Manipulación de Datos
▪ tr <patronA> <patronB> – Traducción de caracteres
Este comando nos permite sustituir los caracteres del patronA por los caracteres
del patronB. Este comando es interesante utilizarlo para formatear datos, como
por ejemplo para eliminar espacios por saltos de línea, eliminar caracteres
repetidos, sustituir tabuladores por puntos y coma, etc. Ejemplos:
• tr “ “ “;”: sustituye espacios por puntos y coma.
• tr “\t” “;”: sustituye tabuladores por puntos y coma.
Opciones interesantes:
❑ tr –s <patron> : elimina caracteres duplicados. Muy útil, por
ejemplo, para eliminar caracteres duplicados o espacios. Ej: tr –s “ “
Comandos para la Manipulación de Datos
▪ cut – Selección de datos.
Este comando nos permite formatear la salida de texto de otros comandos para
extraer información concreta de los mismos. Por ejemplo, este comando nos
permite seleccionar datos por columnas, partir cadenas de texto y seleccionar el
fragmento requerido, etc. Opciones interesantes:
❑ cut –d<carácterDelimitador> -f<columna/s>: si pasamos un
carácter delimitador de campos <caracterDelimitador>, como por
ejemplo un espacio, y a la par, indicamos al comando la/s columna/s
concretas que queremos extraer, podremos filtrar un texto por las
columnas que lo componen. Ejemplo:
➢ ls –l | tr –s “ “ | cut –d” ” –f1,9: a partir de una lista
de ficheros (ls –l) del directorio actual, limpiamos de espacios
duplicados el texto (tr –s “ “) y a continuación nos quedamos con las
columnas 1 y 9, cortando cada línea por espacios. De esta forma
obtenemos una lista de ficheros compuesta por los permisos y
nombre de cada fichero.
Comandos para la Manipulación de Datos
▪ sort – Ordena las líneas de un texto
Este comando nos permite ordenar la salida estándar de un comando por orden
alfabético. Ejemplos:
➢ ls –l | sort : ordena la lista de ficheros generada por (ls -l) por orden
alfabético.
▪ uniq – Elimina líneas repetidas de un texto
Este comando elimina las líneas repetidas de un texto dado por la entrada
estándar. Ejemplos:
➢ ls –l | sort | uniq : ordena la lista de ficheros generada por (ls -l)
por orden alfabético y elimina las líneas repetidas.
Comandos para la Manipulación de Directorios
▪ mkdir <nombreDirectorio> - Crea un nuevo directorio
Este comando permite la creación de un nuevo directorio en el path especificado
como argumento. Ejemplo:
➢ mkdir practicas/: crea el directorio practicas/ en el directorio actual.
Opciones interesantes:
❑ mkdir –p <path/nombreDirectorio> : la opción –p crea los
directorios padre al directorio nuevo a crear si estos no existen. Ejemplo:
➢ mkdir –p abuelo/padre/hijo/: esta opción crearía los
directorios abuelo/, padre/ e hijo/ con el correspondiente orden de
herencia, hijo contenida en padre, padre en abuelo.
Comandos para la Manipulación de Directorios
▪ rmdir <path/nombreDirectorio> - Elimina un directorio o árbol de
directorios
Este comando permite la eliminación de un directorio no vacío o directorios a
partir del path especificado. Ejemplo:
➢ rmdir practicas/: elimina el directorio practicas/ del directorio actual.
Opciones interesantes:
❑ rmdir –p <path/nombreDirectorio> : la opción –p elimina la rama
de directorios especificada. Ejemplo:
➢ rmdir –p abuelo/padre/hijo/: esta opción eliminaría los
directorios abuelo/, padre/ ehijo/.
Para borrar un directorio no vacío, podemos hacerlo mediante rm –r (borrado
recursivo).
Comandos para Mover Archivos/Directorios
▪ cp <archivoA/dirA> <archivoB/dirB> – Copiar archivo/directorio
Abreviatura de copy. Este comando nos permite copiar archivos dentro de un
mismo directorio y entre directorios diferentes. Opciones interesantes:
❑ cp –i <archivo_origen> <archivo_destino>: permite copiar
archivos de forma interactiva, es decir, se nos pregunta si deseamos copiar
el archivo a la ubicación dada. Útil para evitar sobreescrituras de archivos.
▪ mv <archivoA/dirA> <archivoB/dirB> – Mover archivo/directorio
Abreviatura de move. Permite mover archivos dentro de un mismo directorio o
entre directorios diferentes. Opciones interesantes:
❑ mv –i <archivo_origen> <archivo_destino>: permite mover
archivos de forma interactiva, es decir, se nos pregunta si deseamos copiar
el archivo a la ubicación dada. Útil para evitar sobreescrituras de archivos.
Otros comandos
▪ grep <patrón> – Buscar líneas con el patrón especificado
Este comando busca líneas dentro de un texto en las cuales existan palabras o
fragmentos de texto que coincidan con el patrón especificado como argumento
del comando grep. Este comando es muy útil para filtrar información de ficheros
textos, como por ejemplo, filtrar información de la ayuda de man. Opciones
interesantes:
❑ grep –E <patron> : esta opción permite buscar palabras o
fragmentos de texto, con expresiones regulares extendidas. Ejemplo:
➢ ls –l | grep –E “*\.doc$”: dada una lista de ficheros (ls -l),
busca aquellas líneas en las que los ficheros tengan por extensión
.doc
➢ ls –l |grep –E “^-”: dada una lista de ficheros (ls -l), busca
aquellas líneas que empiecen por guión, lo que nos permite obtener
la lista de los ficheros regulares.
Otros comandos
▪ hostname – Nombre máquina del equipo
Este comando nos muestra el nombre del equipo sobre el cual estamos
trabajando.
▪ ifconfig – Configuración de la red.
Este comando nos muestra la configuración actual de todas las interfaces de red
de nuestro equipo. Ejemplo: