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ć?

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ą.


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.


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


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 .


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!


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.