Unix est un système d’exploitation fascinant. Conçu à l’origine aux Bell Labs à la fin des années 1960, il est né de la frustration du système d’exploitation connu sous le nom de « Multics » (service d’information et de calcul multiplexé). Unix a maintenant plus de 50 ans (!) et l’implémentation Linux alimente d’énormes pans d’Internet.
Alors – pourquoi Unix est-il si populaire ?
Dans mon esprit, le succès d’Unix vient de l’approche philosophique du développement. La philosophie UNIX est documentée par Doug McIlroy dans le Bell System Technical Journal en 1978:
1. Faites en sorte que chaque programme fasse bien une chose. Pour faire un nouveau travail, construisez à nouveau plutôt que de compliquer les anciens programmes en ajoutant de nouvelles « fonctionnalités ».
2. Attendez-vous à ce que la sortie de chaque programme devienne l’entrée d’un autre programme encore inconnu. N’encombrez pas la sortie avec des informations étrangères. Évitez les formats d’entrée strictement colonnes ou binaires. N’insistez pas sur une entrée interactive.
3. Concevez et construisez des logiciels, même des systèmes d’exploitation, à essayer tôt, idéalement en quelques semaines. N’hésitez pas à jeter les pièces maladroites et à les reconstruire.
4. Utilisez des outils de préférence à une aide non qualifiée pour alléger une tâche de programmation, même si vous devez faire un détour pour construire les outils et vous attendre à en jeter certains après les avoir utilisés.
C’était il y a plus de 40 ans, et capture SOLID (principe de responsabilité unique, ouvert/fermé), microservices, pipelines fonctionnels, agile et l’esprit de DevOps!
Pour plus de détails sur la philosophie Unix, lisez ce livre (disponible gratuitement ici mais achetez un exemplaire pour soutenir l’auteur !).
Regardons quelques exemples de la philosophie Unix en action.
Faites en sorte que chaque programme fasse bien une chose. Pour faire un nouveau travail, construisez à nouveau plutôt que de compliquer les anciens programmes en ajoutant de nouvelles « fonctionnalités ».
cat
fait exactement une chose. Il concatène les fichiers et les affiche sur la sortie standard. C’est tout ce qu’il fait. Il ne fait pas de pagination. Il n’offre pas de fonctionnalité de recherche. Il fait exactement ce qu’il dit sur l’étain et pas plus.
tr
est similaire. Il effectue un « remplacement textuel » en lisant à partir de l’entrée, en effectuant des traductions et en écrivant à la sortie.
tr -d aeiouAEIOU < file # Display file without vowels
tr eao 340 < file # Partially leet speak file
true
et false
sont peut-être les meilleurs exemples de bien faire une chose. true
ne fait rien, avec succès! false
ne fait rien.
false && echo Hi # does nothing
true && echi Hi # Prints Hi
Composition
» Attendez-vous à ce que la sortie de chaque programme devienne l’entrée d’un autre »
Sous Unix, la plupart des opérations ont la capacité de lire et d’écrire sur la sortie standard dans un format textuel bien compris. Avec quelques commandes, telles que |
, >
et <
, nous pouvons alimenter la sortie d’un programme à un autre. Regardons quelques exemples:
Dans cet exemple, nous utilisons cat
pour afficher le contenu d’un fichier et alimenter la sortie en wc
qui peut compter le nombre de lignes dans un fichier.
cat foo.txt | wc -l
Dans cet exemple, nous utilisons history
pour trouver nos commandes les plus fréquemment utilisées en les combinant avec cut
, sort
, uniq
et head
.
history | cut -f5 -d" " | sort -rn | uniq -c | sort -rn | head
xargs
est le couteau suisse ultime vous permettant de construire des commandes à partir de la sortie standard. Utilisons-le pour tout supprimer « .fichiers « tmp » dans le répertoire courant après avoir utilisé find
pour les localiser.
find -type f *.tmp | xargs rm
Tout est un fichier
Sous UNIX tout est un fichier (ou plus précisément, tout est un flux d’octets). Cela signifie que les mêmes API/commandes peuvent être utilisées pour lire un lecteur de CD-ROM, écrire un socket réseau ou trouver des informations sur le processeur.
Par exemple, l’ensemble du système de fichiers /proc
sous Linux n’est pas vraiment des fichiers — c’est une vue dynamique des informations qui sont exposées sous la forme d’un tas de descripteurs de fichiers.
Quelques exemples:
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
Automatisation
Bien avant l' »automate-all-the-things », Unix était là, errr, automatisant toutes les choses
cron
( plus ici) a automatisé toutes les choses depuis plus de 40 ans. Les tâches Cron sont des scripts planifiés qui peuvent s’exécuter à des heures fixes ou à des intervalles fixes.
Chaque utilisateur d’un système Unix dispose d’un ensemble de tâches planifiées, visibles à l’aide de la commande crontab
. Le fichier est dans un format très simple qui donne la date et l’heure du script qui s’exécute.
La commande at
est une alternative plus conviviale, voici un exemple de tir d’une commande à 11 h 45 le 31 janvier (à partir d’ici).
echo "cc -o foo foo.c" | at 1145 jan 31
Puppet, Chef, CFEngine, Ansible – tous ces outils DevOps et nés et élevés sur des systèmes basés sur Unix.