Recientemente estoy haciendo eco de frases cortas a un tree_hole
archivo.
Estaba usando echo 'something' >> tree_hole
para hacer este trabajo.
Pero siempre me preocupó qué pasaría si ingresaba mal en >
lugar de hacerlo >>
, ya que lo hacía a menudo.
Así que hice una función de bash global propia en bashrc:
function th { echo "$1" >> /Users/zen1/zen/pythonstudy/tree_hole; }
export -f th
Pero me pregunto si hay otra forma simple de agregar líneas al final de un archivo. Porque es posible que necesite usar eso a menudo en otras ocasiones.
¿Hay alguna?
rm="rm -i"
y en otro entorno escribírm *
esperando las preguntas de confirmación. ¡Estás aprendiendo hábitos peligrosos!Respuestas:
Establezca la
noclobber
opción del shell :fuente
>|
.zsh
habilita este comportamiento por defecto.setopt noclobber
ysetopt clobber
. Parece que no es exactamente "predeterminado", depende de los archivos de configuración que se envían con su distribución.set [+-]C
para cualquier shell modernoset +o noclobber
en bash, oset +C
.Si le preocupa su archivo será dañada por el
>
operador puede cambiar su atributo de archivo de sólo-añadir:En ext2 / ext3 / ext4 sistema de archivos:
chattr +a file.txt
En XFS sistema de archivos:
echo chattr +a | xfs_io file.txt
Y si desea una función, ya hice una función para mí (la usé en el archivo de servicio para registrar salidas), puede cambiarla para su propósito:
fuente
$
) para evitar el engorde, la división de palabras y los problemas de espacios en blanco relacionados. La aplicación ShellCheck en línea puede detectar este y otros problemas en los scripts de bash. En una nota relacionada"$@"
es mucho más seguro que$*
.read
comando con la-r
opción de evitar que las barras invertidas en la entrada escapen del siguiente carácter. 3) Es habitual en los scripts de bash utilizar minúsculas para los nombres de variables de script, ya que ALL MAYÚSCULAS se usa para las variables del sistema. Entonces, si usa mayúsculas para sus propias variables, confundirá a las personas que leen su código, y puede accidentalmente golpear una variable del sistema que desea usar más adelante en el script. Y si obtiene el script, bloqueará las variables para los comandos posteriores.echo
es útil para imprimir cadenas fijas, pero puede hacer cosas inesperadas con datos arbitrarios, especialmente en sistemas GNU. Es mucho más seguro de usarprintf
. Consulte unix.stackexchange.com/questions/65803/… para obtener más información, especialmente la respuesta de Stéphane Chazelas.Usar
tee
con la opción de agregar:fuente
>
personaje, ¡entonces podrían estar preocupados por olvidar la-a
opción!muchos programas que pueden abrir archivos para sobrescribirlos pueden abrirlos para agregarlos, por ejemplo, gnu dd.
puede leer stdin o un archivo nombrado en el
if=
parámetro add2>/dev/null
para suprimir el recuento de bytes.fuente
dd
es una mala idea.dd
no escribe de manera confiable su entrada en su salida , no cuando uno de ellos no es un archivo normal o un dispositivo de bloqueMe gustaría usar un
sed
(incluso con copia de seguridad - ver extensión después-i
):fuente
Siempre puede buscar a través del archivo de otras maneras ...
... esa secuencia de aspecto extraño se imprime:
Pero eso es un poco tonto.
Un ejemplo más útil podría ser:
Puedes llamarlo así:
Y terminaría con un recuento de
file
líneas escritasstderr
justo antes de que tenga lugar la acción de agregar.fuente