Use doble --
para marcar el final de las opciones:
cat -- -<FILENAME>
Otros programas como touch
, rm
o git checkout
también siguen esta convención:
$ touch -- -file
$ ll
total 0
-rw-r--r-- 1 ja ja 0 Mar 10 13:13 -file
$ echo hi! >> -file
$ cat -- -file
hi!
$ rm -- -file
$ echo $?
0
ADVERTENCIA: es una buena práctica usar siempre --
después rm
en scripts. Un atacante podría colocar el --rf
archivo en un directorio y rm *
tomarlo como parámetros de ejecución. Mira esto:
$ touch A
$ touch B
$ mkdir dir
$ touch dir/C
$ touch -- -rf
$ rm *
$ ll
total 0
-rw-r--r-- 1 ja ja 0 Mar 10 13:21 -rf
Vaya, esto no es lo que queríamos decir, no queríamos eliminar directorios. Deberíamos haber usado --
:
$ touch A
$ touch B
$ mkdir dir
$ touch dir/C
$ touch -- -rf
$ rm -- *
rm: cannot remove `dir': Is a directory
$ ll
total 4.0K
drwxr-xr-x 2 ja ja 4.0K Mar 10 13:22 dir
./
prefijo. Es el más portátil (consulte las preguntas frecuentes sobre Unix de la era de Usenet)