Material de la lección La terminal de Unix de Software Carpentry
Las computadoras realizan cuatro funciones básicas:
Interfaces: desde conexiones cerebro-computadora y voz → hasta pantallas, ratones, teclados.
Las interfaces gráficas (GUI) son comunes desde los 80s; origen en los 60s con Doug Engelbart y “La Madre de todos los Demos”.
Imagen de ss64.com/bash/syntax-terminal.html
Más info en: unixdigest
Antes de la GUI → solo existía la interfaz de línea de comandos (CLI).
Entrada/salida limitada a texto (teclado estándar, impresoras de línea).
Basada en el ciclo REPL: leer (read) → ejecutar (execute) → imprimir (print) → repetir (loop).
Terminal (shell): programa intermediario entre usuario y sistema operativo.
Ejecuta otros programas en lugar de hacer cálculos directamente.
Ejemplo popular: Bash (Bourne Again Shell) en Unix/Linux.
Ventajas del uso de la terminal (CLI):
¡Es una habilidad clave en computación científica, clusters y la nube!
Oceanógrafa biológica, ha recolectado 1,520 muestras de vida marina gelatinosa en el Giro del Pacífico Norte.
Ahora debe:
goostat
.goodiff
.Peeero,
* Ensayo: 30 min/muestra, 8 máquinas en paralelo → ~2 semanas.
* Procesamiento manual: 46,370 ejecuciones (≈2+ semanas sin pausa).
* Riesgo de errores y retraso en la entrega.
Solución: ¡¡¡Automatización con línea de comandos!!!
Técnica de proyecto que debe correr un modelo oceánico, pero en su computadora tardaría mucho así que debe usar una supercomputadora o cluster.
¡No hay interfaz gráfica (GUI)!
–> Debe poder comunicarse con la supercomputadora para configurar y correr el modelo, analizar las salidas y graficarlas por medio de la terminal.
Imagen de MPAS-Ocean
¿Cómo puedo moverme dentro de mi computadora?
¿Cómo puedo ver qué archivos y directorios tengo?
¿Cómo puedo especificar la ubicación de un archivo o directorio en mi computadora?
Sistema de archivos de Nelle.
Directorio /home
de Nelle.
A partir de /Users/amanda/data/
, ¿Cuál de los siguientes comandos podría Amanda usar para navegar a su directorio de inicio, que es /Users/amanda
?
1. cd .
2. cd /
3. cd /home/amanda
4. cd ../..
5. cd ~
6. cd home
7. cd ~/data/..
8. cd
9. cd ..
Solución: 5, 7, 8, 9
Si se utiliza el diagrama de sistema de directorios y pwd
muestra /Users/thing
, ¿Qué mostrará ls -F ../backup
?
1. ../backup: No such file or directory
2. 2012-12-01 2013-01-08 2013-01-27
3. 2012-12-01/ 2013-01-08/ 2013-01-27/
4. original/ pnas_final/ pnas_sub/
Solución: 4. original/ pnas_final/ pnas_sub/
cd path
cambia el directorio de trabajo actual.ls path
imprime un listado de un archivo o directorio específico; ls
por si solo lista el contenido del directorio de trabajo actual.pwd
imprime el directorio de trabajo actual del usuario.whoami
muestra la identidad actual del usuario./
es el directorio raíz de todo el sistema de archivos./
en Unix y por \
en Windows...
significa ‘el directorio por encima del actual’ ; .
significa ‘el directorio actual’.algo.extension
. La extensión no es necesaria y no garantiza nada, pero normalmente se utiliza para indicar el tipo de datos en el archivo.-
.¿Qué más aprendieron?
¿Cómo puedo crear, copiar y eliminar archivos y directorios?
¿Cómo puedo editar archivos?
Supón que has creado un archivo .txt en tu directorio actual para incluír una lista de las pruebas estadísticas que necesitas hacer para analizar tus datos, y lo llamarás: statstics.txt
Después de crear y guardar este archivo, te das cuenta de que has escrito mal el nombre del archivo. Si deseas corregir el error, ¿cuál de los siguientes comandos podrías utilizar para hacerlo?
1. cp statstics.txt statistics.txt
2. mv statstics.txt statistics.txt
3. mv statstics.txt .
4. cp statstics.txt .
Solución: 2. mv statstics.txt statistics.txt
Jamie está trabajando en un proyecto y nota que sus archivos no están muy bien organizados:
$ analyzed/ fructose.dat raw/ sucrose.dat
Los archivos fructose.dat
y sucrose.dat
contienen la salida de sus análisis. ¿Qué comando(s) cubierto(s) necesitas ejecutar para que los comandos a continuación produzcan la salida mostrada?
analyzed/ raw/
fructose.dat sucrose.dat
Para este ejercicio puedes probar los comandos del directorio data-shell/data
. En el ejemplo que sigue, ¿qué hace cp
cuando se le dan varios nombres de archivo y un nombre de directorio?:
En el siguiente ejemplo, ¿qué hace cp
cuando se le dan tres o más nombres de archivo?
Salida:
amino-acids.txt animals.txt backup/ elements/ morse.txt pdb/ planets.txt salmon.txt sunspot.txt
cp old new
copia un archivo.mkdir path
crea un nuevo directorio.mv old new
mueve (renombra) un archivo o directorio.rm path
elimina un archivo.¿Cómo puedo combinar comandos existentes para hacer cosas nuevas?
En nuestro directorio actual, queremos encontrar los 3 archivos que tienen el menor número de líneas. ¿Cuál de los siguientes comandos funcionaría?
wc -l * > sort -n > head -n 3
wc -l * | sort -n | head -n 1-3
wc -l * | head -n 3 | sort -n
wc -l * | sort -n | head -n 3
. . . Solución: 4. Inténtalo en el directorio data-shell/molecules
.
Un archivo llamado animals.txt
(en el directorio data-shell/data
) contiene los siguientes datos:
2012-11-05,deer
2012-11-05,rabbit
2012-11-05,raccoon
2012-11-06,rabbit
2012-11-06,deer
2012-11-06,fox
2012-11-07,rabbit
2012-11-07,bear
¿Qué texto pasa a través de cada uno de los pipes y qué incluye el redireccionamiento final en el siguiente pipeline?
Pista: construye el pipeline agregando un comando a la vez para comprobar tu respuesta.
Supón que deseas borrar tus archivos de datos procesados y sólo conservar los archivos sin procesar y el script de procesamiento para ahorrar espacio en disco. Los archivos sin procesar terminan en .dat
y los archivos procesados terminan en .txt
. ¿Cuál de las siguientes opciones eliminaría todos los archivos de datos procesados, y nada más que los archivos de datos procesados?
rm ?.txt
rm *.txt
rm * .txt
rm *.*
El archivo data-shell/data/animals.txt
contiene 586 líneas de datos en el siguiente formato:
2012-11-05,deer
2012-11-05,rabbit
2012-11-05,raccoon
2012-11-06,rabbit
...
Asumiendo que tu directorio actual sea data-shell/data/
, ¿qué comando usarías para producir una tabla que muestre el recuento total de cada tipo de animal en el archivo?
1. grep {deer, rabbit, raccoon, deer, fox, bear} animals.txt | wc -l
2. sort animals.txt | uniq -c
3. sort -t, -k2,2 animals.txt | uniq -c
4. cut -d, -f 2 animals.txt | uniq -c
5. cut -d, -f 2 animals.txt | sort | uniq -c
6. cut -d, -f 2 animals.txt | sort | uniq -c | wc -l
Solución: 5. ¡Pruébalo!
cat
muestra el contenido de sus entradas. -head
muestra las primeras líneas de su entrada.tail
muestra las últimas líneas de su entrada.sort
ordena sus entradas.wc
cuenta líneas, palabras y caracteres en sus entradas.*
coincide con cero o más caracteres en un nombre de archivo, por lo que*.txt
coincide con todos los archivos que terminan en .txt.?
Coincide con un solo carácter en un nombre de archivo, así que ?.txt
coincide con a.txt pero no any.txt.commando > archivo
redirige la salida de un comando a un archivo.first | second
es un pipeline: la salida del primer comando se utiliza como entrada para el segundo.¿Cómo puedo realizar las mismas acciones en varios archivos diferentes?
for
repite comandos una vez para cada elemento de una lista.for
necesita una variable para referirse al elemento en el que está trabajando actualmente.$name
para expandir una variable (es decir, obtener su valor). También se puede usar ${name}
.history
para mostrar comandos recientes, y !number
para repetir un comando por número.En el directorio data-shell/molecules
, ls
regresa la siguiente salida:
cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
¿Cuál es la salida del siguiente código?:
Ahora, ¿cuál es la salida de este código?:
¿Por qué estos dos loops dan resultados diferentes?
Supón que queremos configurar una estructura de directorios para organizar algunos experimentos que miden constantes de velocidad de reacción que involucran distintos compuestos y distintas temperaturas. ¿Cuál sería el resultado del siguiente código?:
for species in cubane ethane methane
do
for temperature in 25 30 37 40
do
mkdir $species-$temperature
done
done
Intenta ejecutar el código para descubrir qué directorio se crean.
¿Cómo puedo guardar y reutilizar comandos?
Script 1. Considera el directorio data-shell/molecules
que contiene una cantidad de archivos .pdb además de otro archivo que hayas creado. Explica, para los siguientes tres ejemplos, que hace el script llamado example.sh
cuando lo ejecutas como bash example.sh *.pdb
:
Solución: El script 1 mostrará una lista de todos los archivos que contienen un punto en su nombre.
Solución: El script 2 mostrará el contenido de los primeros 3 archivos que coinciden con la extensión del archivo. La terminal expande el caracter especial antes de pasar los argumentos al script example.sh
.
Solución: El script 3 mostrará todos los parámetros del script (es decir, todos los archivos .pdb), seguido de .dat. cubane.pdb etano.pdb metano.pdb octano.pdb pentano.pdb propano.pdb.dat
En el directorio molecules, imagina que tienes un script de la terminal llamado script.sh
que contiene los siguientes comandos:
Mientras estás en el directorio molecules
, escribes el siguiente comando:
bash script.sh '*.pdb' 1 1
¿Cuál de los siguientes resultados esperarías ver?
.pdb
en el directorio molecules..pdb
en el directorio molecules.*.pdb
.Solución:
$1
, $2
y $3
representan los argumentos para el script, tal que los comandos ejecutados son: $ head -n 1 cubane.pdb ethane.pdb octane.pdb pentane.pdb propane.pdb $ tail -n 1 cubane.pdb ethane.pdb octane.pdb pentane.pdb propane.pdb La terminal no expande ‘* .pdb’
porque está rodeado por comillas.Supongamos que se ha guardado el siguiente script en un archivo denominado do-errors.sh
en el directorio north-pacific-gyre/2012-07-03
de Marina:
# Calcular las estadísticas de los archivos de datos.
for datafile in "$@"
do
echo $datfile
bash goostats $datafile stats-$datafile
done
Cuando lo ejecutas:
$ bash do-errors.sh NENE*[AB].txt
El output está en blanco. Para averiguar por qué, vuelve a ejecutar el script utilizando la opción -x:
$ bash -x do-errors.sh NENE*[AB].txt
¿Cuál es el resultado que muestra? ¿Qué línea es responsable del error?
bash archivo
ejecuta los comandos guardados en archivo.$@se
refiere a todos los parámetros de la línea de comandos de un script de la terminal.$1
, $2
, etc., se refieren al primer parámetro de la línea de comandos, al segundo parámetro, etc.¿Cómo puedo encontrar archivos?
¿Cómo puedo encontrar algunas cosas dentro de mis archivos?
Juilia tiene varios cientos de archivos de datos guardados en un directorio, cada uno de los cuales tiene el formato siguiente:
2013-11-05,venado,5
2013-11-05,conejo,22
2013-11-05,mapache,7
2013-11-06,conejo,19
2013-11-06,venado,2
Quiere escribir un script de shell que tome un directorio y una especie como parámetros de línea de comandos y que le devuelva un archivo llamado especies.txt
que contenga una lista de fechas y el número de individuos de esa especie observados en esa fecha, como este archivo de números de conejos:
2013-11-05,22
2013-11-06,19
2013-11-07,18
Escribe estos comandos y pipes en el orden correcto para lograrlo (Sugerencia: usa man grep
, man cut
y data-shell/data/animal-counts/animals.txt
como guía):
cut -d : -f 2
>
|
grep -w $1 -r $2
|
$1.txt
cut -d , -f 1,3
Solución: grep -w $1 -r $2 | cut -d : -f 2 | cut -d , -f 1,3 > $1.txt
¿Cómo llamas a tu función? Ej. bash count-species.sh bear .
-v
es una opción de grep que invierte la coincidencia de patrones, de modo que sólo las líneas que no coinciden con el patrón se imprimen. Dado esto ¿cuál de los siguientes comandos encontrarán todos los archivos en /data
cuyos nombres terminan en s.txt
(por ejemplo, animals.txt
or planets.txt
), pero no contienen la palabra net? Después de pensar en tu respuesta, puedes probar los comandos en el directorio data-shell
.
1. find data -name '*s.txt' | grep -v net
2. find data -name *s.txt | grep -v net
3. grep -v "temp" $(find data -name '*s.txt')
4. Ninguna de las anteriores.
Solución: La respuesta correcta es 1. Poniendo la expresión entre comillas, evita que el shell la expanda, y luego lo pasa al comando find
.
La opción 2 es incorrecta porque el shell expande *s.txt
en lugar de mandar el nombre correcto al find
.
La opción 3 es incorrecta porque busca en los contenidos de los archivos las líneas que no coinciden con “temp”, en lugar de buscar los nombres de los archivos.
find
encuentra archivos con propiedades específicas que coinciden con los patrones especificados.grep
selecciona líneas en archivos que coinciden con los patrones especificados.--help
es un indicador usado por muchos comandos bash y programas que se pueden ejecutar desde dentro de Bash, se usa para mostrar más información sobre cómo usar estos comandos o programas.man commando
muestra la página del manual de un comando.$(comando)
contiene la salida de un comando.Introducción a la programación científica - Septiembre 2025