Jaka jest magia „-” (myślnik) w parametrach wiersza poleceń?

102

Przykłady:

  • Utwórz obraz ISO i wypal go bezpośrednio na płycie CD.

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • Przejdź do poprzedniego katalogu.

    cd -

  • Nasłuchuj na porcie 12345 i rozpakuj przesłane do niego dane.

    nc -l -p 12345 | tar xvzf -

Jaki jest cel kreski i jak jej używać?

chemila
źródło

Odpowiedzi:

113

Jeśli masz na myśli nagość -na końcu tarpolecenia, jest to powszechne w przypadku wielu poleceń, które chcą użyć pliku.

Pozwala na określenie standardowego wejścia lub wyjścia zamiast rzeczywistego nazwy pliku.

Tak jest w przypadku pierwszego i trzeciego przykładu. Na przykład cdrecordpolecenie pobiera standardowe wejście (strumień obrazu ISO utworzony przez mkisofs) i zapisuje je bezpośrednio do /dev/dvdrw.

Za pomocą cdpolecenia za każdym razem, gdy zmieniasz katalog, przechowuje on katalog, z którego przyszedłeś. Jeśli zrobisz cdze specjalną -"nazwą katalogu", użyje ona zapamiętanego katalogu zamiast prawdziwego. Używając tego, możesz łatwo przełączać się między dwoma katalogami dość szybko.

Inne polecenia mogą traktować -jako inną wartość specjalną.

paxdiablo
źródło
9
uwaga, możesz również użyć -dla gałęzi git, tzn. możesz wrócić do poprzedniej gałęzi za pomocągit checkout -
snappieT
3
Gdzie w dokumentacji tar wyjaśnia, że ​​jest obsługiwany? Skąd mam wiedzieć, które polecenia ją obsługują?
1
Jeśli polecenie ma specjalne znaczenie dla -, możesz znaleźć jego wyjaśnienie na stronie podręcznika.
codeforester
su - # utwórz powłokę jako powłokę logowania
atongsa
Uważam, że takie polecenie jest bardzo ciekawe: tar -cvf - / home | aescrypt -e -p apples -> backup_files.tar.aes, czyli w rzeczywistości tar -cvf - / home | aescrypt -e -p apples -o backup_files.tar.aes - ponieważ znak potoku | powinno sprawić, że obecność ostatniej kreski będzie niepotrzebna. Ale bez ostatniej kreski polecenie zawodzi. Brzmi nielogicznie. Czy ktoś może mi podać odniesienie, w którym wyjaśniono znaczenie nagiej kreski w wierszach poleceń. Nie mogę znaleźć żadnego.
elmclose
22

To nie jest magia. Niektóre polecenia są interpretowane -jako użytkownik, który chce czytać ze standardowego wejścia lub zapisywać na standardowe wyjście; nie ma w tym nic specjalnego w powłoce.

Ignacio Vazquez-Abrams
źródło
9
Z wyjątkiem przypadku cd -; bash(1)uchwyty cd -tak, jakbyś to napisał cd $OLDPWD.
sarnold
6
@sarnold Ale chodzi o to samo cd- polecenie wbudowane w powłokę - interpretuje samą myślnik. Żadnej „magii” :-)
2
@pst, jasne, nie ma magii (to tylko kod :), ale w powłoce jest coś specjalnego.
sarnold
13

Przekierowanie z lub do stdinlub stdout.

Zobacz: http://tldp.org/LDP/abs/html/special-chars.html#DASHREF2

Ry-
źródło
Jak zawsze ABS należy traktować z przymrużeniem oka. Na przykład, oznacza to, że nie jest przekierowanie tutaj, ale to jest odrębny od operatorów przekierowania skorupy'S ( <, >, |, etc).
tripleee
10

-oznacza dokładnie to, co każde polecenie ma oznaczać. Istnieje kilka powszechnych konwencji, a przykłady większości z nich widzieliście w innych odpowiedziach, ale żadna z nich nie jest w 100% uniwersalna.

Jeśli -chodzi o powłokę, nie ma nic magicznego w postaci (poza samą powłoką i niektórymi jej wbudowanymi poleceniami, takimi jak cdi echo, używają jej w konwencjonalny sposób). Niektóre postacie, takie jak \, 'i ", „magiczne” i mają specjalne znaczenie, gdziekolwiek się pojawią. To są „metaznaki powłoki”. -nie jest taki.

Aby zobaczyć, jak działa dane polecenie -, przeczytaj dokumentację tego polecenia .

Keith Thompson
źródło
7

Magia tkwi w konwencji. Od tysiącleci ludzie używali znaku „-” do odróżniania opcji od argumentów i używali „-” w nazwie pliku, co oznaczało odpowiednio stdin lub stdout. Nie lekceważ potęgi konwencji!

William Pursell
źródło
Nie przeceniaj zdolności ludzi do odróżniania sposobów mówienia od dosłownych wyrażeń. Tak się nie dzieje od tysiącleci.
tripleee
1
@tripleee - prawda, ale trwa to miliardy sekund. ;-)
David R Tribble
5

Oznacza to użycie standardowego strumienia wejściowego programu.

W przypadku cdoznacza to co innego: przejście do poprzedniego katalogu roboczego.

Brian Cain
źródło