GNU/Linux >> Tutoriales Linux >  >> Linux

Shell:escribe contenido variable en un archivo

Ninguna de las respuestas anteriores funciona si su variable:

  • comienza con -e
  • comienza con -n
  • comienza con -E
  • contiene un \ seguido de un n
  • 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"


Linux
  1. ¿Realizando operaciones de escritura atómica en un archivo en Bash?

  2. ¿Escribir todo el desplazamiento hacia atrás de Tmux en un archivo?

  3. ¿Cómo crear un archivo temporal en Shell Script?

  4. Cambiar el contenido de un archivo a través de un script de shell

  5. ¿Puede un archivo .sh ser malware?

Bash:escribir en archivo

Comando de exportación en Linux explicado

¿Qué es Subshell en Linux?

¿Escribir en un archivo .txt?

¿Qué es un archivo .sh?

Encontrar el contenido de un archivo en otro archivo