Me gustaría copiar el contenido de una variable (aquí llamada var
) en un archivo.
El nombre del archivo se almacena en otra variable destfile
.
Tengo problemas para hacer esto. Esto es lo que probé:
cp $var $destfile
También intenté lo mismo con el comando dd ... Obviamente, el shell pensó que $var
se refería a un directorio y me dijo que no se podía encontrar el directorio.
¿Cómo puedo solucionar esto?
$var
Especifica un nombre de archivo o algún texto que debe escribirse en un archivo? Si especifica texto, ¿cuál es el nombre del archivo en el que le gustaría escribir este contenido?$destdir
debería nombrarse$destfile
para que no sea engañoso ... El nombre$destdir
sugiere que especifica un directorio en lugar de un archivo. Esto haría que toda su pregunta fuera sencilla y fácil de entender.Respuestas:
Usa el
echo
comando:Las
if
pruebas que$destdir
representa un archivo.El
>
anexa el texto después de truncar el archivo. Si solo desea agregar el texto$var
al contenido existente del archivo, utilice>>
en su lugar:El
cp
comando se usa para copiar archivos (a archivos), no para escribir texto en un archivo.fuente
]
de"$destdir"]
.echo
también agrega una nueva línea final a su variable.$var
es-e text to append
, y en realidad no escribe el-e
echo $var
que depende del shell para expandir su variable, no funciona muy bien con cosas como espacios en blanco y caracteres especiales. Puede usarperl -e 'print($ENV{var})'
en su lugar, y generará precisamente el valor de la variable.echo
tiene el problema de que sivar
contiene algo como-e
, se interpretará como una bandera. Otra opción esprintf
, peroprintf "$var" > "$destdir"
expandirá los caracteres de escape en la variable, por lo que si la variable contiene barras invertidas, el contenido del archivo no coincidirá. Sin embargo, debido a queprintf
solo interpreta las barras invertidas como escapes en la cadena de formato, puede usar el%s
especificador de formato para almacenar el contenido exacto de la variable en el archivo de destino:printf "%s" "$var" > "$destdir"
fuente
echo "$var" > destfile
mal.printf
es mejor, sigue adelante.Ninguna de las respuestas anteriores funciona si su variable:
-e
-n
-E
\
seguido de unn
por lo que no se puede confiar en ellos para contenidos de cadenas arbitrarios.
En bash, puede usar "here strings" como:
Como se indica en el comentario a continuación, la respuesta de @ Trebawa (¡formulada en la misma habitación que la mía!) El uso
printf
es un mejor enfoque.fuente
printf
overcat
es que el primero es un shell incorporado que siempre se ejecutará más rápido que un binario externo.Si te entendí bien, querrás copiar
$var
en un archivo (si es una cadena).fuente
cp
comando hará que el shell interprete el primer argumento como el nombre de un archivo o directorio.$var
entre comillas, el contenido del archivo no es 100% igual al contenido de $ var en algunos casos. Por ejemplo, cuando "repite" vars que contienen claves RSA, obtiene una clave no válida en el archivo.$var
contiene espacios o-e
Cuando dice "copiar el contenido de una variable", ¿esa variable contiene un nombre de archivo o contiene el nombre de un archivo?
Supongo por su pregunta que
$var
contiene el contenido que desea copiar en el archivo:Esto hará eco del valor de $ var en un archivo llamado $ destdir. Tenga en cuenta las comillas. Es muy importante tener "$ var" entre comillas. También para "$ destdir" si hay un espacio en el nombre. Para adjuntarlo:
fuente
var
contiene-e
echo
terminar su lista de opciones, resuelve así el problema planteado por @Eric:echo -- "$var" >> "$destfile"
Todo lo anterior funciona, pero también tiene que solucionar un problema (escapes y caracteres especiales) que no es necesario que ocurra en primer lugar: caracteres especiales cuando el shell expande la variable. Simplemente no hagas eso (expansión variable) en primer lugar. Utilice la variable directamente, sin expansión.
Además, si su variable contiene un secreto y desea copiar ese secreto en un archivo, es posible que desee no tener expansión en la línea de comandos, ya que el rastreo / eco de comando de los comandos de shell podría revelar el secreto. Significa que todas las respuestas que se usan
$var
en la línea de comando pueden tener un riesgo potencial de seguridad al exponer el contenido variable al rastreo y registro del shell.Utilizar este:
Eso significa, en el caso de la pregunta OP:
fuente