GNU/Linux >> Tutoriels Linux >  >> Linux

Shell - Écrire le contenu d'une variable dans un fichier

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 devrait pas avoir de saut de ligne supplémentaire ajouté après

et donc ils ne peuvent pas être invoqués pour un contenu de chaîne arbitraire.

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ée dans la même pièce que la mienne !) en utilisant printf est une meilleure approche que cat .


Tout ce qui précède fonctionne, mais doit également contourner un problème (échappements 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. Ne faites pas cela (expansion variable) en premier lieu. Utilisez la variable directement, sans expansion.

De plus, si votre variable contient un secret et que vous souhaitez copier ce secret dans un fichier, vous souhaiterez peut-être ne pas avoir d'expansion dans la ligne de commande car le traçage/écho de commande des commandes shell pourrait révéler le secret. Signifie, toutes les réponses qui utilisent $var dans la ligne de commande peut présenter un risque de sécurité potentiel en exposant le contenu de la variable au traçage et à la journalisation du shell.

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

printenv var >file

Cela signifie, en cas de question OP :

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 l'imprimer avec printenv. Si vous avez une variable de script non exportée qui contient un secret, l'exporter l'exposera à tous les futurs processus enfants (sauf s'il n'est pas exporté, par exemple en utilisant export -n ).


Utilisez le echo commande :

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

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

Le if teste que $destdir représente un fichier.

Le > ajoute le texte après avoir tronqué le fichier. Si vous souhaitez uniquement ajouter le texte en $var au contenu existant du fichier, puis utilisez >> à la place :

echo "$var" >> "$destdir"

Le cp La commande est utilisée pour copier des fichiers (dans des fichiers), pas pour écrire du texte dans un fichier.


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 barres obliques inverses, le contenu du fichier ne correspondra pas. Cependant, parce que printf interprète uniquement les barres obliques inverses comme des échappements dans la chaîne de format, vous pouvez utiliser le %s spécificateur de format pour stocker le contenu exact de la variable dans le fichier de destination :

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


Linux
  1. Effectuer des opérations d'écriture atomique dans un fichier dans Bash ?

  2. Comment écrire un fichier dans un autre ?

  3. Recherche du contenu d'un fichier dans un autre fichier

  4. Un fichier .sh peut-il être un malware ?

  5. Inverser le contenu d'une variable par des mots

Bash :Écrire dans un fichier

Comment créer un fichier temporaire en script shell ?

Explication de la commande d'exportation sous Linux

Qu'est-ce que le sous-shell sous Linux ?

Copier et écraser un fichier dans un script shell

Qu'est-ce qu'un fichier .sh ?