Cómo leer archivos de guiones


15

¿Cómo puedo leer un archivo de guión desde el terminal que no sea delimitarlo con ./

Por ejemplo, para leer un - filepodemos leerlo por

cat ./-file_name

P: ¿Hay alguna forma alternativa de lograr lo mismo?


44
la forma recomendada es usar ./prefijo. Es el más portátil (consulte las preguntas frecuentes sobre Unix de la era de Usenet)
Olivier Dulac

find . -name "-filename" | xargs catenviará ./-filename a través de la tubería. Para su caso (¿simplificado?) Un error, pero podría ayudar en directorios / scripts grandes.
Walter A

Respuestas:


11

Para los comandos que obtienen información de stdin, puede usar la redirección:

cat <-file_name

ya que este funciona :) es así que obtuve 3 formas de leerlos uno usando ./ otro usando - y otro usando <, ¿hay más formas de hacer lo mismo?
vidhan

22

Use doble --para marcar el final de las opciones:

cat -- -<FILENAME>

Otros programas como touch, rmo git checkouttambié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 rmen scripts. Un atacante podría colocar el --rfarchivo 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

3
No puede contar con la implementación de todos los programas --: muchos lo hacen pero no todos.
Glenn Jackman

2
De Verdad? No dije que todos los programas se implementan --, dije que mostraban algunos que sí.
Arkadiusz Drabczyk

1
@vidhan: no conozco ninguna otra opción.
Arkadiusz Drabczyk

1
@vidhan también puedes complicarte la vida sin razón y hacer algo así, find . -name '-file_name' -exec cat {} \;pero realmente no tiene mucho sentido.
terdon

2
¿Esto no funciona si se nombra el archivo -y nada más? Esto surgió en el juego de guerra: overthewire.org/wargames/bandit/bandit2.html
ThisClark

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.