Co oznacza myślnik „-” w „tar xzf -”?

23

Kiedy próbuję zainstalować Dropbox z wiersza poleceń, czytam polecenia

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

co to -znaczy tutaj czy to poprzedni katalog?

Algebra
źródło
9
Trochę pedanterii: pytasz o to f -. Może to nieco ułatwić znalezienie odpowiedzi na stronach podręcznika.
studog
4
Byłoby naprawdę pomocne, gdybyś mógł wyjaśnić, co dokładnie nie jest ci jasne na temat dokumentacji wgeti tar. W ten sposób odpowiedni programiści mogą ulepszyć swoją dokumentację, aby przyszli użytkownicy nie natknęli się ponownie na te same problemy. Innymi słowy: bądź bohaterem i uczyń świat lepszym miejscem!
Jörg W Mittag
2
Byłoby fajnym domyślnym rozwiązaniem dla tar, aby używał standardowego wejścia, ale ponieważ jego tradycją jest praca z taśmami, nie zrobił tego. Zamiast tego nauczył się, jak pracować z plikami (z opcją f), a następnie postępuje zgodnie z konwencją, aby mieć - zamiast nazwy pliku dla stdin (w przypadku eXtract lub stdout w przypadku tworzenia)
eckes
1
@eckes W przypadku tar GNU domyślnym jest stdin, chyba że $TAPEjest ustawione.
Chrylis -on strike-

Odpowiedzi:

42

Niektóre polecenia akceptują -zamiast nazwy pliku:

  • Pisanie na standardowe wyjście zamiast do nazwanego pliku. Do tego właśnie służy -argument przekazany wgetpo -O.
  • Czytanie ze standardowego wejścia zamiast z nazwanego pliku. Do tego -argumentu przekazano tarpóźniej xzf.

Polecenie, które pokazano, pobiera plik archiwum wgeti rozpakowuje go tar. Aby to osiągnąć, dane wyjściowe z metody potokowej ( ) wgetprzesyłane| do wejścia tar. Dlatego wgetzapisuje na standardowe wyjście zamiast pliku i tarczyta ze standardowego wejścia zamiast pliku.

Eliah Kagan
źródło
Powiedziałbym „większość poleceń”, a nie tylko „niektóre polecenia”. Uważam, że jest to część specyfikacji składni opcji POSIX.
Barmar
2
@Barmar Tak i nie: Wytyczna 13: W przypadku narzędzi, które używają operandów do reprezentowania plików, które mają zostać otwarte do odczytu lub zapisu, operand „-” powinien oznaczać tylko standardowe wejście (lub standardowe wyjście, gdy jest to jasne z kontekstu, że plik wyjściowy jest określony) lub plik o nazwie -. . Więc jeśli - to argumentu o „opcji plików” i to ma szczególne znaczenie, wówczas musi być tak, że z stdin / stdout. Program nie może traktować jako specjalnego przypadku i po prostu szukać pliku-
Bakuriu
(i zazwyczaj w tych przypadkach pominięcie opcji będzie takie samo, jak użycie -)
Bakuriu
@ Bakuriu Nie rozumiem, jak to obala to, co powiedziałem. Podejrzewam, że większość poleceń przyjmuje argumenty nazw plików, więc powinny postępować zgodnie z tą wytyczną. Ale może powinienem był zakwalifikować go jako „większość poleceń działających na plikach”.
Barmar
1
@Barmar jedną stronę do podążania za wytyczną jest spadek traktować -specjalnie w ogóle, traktując go jako literalnej pliku. Jedynym sposobem na złamanie wytycznych jest potraktowanie ich w sposób -szczególny, ale o innym znaczeniu niż sugerowane w wytycznych.
Eliah Kagan
12

To tylko nazwa pliku, którą wiele programów uniksowych interpretuje jako „zamiast faktycznie otwierać plik, czytać z stdin(lub pisać do stdout)”.

Oznacza to odczyt z danych wejściowych przesyłanych strumieniowo do programu; w twoim przypadku jest to wynik działania wget.

Marcus Müller
źródło
6
Czy to naprawdę nazwa pliku ?
Eric Duminil
7
@EricDuminil Jest to nazwa pliku w tym sensie, że programy akceptują ją w niektórych miejscach, w których inaczej akceptują tylko nazwy plików, ale masz rację, że tak naprawdę nie chodzi o rzeczywistą nazwę pliku w jakimś katalogu.
JoL
5
@EricDuminil: W szczególności, w przypadku programów zgodnych z tą konwencją, musisz użyć, ./-jeśli naprawdę chcesz otworzyć plik o nazwie -.
Jörg W Mittag
4
@EricDuminil W rzeczywistości: tak! IT nazwy do pliku ; w sensie unixowym, stdinto deskryptor pliku i -nazwa, którą podajesz, aby go użyć. Jednak z punktu widzenia systemu operacyjnego nie jest to nazwa pliku. Tylko z perspektywy użytkownika.
Marcus Müller,
3
@rexkogitans no. /dev/stdinto po prostu wygodna nazwa pliku oferowana przez jakieś narzędzie jądra. Zazwyczaj nigdzie się nie fopen("/dev/stdin", "r") dzieje, gdy piszesz program, który wybiera użycie stdin; po prostu skorzystaj z extern FILE* stdintego, co zapewnił ci nagłówek libc; tak przy okazji, to jest deskryptor pliku liczb całkowitych 0.
Marcus Müller,
5

-Argument tarokreśla, że archiwum należy czytać od stdinzamiast pliku. Z podręcznika GNU tar :

Jeśli używasz -jako nazwy archiwum , tarodczytuje archiwum ze standardowego wejścia (podczas wyświetlania lub wypakowywania plików)

Inne polecenia mają to samo zachowanie i jest określone przez standard POSIX.1-2017 :

Wytyczna 13 :

W przypadku narzędzi, które używają operandów do reprezentowania plików, które mają zostać otwarte do odczytu lub zapisu, -operand „ ” powinien oznaczać tylko standardowe wejście (lub standardowe wyjście, gdy z kontekstu wynika, że ​​plik wyjściowy jest określony) lub plik o nazwie -.

Tim
źródło