So lesen Sie Dash-Dateien

15

Wie kann ich eine Bindestrichdatei vom Terminal aus lesen, ohne sie mit zu begrenzen? ./

Zum Beispiel, um ein zu lesen - file, können wir es durch lesen

cat ./-file_name

F: Gibt es eine alternative Möglichkeit, dasselbe zu erreichen?

vidhan
quelle
4
Der empfohlene Weg ist eigentlich, ./Präfix zu verwenden . Es ist das portabelste (vgl. Die Unix-FAQ der Usenet-Ära)
Olivier Dulac
find . -name "-filename" | xargs catwird ./-Dateiname durch die Pipe senden. Für Ihren (vereinfachten?) Fall ein Fehler, aber es könnte in großen Verzeichnissen / Skripten helfen.
Walter A

Antworten:

11

Für Befehle, die von stdin eingegeben werden, können Sie die Umleitung verwenden:

cat <-file_name
cuonglm
quelle
ya dieses funktioniert :) ist also ich habe 3 Möglichkeiten, sie zu lesen, indem ich ./ anderes benutze - und ein anderes, indem ich <benutze, irgendwelche weiteren Möglichkeiten, um dasselbe zu tun ??
Vidhan
22

Verwenden Sie double --, um das Ende der Optionen zu markieren:

cat -- -<FILENAME>

Andere Programme wie touch, rmoder git checkoutfolgen auch dieser Konvention:

$ 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

WARNUNG: Es wird empfohlen, in Skripten immer --after rmzu verwenden. Ein Angreifer könnte eine --rfDatei in einem Verzeichnis rm *ablegen und als Ausführungsparameter verwenden. Sieh dir das an:

$ 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

Ups, das ist nicht gemeint, wir wollten keine Verzeichnisse entfernen. Wir hätten verwenden sollen --:

$ 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
quelle
3
Man kann sich nicht auf jede Programmimplementierung verlassen --: Viele tun es, aber nicht alle.
Glenn Jackman
2
"Ja wirklich?" Ich habe nicht gesagt, dass alle Programme implementiert werden --, ich habe gesagt, dass einige das tun.
Arkadiusz Drabczyk
1
@vidhan: Mir ist keine andere Option bekannt.
Arkadiusz Drabczyk
1
@vidhan Sie können Ihr Leben auch ohne Grund komplizieren und so etwas tun, find . -name '-file_name' -exec cat {} \;aber es gibt wirklich nicht viel Sinn.
terdon
2
Dies funktioniert nicht, wenn die Datei benannt ist -und sonst nichts? Dies ist im Wargame aufgetaucht
ThisClark
2

Alternativen werden komisch:

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