¿Qué le gustaría que hiciera en su lugar? ¿No se ejecuta rmen absoluto (1)? ¿Ejecutarlo con un *argumento literal como en otros shells tipo Bourne (2)? ¿Ejecutarlo sin ningún argumento (3)?
files=(*(N)); (($#files)) && rm -- $files. O (rm -- *) 2> /dev/nullpero eso también ocultaría errores genuinos por los rmcuales sería una tontería. Podrías descartar el zsherror pero restaurar stderr para el rmcomando aunque con(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null. Luego, como en el shque zshahora se emula para esa única línea de comando, la no coincidencia *se pasa tal cual rmy se rmqueja porque ese *archivo no existe. Suprimimos rm's stderr como lo haría en shsuprimir ese mensaje de error, pero de nuevo, que es una tontería, ya que sería ocultar errores genuinos por rmcontraposición al error incurrido por el mal comportamiento de shpasar un literal *a rm. rm -f '*'sin embargo, no se quejaría de un *archivo no existente , por lo que podría haceremulate sh -c 'rm -f -- *'
rm -- *(N). rmse queja de que cuando no se pasa ningún argumento, aunque, de nuevo, no rm -f: rm -f -- *(N).
En general, rm -fes el comando que desea usar si desea que se eliminen todos los archivos y solo obtiene un error si no se pueden eliminar los archivos o si IOW sigue ahí después de que rmhaya regresado. Por lo general, también desea usar -fen scripts para evitar que se le solicite al usuario en algunas situaciones.
Aquí, llamar rmcuando el globo no coincide está mal. El sh1 comportamiento es incorrecto. Es inofensivo para un patrón como *, pero para uno como *.[ch], pasar *.[ch]como está cuando no coincide podría hacer que el *.[ch]archivo se elimine por error:
$ ls
*.[ch] foo.txt
$ zsh -c 'rm *.[ch]'
zsh:1: no matches found: *.[ch]
$ ls
*.[ch] foo.txt
$ sh -c 'rm *.[ch]'
$ ls
foo.txt
En su defecto con un error es lo más sensato que hacer y lo que es zsh(y fish, csh,tcsh , bash -o failgloby la cáscara de Unix original) lo hace.
Y si desea cuidarse de ese caso especial, lo zshhace fácil con su (N)calificador global (para noglob ) como en el caso (1) anterior. fish(al menos en la versión reciente ) lo hace aún más fácil ya que hace un noglob implícito para el setcomando. Entonces, el equivalente allí sería:
set files *
if count $files > /dev/null
rm -f -- $files
end
Vea Por qué nullglob no es el predeterminado para más detalles.
1 . Estrictamente hablando, es solo shdesde el shell Bourne (desde Unix V7 en 1979); las versiones anteriores de sh(que llamaron /etc/globa comodines sin comillas, de donde proviene el nombre de glob ) se comportaron como csho zsh -o cshnullglob, es decir /etc/glob, abortarían el comando si ninguno de los globs coincidía (y suprimiría los globos no coincidentes si al menos uno de ellos tenía alguna coincidencia). El comportamiento fue roto por el shell Bourne.