Question 1Dans printf '%s\t%s\n' a b, que signifient \t et \n ?
Sortie et rapports — écrire avec printf et here-doc
Cet article fait partie du Cours Linux, qui vous permet de maîtriser à partir de zéro des compétences Linux concrètes, des commandes de base jusqu'aux scripts shell.
Aligne les colonnes avec printf '%s\t%s\n', ajoute les résultats avec > et >>, sépare les erreurs avec 2>, et intègre $(wc -l) dans un modèle here-doc pour construire un rapport d'agrégation — illustré et pratiqué dans un terminal en navigateur.
Mettre en forme sa sortie — printf et redirection de la sortie
Pour afficher lisiblement le résultat d'un script, choisis entre echo, qui affiche une chaîne telle quelle, et printf, qui prend un format et aligne les largeurs et les séparateurs.
Si tu veux juste la valeur d'une variable sur une ligne, echo "$v" suffit.
Si tu écris printf '%s\t%s\n' name age, les arguments viennent remplir les %s dans l'ordre, \t devient une tabulation et \n un saut de ligne.
Contrairement à echo, printf n'ajoute pas de saut de ligne à ta place, donc écris toujours \n en fin de ligne.
La sortie d'une commande passe par deux flux : la sortie standard et l'erreur standard.
> file écrase un fichier avec la sortie standard, >> file ajoute à la fin, et 2> file redirige uniquement l'erreur standard vers un autre fichier.
Envoie les résultats normaux vers le rapport et les erreurs dans leur propre fichier : retrouver la cause d'un problème plus tard devient bien plus simple.
vi fmt.sh # ouvre le fichier dans un éditeur, écris ceci, puis enregistre avec :wq
# #!/bin/sh
# printf '%s\t%s\n' name age # en-tête séparé par une tabulation
# printf '%s\t%s\n' alice 30 # ligne de données, alignée
# echo "done" >> fmt.log # ajouter au log
chmod +x fmt.sh
./fmt.sh
> (écraser) ou >> (ajouter), et les erreurs sont séparées vers un autre fichier avec 2>.| Syntaxe | Signification | Exemple |
|---|---|---|
echo "$v" | Afficher une variable ou une chaîne telle quelle | echo "$name" |
printf "%s\t%s\n" a b | Afficher avec un format (tabulation et saut de ligne explicites) | printf '%s\t%s\n' name age |
> f | Écraser un fichier avec la sortie standard | echo line > report.txt |
>> f | Ajouter la sortie standard à la fin d'un fichier | echo more >> report.txt |
2> err | Séparer uniquement l'erreur standard vers un autre fichier | cat missing 2> err.log |
Réunir un rapport d'agrégation dans un fichier — here-doc et substitution de commande
Pour un rapport à la mise en page fixe, écris le modèle sous forme de here-doc et intègre les résultats de commandes à l'intérieur.
Les lignes que tu écris entre <<EOF et EOF (comme dans cat > report.txt <<EOF … EOF) deviennent le contenu du fichier telles quelles, et là où tu écris $(...), le résultat de l'exécution se développe sur place.
Un <<EOF sans guillemets développe les variables et les substitutions de commande ; <<'EOF' (avec des guillemets simples) ne développe rien et affiche le texte littéralement.
Récupère les valeurs agrégées comme les comptages et les sommes en plaçant wc -l ou grep -c dans une substitution de commande.
Une fois le rapport écrit, indique à l'appelant, avec un code de sortie exit, si le travail a réussi ou non.
exit 0 signifie succès et exit 1 signifie qu'un problème est survenu : un && placé à la suite ou un job de CI peut alors en tenir compte.
vi summary.sh # ouvre le fichier dans un éditeur, écris ceci, puis enregistre avec :wq
# #!/bin/sh
# log=access.log
# lines=$(wc -l < "$log") # compter les lignes
# cat > summary.txt <<REPORT # intégrer la valeur dans le modèle
# --- access summary ---
# total lines: $lines
# REPORT
# echo "summary.txt created"
# exit 0
chmod +x summary.sh
$(wc -l) est intégrée à l'emplacement $(...) du modèle here-doc, réunissant tout dans un seul rapport.| Syntaxe | Signification | Exemple |
|---|---|---|
<<EOF … EOF | here-doc qui développe variables et substitutions de commande | cat <<EOF > t.txt |
<<'EOF' … EOF | here-doc qui ne développe rien et affiche le texte littéralement | cat <<'EOF' > t.txt |
$(wc -l < f) | Récupérer une valeur agrégée par substitution de commande | n=$(wc -l < access.log) |
exit 0 / exit 1 | Renvoyer un code de sortie de succès ou d'échec | exit 0 |
Séparer la sortie standard et les erreurs en deux fichiers
Quand une seule commande produit en même temps des résultats normaux et des erreurs, écris > ok.txt 2> err.txt : la sortie standard est enregistrée dans ok.txt tandis que l'erreur standard part dans err.txt.
Comme tu peux ensuite consulter séparément les résultats et les problèmes, cette forme revient souvent quand on conçoit la journalisation des scripts d'exploitation.
ls /etc /no_such_dir > ok.txt 2> err.txt # la liste vers ok.txt, les erreurs vers err.txt
cat ok.txt # la liste de /etc (sortie standard)
cat err.txt # erreur de /no_such_dir (erreur standard)
> ok.txt et son erreur standard vers 2> err.txt, enregistrées séparément en même temps.| Syntaxe | Signification | Exemple |
|---|---|---|
cmd > ok 2> err | Envoyer sortie standard et erreur standard d'un coup vers deux fichiers | ls /etc > ok.txt 2> err.txt |
echo "…" 1>&2 | Envoyer un message du côté de l'erreur standard | echo failed 1>&2 |
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Quelle syntaxe redirige uniquement l'erreur standard d'une commande vers un autre fichier ?
Question 3Quand tu veux intégrer le résultat de $(...) dans un modèle here-doc, quel délimiteur d'ouverture utilises-tu ?