Como ler arquivos de traço

15

Como posso ler um arquivo de traço do terminal, além de delimitá-lo com ./

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

cat ./-file_name

P: Existe uma maneira alternativa de conseguir a mesma coisa?

vidhan
fonte
4
a maneira recomendada é realmente usar o ./prefixo. É o mais portátil (cf da época usenet Unix FAQ)
Olivier Dulac
find . -name "-filename" | xargs catenviará ./-filename através do canal. Para o seu caso (simplificado?), Um erro, mas pode ajudar em grandes diretórios / scripts.
Walter A

Respostas:

11

Para comandos que obtêm entrada do stdin, você pode usar o redirecionamento:

cat <-file_name
cuonglm
fonte
ya este funciona :) é assim que eu tenho 3 maneiras de lê-los um usando ./ outro usando - e outro usando <, mais maneiras de fazer a mesma coisa?
Vidhan
22

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

cat -- -<FILENAME>

Outros programas como touch, rmou git checkouttambém seguem esta 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: É uma boa prática sempre usar --depois rmnos scripts. Um invasor pode colocar o --rfarquivo em um diretório e rm *considerá-lo como parâmetros de execução. Veja isso:

$ 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 é o que queremos dizer, 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
Arkadiusz Drabczyk
fonte
3
Você não pode contar com a implementação de todos os programas --: muitos fazem, mas não todos.
precisa
2
Verdade? Eu não disse que todos os programas implementam --, eu disse que mostra alguns que o fazem.
precisa saber é o seguinte
1
@vidhan: não conheço nenhuma outra opção.
Arkadiusz Drabczyk 10/03
1
@vidhan, você também pode complicar sua vida sem motivo e fazer algo assim, find . -name '-file_name' -exec cat {} \;mas realmente não há muito sentido nisso.
terdon
2
Isso não funciona se o arquivo for nomeado -e nada mais? Isso veio à tona no jogo de guerra: overthewire.org/wargames/bandit/bandit2.html
ThisClark
2

As alternativas se tornam estranhas:

dd if=-x 2>/dev/null
Walter A
fonte