Unix es un fascinante sistema operativo. Concebido originalmente en los Laboratorios Bell a finales de la década de 1960, nació de la frustración con el sistema operativo conocido como «Multics» (servicio de informática e información multiplexada). Unix tiene ahora más de 50 años (!) y la implementación de Linux alimenta grandes extensiones de Internet.
¿Por qué Unix es tan popular?
En mi opinión, el éxito de Unix proviene del enfoque filosófico del desarrollo. La filosofía UNIX está documentada por Doug McIlroy en el Bell System Technical Journal en 1978:
1. Haga que cada programa haga bien una cosa. Para hacer un nuevo trabajo, construya de nuevo en lugar de complicar los programas antiguos agregando nuevas «características».
2. Espere que la salida de cada programa se convierta en la entrada de otro programa aún desconocido. No sature la salida con información extraña. Evite los formatos de entrada rígidos en columnas o binarios. No insista en la entrada interactiva.
3. Diseñe y construya software, incluso sistemas operativos, para probarlos temprano, idealmente en cuestión de semanas. No dude en tirar las partes torpes y reconstruirlas.
4. Utilice herramientas en lugar de ayuda no calificada para aligerar una tarea de programación, incluso si tiene que desviarse para construir las herramientas y esperar tirar algunas de ellas después de haber terminado de usarlas.
Esto fue hace más de 40 años, y captura SÓLIDOS (principio de responsabilidad única, abierto/cerrado), microservicios, canalizaciones funcionales, ágil y el espíritu de DevOps.
Para obtener más detalles sobre la filosofía Unix, lea este libro (disponible gratuitamente aquí, ¡pero compre una copia para apoyar al autor!).
veamos algunos ejemplos de la filosofía Unix en acción.
Haga que cada programa haga bien una cosa. Para hacer un nuevo trabajo, construya de nuevo en lugar de complicar los programas antiguos agregando nuevas «características».
cat
hace exactamente una cosa. Concatena archivos y los muestra en la salida estándar. Eso es todo lo que hace. No hace paginación. No ofrece funcionalidad de búsqueda. Hace exactamente lo que dice en la lata y nada más.
tr
es similar. Hace «reemplazo textual» leyendo desde la entrada, haciendo cualquier traducción y escribiendo hasta la salida.
tr -d aeiouAEIOU < file # Display file without vowels
tr eao 340 < file # Partially leet speak file
true
y false
son quizás los mejores ejemplos de hacer bien una cosa. true
no hace nada, con éxito! false
no hace nada.
false && echo Hi # does nothing
true && echi Hi # Prints Hi
Composición
«Espere que la salida de cada programa se convierta en la entrada de otro»
En Unix, la mayoría de las operaciones tienen la capacidad de leer y escribir en una salida estándar en un formato de texto bien entendido. Con unos pocos comandos, como |
, >
y <
, podemos alimentar la salida de un programa a otro. Veamos algunos ejemplos:
En este ejemplo, usamos cat
para generar el contenido de un archivo y alimentar la salida a wc
, que puede contar el número de líneas en un archivo.
cat foo.txt | wc -l
En este ejemplo, usamos history
para encontrar nuestros comandos más utilizados combinándolo con cut
, sort
, uniq
y head
.
history | cut -f5 -d" " | sort -rn | uniq -c | sort -rn | head
xargs
es la navaja suiza definitiva que le permite construir comandos a partir de la salida estándar. Usémoslo para borrar todo».archivos tmp » en el directorio actual después de usar find
para localizarlos.
find -type f *.tmp | xargs rm
Todo es un archivo
En UNIX todo es un archivo (o más precisamente, todo es un flujo de bytes). Esto significa que se pueden usar las mismas API/comandos para leer una unidad de CD-ROM, escribir un socket de red o encontrar información de la CPU.
Por ejemplo, todo el sistema de archivos /proc
en Linux no son realmente archivos, es una vista dinámica de información que se expone como un montón de descriptores de archivos.
Algunos ejemplos:
cat /proc/cpuinfo # Displays your CPU info exposed as a filefoo > /dev/null # Redirect output into a file called
# null (which discards everything)od -vAn -N1 -td1 < /dev/urandom # Display a random 1 byte number
# (via https://unix.stackexchange.com/a/268960
Automatización
Mucho antes de «automatizar todas las cosas», Unix estaba allí, errr, automatizando todas las cosas
cron
(más aquí) ha estado automatizando todas las cosas durante los últimos más de 40 años. Los trabajos Cron son scripts programados que se pueden ejecutar a horas o intervalos fijos.
Cada usuario en un sistema Unix tiene un conjunto de tareas programadas, visibles mediante el comando crontab
. El archivo está en un formato muy simple que da la fecha y hora del script que se ejecuta.
El comando at
es una alternativa más amigable, aquí hay un ejemplo de disparar un comando a las 1145 el 31 de enero (desde aquí).
echo "cc -o foo foo.c" | at 1145 jan 31
Puppet, Chef, CFEngine, Ansible – todas estas herramientas DevOps nacidas y criadas en sistemas basados en Unix.