164 votes

Comment passer la valeur d'une variable à l'entrée standard d'une commande ?

J'écris un shell script qui devrait être quelque peu sécurisé, c'est-à-dire qu'il ne transmet pas de données sécurisées via les paramètres des commandes et n'utilise de préférence pas de fichiers temporaires. Comment puis-je passer une variable à l'entrée standard d'une commande ?

Ou, si ce n'est pas possible, comment puis-je utiliser correctement les fichiers temporaires pour une telle tâche ?

282voto

Martin Points 13951

Passer une valeur à l'entrée standard en Bash est aussi simple que :

your-command <<< "$your_variable"

Veillez toujours à mettre des guillemets autour des expressions variables !

Attention, cela ne fonctionnera probablement que dans les cas suivants bash et ne fonctionnera pas dans sh .

102voto

Oli Charlesworth Points 148744

Simple, mais source d'erreurs : utiliser echo

Quelque chose d'aussi simple que cela fera l'affaire :

echo "$blah" | my_cmd

Notez que cela peut ne pas fonctionner correctement si $blah contient -n , -e , -E etc ; ou s'il contient des barres obliques inverses (la copie de bash de echo préserve les backslashes littéraux en l'absence de -e par défaut, mais les traitera comme des séquences d'échappement et les remplacera par les caractères correspondants même sans -e si les extensions optionnelles de XSI sont activées).

Approche plus sophistiquée : utilisation de printf

printf '%s\n' "$blah" | my_cmd

Cette méthode ne présente pas les inconvénients énumérés ci-dessus : toutes les chaînes C possibles (chaînes ne contenant pas de NULs) sont imprimées sans modification.

25voto

PoltoS Points 629
(cat <<END
$passwd
END
) | command

El cat n'est pas vraiment nécessaire, mais il aide à mieux structurer le code et vous permet d'utiliser plus de commandes entre parenthèses comme entrée à votre commande.

22voto

Jonathan Leffler Points 299946

Notez que le ' echo "$var" | command signifient que l'entrée standard est limitée à la ou les lignes renvoyées. Si vous souhaitez également que le terminal soit connecté, il vous faudra être plus fantaisiste :

{ echo "$var"; cat - ; } | command

( echo "$var"; cat -   ) | command

Cela signifie que la ou les premières lignes seront le contenu du fichier $var mais le reste viendra de cat en lisant son entrée standard. Si la commande ne fait rien de trop fantaisiste (essayez d'activer l'édition de la ligne de commande, ou exécutez comme suit vim ), alors tout ira bien. Sinon, il faut être très sophistiqué. expect ou l'un de ses dérivés est susceptible d'être approprié.

Les notations de la ligne de commande sont pratiquement identiques - mais le deuxième point-virgule est nécessaire avec les accolades alors qu'il ne l'est pas avec les parenthèses.

20voto

Kamil Maciorowski Points 260

Cette méthode robuste et portable est déjà apparue dans les commentaires. Elle devrait faire l'objet d'une réponse autonome.

printf '%s' "$var" | my_cmd

o

printf '%s\n' "$var" | my_cmd

Notes :

  • C'est mieux que echo Les raisons sont ici : Pourquoi est-ce que printf mieux que echo ?
  • printf "$var" a tort. Le premier argument est le format où diverses séquences comme %s o \n sont interprétées . Pour passer la variable à droite, elle ne doit pas être interprétée comme un format.
  • En général, les variables ne contiennent pas de nouvelles lignes à la fin. La première commande (avec %s ) transmet la variable telle quelle. Cependant, les outils qui travaillent avec du texte peuvent ignorer ou se plaindre d'une ligne incomplète (cf. Pourquoi les fichiers texte doivent-ils se terminer par un saut de ligne ? ). Il se peut donc que vous souhaitiez utiliser cette dernière commande (avec %s\n ) qui ajoute un caractère de nouvelle ligne au contenu de la variable. Faits non évidents :

    • Ici, la chaîne de caractères en Bash ( <<<"$var" my_cmd ) ajoute une nouvelle ligne.
    • Toute méthode qui ajoute un saut de ligne entraîne un stdin non vide de my_cmd même si la variable est vide ou indéfinie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X