Jak czytać pliki myślników

15

Jak mogę odczytać plik myślnika z terminala inny niż jego oddzielanie? ./

Na przykład, aby przeczytać, - filemożemy to przeczytać

cat ./-file_name

P: Czy istnieje alternatywny sposób na osiągnięcie tego samego?

vidhan
źródło
4
zalecanym sposobem jest użycie ./prefiksu. Jest najbardziej przenośny (por. Często zadawane pytania dotyczące uniksowej ery usenetu)
Olivier Dulac,
find . -name "-filename" | xargs catwyśle ​​./- nazwa pliku przez potok. W twoim przypadku (uproszczonym?) Pomyłka, ale może to pomóc w dużych katalogach / skryptach.
Walter A

Odpowiedzi:

11

W przypadku poleceń otrzymujących dane wejściowe ze standardowego wejścia można użyć przekierowania:

cat <-file_name
Cuonglm
źródło
tak, ten działa :) jest więc mam 3 sposoby, aby je odczytać za pomocą ./ innych za pomocą - i innego za pomocą <, jeszcze więcej sposobów na zrobienie tego samego ??
vidhan
22

Użyj podwójnie, --aby zaznaczyć koniec opcji:

cat -- -<FILENAME>

Inne programy, takie jak te touch, rmlub git checkoutteż przestrzegają tej konwencji:

$ 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

UWAGA: Jest to dobra praktyka, aby zawsze używać --po rmw skryptach. Osoba atakująca może umieścić --rfplik w katalogu i rm *potraktować go jako parametry uruchamiania. Zobacz:

$ 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, nie o to nam chodziło, nie chcieliśmy usuwać katalogów. Powinniśmy użyć --:

$ 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
źródło
3
Nie możesz liczyć na wdrożenie każdego programu --: wiele z nich robi, ale nie wszystkie.
glenn jackman
2
Naprawdę? Nie powiedziałem, że wszystkie programy się wdrażają --, powiedziałem, że pokazałem, że to robią.
Arkadiusz Drabczyk
1
@vidhan: nie znam żadnej innej opcji.
Arkadiusz Drabczyk
1
@vidhan możesz również skomplikować swoje życie bez powodu i zrobić coś takiego, find . -name '-file_name' -exec cat {} \;ale tak naprawdę nie ma to większego sensu.
terdon
2
To nie działa, jeśli plik ma nazwę -i nic więcej? To pojawiło się w grze: overthewire.org/wargames/bandit/bandit2.html
ThisClark
2

Alternatywy stają się dziwne:

dd if=-x 2>/dev/null
Walter A.
źródło