142 votes

Shell - Écriture du contenu des variables dans un fichier

Je voudrais copier le contenu d'une variable (ici appelée var ) dans un fichier.

Le nom du fichier est stocké dans une autre variable destfile .

J'ai des difficultés à le faire. Voici ce que j'ai essayé :

cp $var $destfile

J'ai aussi essayé la même chose avec la commande dd... De toute évidence, le shell a pensé que $var faisait référence à un répertoire et m'a donc dit que le répertoire ne pouvait pas être trouvé.

Comment puis-je contourner ce problème ?

191voto

pb2q Points 28514

Utilisez le echo commandement :

var="text to append";
destdir=/some/directory/path/filename

if [ -f "$destdir" ]
then 
    echo "$var" > "$destdir"
fi

El if des tests qui $destdir représente un fichier.

El > ajoute le texte après avoir tronqué le fichier. Si vous voulez seulement ajouter le texte dans $var au contenu existant du fichier, puis utilisez >> à la place :

echo "$var" >> "$destdir"

El cp est utilisée pour copier des fichiers (vers des fichiers), et non pour écrire du texte dans un fichier.

71voto

Trebawa Points 781

echo a le problème que si var contient quelque chose comme -e il sera interprété comme un drapeau. Une autre option est printf mais printf "$var" > "$destdir" développera tous les caractères échappés dans la variable, donc si la variable contient des antislashs, le contenu du fichier ne correspondra pas. Cependant, parce que printf interprète uniquement les barres obliques inversées comme des échappatoires dans la chaîne de format, vous pouvez utiliser la fonction %s pour stocker le contenu exact de la variable dans le fichier de destination :

printf "%s" "$var" > "$destdir"

49voto

Eric Points 36290

Aucune des réponses ci-dessus ne fonctionne si votre variable :

  • commence par -e
  • commence par -n
  • commence par -E
  • contient un \ suivi d'un n
  • ne doit pas être suivi d'une nouvelle ligne supplémentaire.

et on ne peut donc pas s'y fier pour des contenus de chaînes arbitraires.

En bash, vous pouvez utiliser "here strings" comme :

cat <<< "$var" > "$destdir"

Comme indiqué dans le commentaire de Ash ci-dessous, La réponse de @Trebawa (formulé dans la même pièce que le mien !) en utilisant printf est une meilleure approche que cat .

16voto

Christian Hujer Points 31

Toutes les solutions ci-dessus fonctionnent, mais elles doivent également contourner un problème (échappatoires et caractères spéciaux) qui n'a pas besoin de se produire en premier lieu : Les caractères spéciaux lorsque la variable est développée par le shell. Il suffit de ne pas faire ça (expansion de variable) en premier lieu. Utilisez la variable directement, sans expansion.

De plus, si votre variable contient un secret et que vous voulez copier ce secret dans un fichier, il est préférable de ne pas avoir d'expansion dans la ligne de commande car le traçage/écho des commandes shell pourrait révéler le secret. Moyens, toutes les réponses qui utilisent $var dans la ligne de commande peut présenter un risque potentiel pour la sécurité en exposant le contenu des variables au traçage et à la journalisation de l'interpréteur de commandes.

Pour les variables qui sont déjà exportées, utilisez ceci :

printenv var >file

Cela signifie, dans le cas de la question du PO :

printenv var >"$destfile"

Remarque : les noms de variables sont sensibles à la casse.

Avertissement : Ce n'est pas une bonne idée d'exporter une variable juste pour pouvoir l'imprimer avec printenv. Si vous avez une variable script non exportée qui contient un secret, l'exporter l'exposera à tous les futurs processus enfants (à moins qu'elle ne soit non exportée, par exemple en utilisant la commande export -n ).

8voto

wabepper Points 1877

Si je vous ai bien compris, vous voulez copier $var dans un fichier (si c'est une chaîne).

echo $var > $destdir

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