Ninguna de las respuestas anteriores funciona si su variable:
- comienza con
-e
- comienza con
-n
- comienza con
-E
- contiene un
\
seguido de unn
- no debe tener una nueva línea extra añadida después
por lo que no se puede confiar en ellos para contenidos de cadenas arbitrarios.
En bash, puede usar "aquí cadenas" como:
cat <<< "$var" > "$destdir"
Como se indica en el comentario de Ash a continuación, la respuesta de @Trebawa (formulada en la misma habitación que la mía) usando printf
es un mejor enfoque que cat
.
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:los caracteres especiales cuando el shell expande la variable. Simplemente no hagas eso (expansión variable) en primer lugar. Use 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 una expansión en la línea de comando, ya que el rastreo/el eco del comando de los comandos del shell podría revelar el secreto. Significa, todas las respuestas que usan $var
en la línea de comando puede tener un riesgo potencial de seguridad al exponer el contenido variable al rastreo y registro del shell.
Para las variables que ya están exportadas, use esto:
printenv var >file
Eso significa, en caso de la pregunta OP:
printenv var >"$destfile"
Nota:los nombres de las variables distinguen entre mayúsculas y minúsculas.
Advertencia:no es una buena idea exportar una variable solo por imprimirla con printenv. Si tiene una variable de secuencia de comandos no exportada que contiene un secreto, exportarla la expondrá a todos los procesos secundarios futuros (a menos que no se exporte, por ejemplo, usando export -n
).
Usa el echo
comando:
var="text to append";
destdir=/some/directory/path/filename
if [ -f "$destdir" ]
then
echo "$var" > "$destdir"
fi
El if
prueba que $destdir
representa un archivo.
El >
agrega el texto después de truncar el archivo. Si solo desea agregar el texto en $var
al contenido existente del archivo, luego use >>
en cambio:
echo "$var" >> "$destdir"
El cp
El comando se usa para copiar archivos (a archivos), no para escribir texto en un archivo.
echo
tiene el problema de que si var
contiene algo como -e
, se interpretará como una bandera. Otra opción es printf
, pero printf "$var" > "$destdir"
expandirá cualquier carácter escapado en la variable, por lo que si la variable contiene barras invertidas, el contenido del archivo no coincidirá. Sin embargo, debido a que printf
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"