Je voudrais copier le contenu d'une variable (appelée ici var
) dans un fichier.
Le nom du fichier est stocké dans une autre variable destfile
.
J'ai des problèmes à faire ça. 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 cela $var
faisait référence à un répertoire et m'a donc dit que le répertoire était introuvable.
Comment puis-je contourner cela?
$var
Spécifie- t-il un nom de fichier ou du texte à écrire dans un fichier? S'il spécifie du texte, quel est le nom du fichier dans lequel vous souhaitez écrire ce contenu?$destdir
-être devrait être nommé$destfile
pour que ce ne soit pas trompeur ... Le nom$destdir
suggère qu'il spécifie un répertoire plutôt qu'un fichier. Cela rendrait toute votre question simple et facile à comprendre.Réponses:
Utilisez la
echo
commande:Les
if
tests qui$destdir
représentent un fichier.Le
>
ajoute le texte après avoir tronqué le fichier. Si vous souhaitez uniquement ajouter le texte au$var
contenu existant du fichier, utilisez à la>>
place:le
cp
commande est utilisée pour copier des fichiers (dans des fichiers), pas pour écrire du texte dans un fichier.la source
]
in"$destdir"]
.echo
ajoute également une nouvelle ligne de fin à votre variable.$var
c'est le cas-e text to append
et n'écrit pas réellement le-e
echo $var
s'appuyer sur le shell pour développer votre variable, cela ne fonctionne pas très bien avec des choses comme les espaces blancs et les caractères spéciaux. Vous pouvez utiliser à laperl -e 'print($ENV{var})'
place, et il affichera précisément la valeur de la variable.echo
a le problème que sivar
contient quelque chose comme-e
, il sera interprété comme un drapeau. Une autre option estprintf
, maisprintf "$var" > "$destdir"
développera tous les caractères d'échappement dans la variable, donc si la variable contient des barres obliques inverses, le contenu du fichier ne correspondra pas. Cependant, commeprintf
n'interprète que les contre-obliques 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"
la source
echo "$var" > destfile
mal.printf
c'est mieux, passez à autre chose.Aucune des réponses ci-dessus ne fonctionne si votre variable:
-e
-n
-E
\
suivi d'unn
et ainsi ils ne peuvent pas être invoqués pour le contenu de chaîne arbitraire.
Dans bash, vous pouvez utiliser "here strings" comme:
Comme indiqué dans le commentaire ci-dessous, l' utilisation de la réponse de @ Trebawa (formulée dans la même pièce que la mienne!)
printf
Est une meilleure approche.la source
printf
overcat
est que le premier est un shell intégré qui s'exécutera toujours plus rapidement qu'un binaire externe.Si je vous ai bien compris, vous souhaitez copier
$var
dans un fichier (si c'est une chaîne).la source
cp
commande obligera le shell à interpréter le premier argument comme le nom d'un fichier ou d'un répertoire.$var
guillemets, le contenu du fichier n'est pas à 100% égal au contenu de $ var dans certains cas. Par exemple, lorsque vous "faites écho" des variables contenant des clés RSA, vous obtenez une clé non valide dans le fichier.$var
contient des espaces ou-e
Lorsque vous dites «copier le contenu d'une variable», cette variable contient-elle un nom de fichier ou contient-elle le nom d'un fichier?
Je suppose par votre question que
$var
contient le contenu que vous souhaitez copier dans le fichier:Cela fera écho à la valeur de $ var dans un fichier appelé $ destdir. Notez les citations. Très important d'avoir "$ var" entre guillemets. Aussi pour "$ destdir" s'il y a un espace dans le nom. Pour l'ajouter:
la source
var
contient-e
echo
terminer sa liste d'options, résout ainsi le problème soulevé par @Eric:echo -- "$var" >> "$destfile"
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 développement.
De plus, si votre variable contient un secret et que vous souhaitez copier ce secret dans un fichier, vous voudrez peut-être ne pas avoir d'extension 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 peuvent présenter un risque de sécurité potentiel en exposant le contenu de la variable au traçage et à la journalisation du shell.Utilisez ceci:
Cela signifie, en cas de question OP:
la source