Copier et coller en ligne de commande sous macOS

J’utilise macOS (enfin Mac OS X) depuis plus de 15 ans et je ne connaissais pas cette fonction : il est possible d’accéder au presse-papier de macOS en ligne de commande.

C’est grâce à David Legrand (qui n’a pas oublié la devise de Next Inpact) que j’ai découvert les deux commandes.

Il faut commencer par pbcopy, qui permet d’envoyer des données dans le presse-papier.

Il y a deux commandes intéressantes en pratique. D’abord, il est possible de copier le contenu d’un fichier texte dans le presse-papier directement en ligne de commande. Le < indique le sens (du fichier vers la commande).

pbcopy < texte.txt

Ensuite, il est aussi possible de copier le contenu du résultat d'un commande dans le presse-papier. Il faut ajouter un | (pipe, option + shift + l sous macOS) derrière la commande, pour rediriger le résultat vers le presse-papier à travers pbcopy. Attention, vous n'aurez pas de retour visuel si vous faites une commande ls (qui liste les fichiers).

ls | pcopy

La seconde, pbpaste, permet de récupérer le contenu du presse-papier. Elle fonctionne uniquement avec du texte (on ne peut pas récupérer une image copiée, par exemple) et il y a quelques possibilités intéressantes.

La commande la plus intéressante est la possibilité de copier le contenu du presse-papier dans un fichier, et c'est assez simple. le > indique encore le sens : de la commande vers un fichier. Il est possible d'ajouter -Prefer rtf pour coller du texte mis en forme (par défaut, on est en texte brut).

pbpaste > texte.txt

Plus complexe, il est possible de combiner les deux commandes. Un exemple est par exemple la possibilité d'encoder le contenu du presse-papier en base64. On colle le presse-papier (pbpaste), on pipe la commande base64 puis on (re)pipe le tout vers le presse-papier avec pbcopy.

pbpaste | base64 | pbcopy

Pour les amateurs, il est même possible d'employer des expressions régulières entre deux pipe, ce vieux man donne un exemple qui remplace une espace par un %20 par exemple, pour un encodage dans une URL.

pbpaste | sed 's/ /%20/g' | pbcopy

Je pense que ça nécessite un peu d'habitude, mais pour ceux qui aiment la ligne de commande (et qui ne connaissent pas les deux commandes), c'est visiblement diablement efficace.