Para comandos que recebem entrada de stdin, você pode usar o redirecionamento:
cat <-file_name
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?
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
Alternativas tornam-se esquisitas:
dd if=-x 2>/dev/null