Dado que zsh
puede bloquear todos los archivos con el comando:
>*
Estoy pensando que establecer la opción noclobber
sería una buena idea.
Siempre puedo usar >| file
si quiero usar el comportamiento de clobber predeterminado en bash y zsh. (zsh también permite la sintaxis alternativa >!file
).
Supongo que no noclobber
está configurado por defecto debido a la compatibilidad POSIX, pero solo para estar seguro:
¿Hay alguna desventaja en la configuración noclobber
?
¿Hay alguna forma de establecer noclobber
solo para el shell interactivo?
rm *
...Respuestas:
La razón por la
noclobber
que no se establece por defecto es la tradición. Como cuestión de diseño de interfaz de usuario, es una buena idea hacer que "crear este nuevo archivo" sea una acción fácil y poner un obstáculo adicional a la acción más peligrosa "ya sea crear un nuevo archivo o sobrescribir un archivo existente". Pornoclobber
lo tanto, es una buena idea (>
crear un nuevo archivo,>|
potencialmente sobrescribir un archivo existente) y probablemente habría sido el valor predeterminado si el shell se hubiera diseñado unas décadas más tarde.Recomiendo usar lo siguiente en su archivo de inicio de shell interactivo (
.bashrc
o.zshrc
):En cada caso (redirección, copia, movimiento), el objetivo es agregar un obstáculo adicional cuando la operación puede tener el efecto secundario de borrar algunos datos existentes, a pesar de que borrar los datos existentes no es el objetivo principal de la operación. No pongo
rm -i
en esta lista porque el objetivo principal es borrar datosrm
.Tenga en cuenta que
noclobber
y-i
son redes de seguridad . Si se disparan, has hecho algo mal . ¡Así que no los use como excusa para no verificar lo que está sobrescribiendo! El punto es que deberías haber verificado que el archivo de salida no existe. Si le dicenfile exists: foo
ooverwrite 'foo'?
, significa que cometió un error y debe sentirse mal y tener más cuidado. En particular, no tenga el hábito de deciry
si se le pide que sobrescriba (podría decirse que los alias deberían serloalias cp='yes n | cp -i' mv='yes n | mv -i'
, pero presionar Ctrl+ Chace que la salida se vea mejor): si quiso sobrescribir, cancele el comando, mueva o elimine la salida archivo y ejecute el comando nuevamente.También es importante no acostumbrarse a activar esos dispositivos de seguridad porque si lo hace, algún día estará en una máquina que no tiene su configuración, y perderá datos porque las protecciones con las que contaba no son t allí.
noclobber
solo se configurará para shells interactivos, ya que.bashrc
o.zshrc
solo se leerá con shells interactivos. Por supuesto, no debe cambiar las opciones de shell de una manera que afecte los scripts, ya que podría romper esos scripts.fuente
rm
tiene una opción-I
que uso y recomiendo: "preguntar una vez antes de eliminar más de tres archivos, o al eliminar de forma recursiva; menos intrusivo que-i
, a la vez que brinda protección contra la mayoría de los errores"-i
como argumento predeterminado es una excelente idea, pero debe aplicarse con diferentes nombres de alias , no con los originales (por ejemplo, siempre pongoalias copy="cp -i"
yalias move="mv -i"
en mi .bashrc). ¿Por qué? Debido al modo de falla. ¿Qué sucede cuando usa una máquina o un usuario diferente que no tiene los alias cp / mv? Archivos potencialmente sobrescritos involuntariamente (¡posiblemente no detectados!). Modo de falla correspondiente con alias de copiar / mover: shell se queja de que no reconoce el comando.-i
argumento para cp y mv es excelente, pero el consejo de reutilizar los nombres de cp y mv es terriblemente malo. Es tan malo que tengo que dar un voto negativo a la respuesta. Cambie para usar diferentes nombres de alias y le daré un voto positivo.alias RM='command rm'
, lo que le indicaría a zsh que use el comando externo enrm
lugar del alias. De esa manera no tienes que confiar en--interactive=never
reemplazar a un anterior-i
.Establecer la
noclobber
opción de shell en~/.bashrc
(parabash
) o~/.zshrc
(o más precisamente$ZDOTDIR/.zshrc
, parazsh
) la activará en sesiones de shell interactivas.Los shells no interactivos (scripts) no leen estos archivos.
Las opciones de shell normalmente no se heredan de los shells principales.
Esto significa que debería poder establecer la opción en esos archivos sin modificar el comportamiento en los scripts existentes, a menos que los scripts exploten esos archivos.
El único inconveniente de hacer esto que puedo ver es que olvidará repetidamente que ha configurado la opción, al menos al principio. Más tarde, al igual que con todo este tipo de cosas, usted comenzará a uso habitual
>|
, incluso en los casos en los que en realidad podría no querer darle una paliza el archivo (al igual que las personas con alias pararm
,cp
ymv
con la-i
opción siempre se establece, con el tiempo comenzará a siempre uso-f
en la línea de comando).fuente
bash
, las opciones se heredan si$SHELLOPTS
($BASHOPTS
para las queshopt
están) en el entorno (no es algo que generalmente desearía hacer por este tipo de razón).La desventaja es que, si se acostumbran a tener
noclobber
activa, que un día se utiliza un sistema en el que se no se activa y se le alegremente ejecutar un comando potencialmente peligrosa, esperando lonoclobber
que te salve ... y no lo hará. Y luego tendrá que esperar que haya una copia de seguridad lo suficientemente reciente como para recuperar los datos que destruyó porque asumió que primero se le pediría una confirmación.fuente