Como ler arquivos de traço

12

Como posso ler um arquivo de traço do terminal diferente de delimitá-lo com ./

Por exemplo, para ler um - file , podemos lê-lo por

cat ./-file_name

Q: Existe uma maneira alternativa de alcançar a mesma coisa?

    
por vidhan 10.03.2015 / 13:13

3 respostas

8

Para comandos que recebem entrada de stdin, você pode usar o redirecionamento:

cat <-file_name
    
por 10.03.2015 / 15:59
18

Use o valor duplo -- para marcar o final das opções:

cat -- -<FILENAME>

Outros programas, como touch , rm ou git checkout , também seguem essa convenção:

$ 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

AVISO: é sempre bom usar -- após rm nos scripts. Um invasor pode colocar o arquivo --rf em um diretório e rm * o aceitaria como parâmetros de execução. Veja isto:

$ 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

Opa, isso não é verdade, não queremos remover diretórios. Deveríamos ter 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
    
por 10.03.2015 / 13:15
2

Alternativas tornam-se esquisitas:

dd if=-x 2>/dev/null
    
por 10.03.2015 / 22:49

Tags