Come leggere i file dash


15

Come posso leggere un file dash dal terminale diverso da delimitarlo con ./

Ad esempio, per leggere un - filepossiamo leggerlo da

cat ./-file_name

D: Esiste un modo alternativo per ottenere la stessa cosa?


4
il modo consigliato è effettivamente usare il ./prefisso. È il più portatile (vedi le FAQ Unix dell'era usenet)
Olivier Dulac

find . -name "-filename" | xargs catinvierà ./-filename attraverso la pipe. Per il tuo caso (semplificato?) Un errore, ma potrebbe essere utile in directory / script di grandi dimensioni.
Walter A

Risposte:


11

Per i comandi che ottengono input da stdin, è possibile utilizzare il reindirizzamento:

cat <-file_name

ya questo funziona :) è così ho 3 modi per leggerli uno usando ./ altro usando - e un altro usando <, altri modi per fare la stessa cosa ??
vidhan,

22

Usa doppio --per contrassegnare la fine delle opzioni:

cat -- -<FILENAME>

Altri programmi come touch, rmo git checkoutanche seguire questa convenzione:

$ 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

ATTENZIONE: è buona norma utilizzare sempre --dopo rmnegli script. Un utente malintenzionato può posizionare il --rffile in una directory e rm *utilizzarlo come parametro di esecuzione. Guarda questo:

$ 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

Oops, non intendevamo questo, non volevamo rimuovere le directory. Avremmo dovuto usare --:

$ 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
Non puoi contare su ogni implementazione del programma --: molti lo fanno ma non tutti.
Glenn Jackman,

2
Veramente? Non ho detto che tutti i programmi implementano --, ho detto che ne hanno mostrati alcuni.
Arkadiusz Drabczyk,

1
@vidhan: non sono a conoscenza di altre opzioni.
Arkadiusz Drabczyk

1
@vidhan puoi anche complicarti la vita senza motivo e fare qualcosa di simile, find . -name '-file_name' -exec cat {} \;ma in realtà non ha molto senso.
Terdon

2
Questo non funziona se il file è denominato -e nient'altro? Questo è venuto fuori nel wargame: overthewire.org/wargames/bandit/bandit2.html
ThisClark

2

Le alternative diventano strane:

dd if=-x 2>/dev/null
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.