Cette astuce de redirection Bash remplace echo...
Agence web » Actualités du digital » Cette astuce de redirection Bash remplace echo…

Cette astuce de redirection Bash remplace echo…

Bash et d'autres shells Linux prennent en charge une puissante plomberie de commandes à l'aide de fonctionnalités telles que la redirection. Vous êtes peut-être habitué au type de redirection d’entrée le plus basique, mais, comme c’est souvent le cas, Linux a plus de profondeur qu’il n’y paraît.

Redirection d'entrée en utilisant <

La redirection d'entrée est l'une des premières techniques shell avancées que vous êtes susceptible d'apprendre. Il s'agit d'un mécanisme qui vous permet d'envoyer des données à une commande à partir d'un fichier, au lieu de les saisir directement ou de les transmettre depuis un autre processus.

La plupart des programmes, cat par exemple, accepteront un nom de fichier comme argument de ligne de commande, si cela a du sens pour eux :

cat filename

Mais d’autres – tr, par exemple – ne le font pas. Selon sa page de manuel, « L'utilitaire tr copie l'entrée standard vers la sortie standard avec substitution ou suppression des caractères sélectionnés. » Son utilisation de base est donnée comme suit :

tr string1 string2

Il existe donc deux manières typiques d'utiliser tr : en tapant manuellement une entrée sur la ligne de commande ou, plus communément (en particulier dans les scripts), en y redirigeant une entrée :

cat filename | tr string1 string2

Ce pipeline utilise cat pour envoyer le contenu d'un fichier vers la sortie standard, mais il existe un meilleur moyen, en utilisant la redirection d'entrée :

tr string1 string2 

Ici, le symbol opens the named file with file descriptor 0, standard input, making it available to tr.

Ici les documents avec <<

Si vous avez fait un peu de script shell ou travaillé avec des entrées sur la ligne de commande, vous avez peut-être été confronté à un problème courant : comment travailler avec des chaînes multilignes. Bien que vous puissiez vous débrouiller avec des séquences d'échappement et d'autres approches, la syntaxe du document ici est beaucoup plus pratique :

#!/bin/bash
cat <

Le mot après le « 

Cela peut sembler être une action très différente – formater une chaîne multiligne en une seule ligne – mais les héréditaires sont une forme de redirection d'entrée. Notez que cet exemple utilise cat, pas echo. Tandis que echo imprime tous les arguments que vous lui transmettez, cat imprime l'entrée standard, ce dont nous parlons ici.

Vous pouvez le confirmer en passant un hérdoc à echo :

Votre shell utilisera une invite différente pour indiquer qu'il attend une entrée sur plusieurs lignes. Bash affiche un « > » tandis que zsh, comme dans la capture d'écran ci-dessus, utilise « heredoc> ».

Le programme echo ne fait rien avec l'entrée standard, donc rien ne se passe dans ce cas. Vous constaterez le même manque de résultat si vous exécutez le pipeline équivalent :

echo "hello, world" | echo

Le programme cat, quant à lui, transmet l'entrée à la sortie standard :

Le mystérieux <<< et voici les ficelles

Même si vous êtes un maître hérdocien, vous ignorez peut-être ce dernier type de redirection d'entrée : la chaîne here. C'est en fait très similaire à la version multiligne, avec juste une seule ligne à la place :

cat <<< "hello, world"

Le chat échouera parce que c'est l'équivalent de echo hello, | cat world. Assurez-vous de citer votre chaîne ici si elle contient des espaces.

Étant donné que cette syntaxe attend une chaîne sur une seule ligne, aucun délimiteur n’est nécessaire. Comme les documents ici, la chaîne here peut effectuer une substitution de variable, elle est donc aussi polyvalente que nécessaire :

grep -q /usr/bin <<< $PATH

Alors, à quoi ça sert ? Pour commencer, cette approche est un peu plus robuste et efficace que son équivalent :

echo "hello, world" | echo

Lorsqu'une commande est redirigée, votre shell ouvre un sous-shell pour l'exécuter et connecte l'entrée et la sortie entre les deux, le cas échéant. Il s'agit la plupart du temps d'un processus inestimable, mais pour des cas simples comme passer du texte d'une commande à une autre, ce n'est pas toujours nécessaire. L'utilisation d'une chaîne ici évite cette surcharge.

Une chaîne ici peut également servir de meilleure documentation, reflétant plus précisément l'intention d'une commande. Plutôt que d'utiliser à mauvais escient une commande comme echo ou cat pour fournir une entrée, la chaîne ici fait ce travail toute seule, et elle ne fait que ce travail si son objectif est clair.

Pour cette raison, il est également pratique de l’utiliser comme espace réservé. Par exemple, cette commande recherche dans le texte un modèle donné :

grep "pattern" <<< "some text to search"

Lors de la construction du modèle, vous souhaiterez peut-être utiliser un texte factice pour le tester, ce que la chaîne ici vous permet de faire facilement. Ensuite, lorsque vous avez fini d'affiner le modèle, vous pouvez le remplacer par une redirection d'entrée depuis un fichier :

grep "pattern" < filename

La commande globale est presque identique, la cohérence est donc maintenue et la commande finale est plus facile à formuler.

Parfois, cependant, la chaîne ici est plus qu'une subtilité ; c'est une nécessité. Prenez le read intégré, par exemple :

echo 'hello' | read greeting

L'intention ici est que $greeting finisse avec la valeur Bonjour mais ce n'est pas ce qui se passe :

Étant donné que read s'exécute dans un sous-shell, la variable de salutation n'est pas disponible pour le shell appelant, donc l'entrée est ignorée. Mais, avec une chaîne ici, tout fonctionne comme vous le souhaiteriez :

★★★★★