Voici un code qui fonctionne à la fois pour le terminal de MacOS et pour iTerm2. Il n'est pas nécessaire que la fenêtre soit au premier plan (contrairement à certaines solutions AppleScript).
printf '\e[2J\e[3J\e[H'
Comment cela fonctionne
Cela utilise une série de Séquences d'échappement ANSI . Chaque séquence d'échappement ANSI commence par le caractère "ESC" (escape), un caractère ASCII non imprimable (ce qui signifie qu'il n'a pas de représentation glyphique visuelle comme 1
o a
). printf
peut imprimer un tel caractère en utilisant \e
(ou par sa valeur octale \033
ou sa valeur hexadécimale \x1B
).
Un type de séquence d'échappement ANSI sont les Commandes "Introducteur de séquence de contrôle". . Ils commencent tous par la forme ESC CSI
où ESC
est le caractère d'échappement que nous venons de mentionner, et CSI
est la valeur [
(ou 0x5B
en hexagone)
J'utilise le \e[
parce qu'elle est plus courte que \x1B\x5B
et plus facile à lire.
Comme nous pouvons le voir, il y a deux séquences d'échappement ANSII ici, chacune d'entre elles étant la forme "introducteur de séquence de contrôle", appelée avec des arguments différents. Sachant cela, nous pouvons diviser la chaîne de caractères en ses 3 parties :
-
\e[2J
- Le début d'une séquence d'échappement (
\e
), contenant une séquence de contrôle ( [
) avec l'argument 2J
- Il s'agit d'une instance de la commande "ED - Erase in Display", qui a la forme suivante
CSI n J
- El
n
La valeur est fixée à 3
dans ce cas, qui invoque la deuxième variante :
Si n es 2
, efface tout l'écran (et déplace le curseur en haut à gauche sur DOS ANSI.SYS).
-
\e[3J
-
Le début d'une séquence d'échappement ( \e
), contenant une séquence de contrôle ( [
) avec l'argument 3J
-
Il s'agit d'une instance de la commande "ED - Erase in Display", qui a la forme suivante CSI n J
-
El n
La valeur est fixée à 3
dans ce cas, qui invoque la troisième variante :
Si n es 3
, efface tout l'écran et supprime toutes les lignes enregistrées dans le tampon de défilement (cette fonction a été ajoutée pour xterm et est prise en charge par d'autres applications de terminal)."
-
Malgré la description de Wikipedia, il semble que cela n'efface pas réellement l'écran dans iTerm et le terminal par défaut, seul le tampon de retour de défilement est effacé. D'où la nécessité de l'option \e[2J
ci-dessus.
-
\e[H
:
-
Le début d'une séquence d'échappement ( \e
), contenant une séquence de contrôle ( [
) avec l'argument H
.
-
Il s'agit d'une instance de la commande "CUP - Cursor Position", qui a pour forme CSI n ; m H
,
Déplace le curseur à la ligne n , colonne m . Les valeurs sont basées sur 1, et ont pour valeur par défaut 1
(coin supérieur gauche) si elle est omise. Une séquence telle que CSI ;5H
est un synonyme de CSI 1;5H
ainsi que CSI 17;H
est la même chose que CSI 17H
y CSI 17;1H
-
Cela aurait pu être écrit plus explicitement comme \e[1;1H
Fait amusant
Ces séquences de contrôle sont en fait la façon dont le système intégré clear
( /usr/bin/clear
) fonctionne. Tout ce qu'elle semble faire est de produire une sortie, que nous pouvons inspecter avec xxd
:
$ clear | xxd
00000000: 1b5b 481b 5b32 4a .[H.[2J
Nous pouvons recréer la même sortie avec printf '\e[H \e2J'
:
$ printf '\e[H \e2J' | xxd
00000000: 1b5b 4820 1b32 4a .[H .2J
Remarquez qu'ils n'utilisent pas \e3J
d'où la raison pour laquelle clear
efface seulement l'écran, mais pas le scrollback.