Czy `-` jest używane tylko z cd?

45

cd - można przełączać między bieżącym a poprzednim katalogiem.

Wygląda na to, że widziałem -wcześniej jako argumenty innych poleceń, choć nie pamiętam, czy -oznacza to to samo co z cd.

Odkryłem, że -to nie działa ls.

Jest - używany tylko z cd?

Tim
źródło
8
Należy pamiętać, że cdjest to wbudowane, a nie zewnętrzne polecenie (ani nie miałoby żadnego sposobu, aby działać jako jedno). cd -jest zatem funkcją poziomu powłoki.
puszysty
6
Cały czas używam, git checkout -aby przejść do poprzedniej gałęzi
wim
@fluffy: Czy są -używane z innymi wbudowanymi w ten sam sposób?
Tim
W przypadku niektórych wbudowanych funkcji obsługi katalogów, takich jak pushd: tak. W przeciwnym razie znaczenie „poprzedniego katalogu” nie jest strasznie użytecznym domyślnym.
puszysty
1
Być może myślisz o funkcji „~ -” bash (która jest interpretowana jako $ OLDPWD). Można tego używać z „ls” w sposób, który opisujesz.
abonet

Odpowiedzi:

22

Te wytyczne składniowe narzędzie POSIX (konkretnie 13) określa, że za media, które oczekują nazwa pliku do odczytu z, -środki standardowego wejścia, a za media, które oczekują nazwę pliku do zapisu, -środki standardowe wyjście. Na przykład cat somefile -kopiuje zawartość somefilena standardowe wyjście, a następnie to, co czyta na standardowym wejściu.

Ta wytyczna nie dotyczy cdpolecenia, ponieważ nie odczytuje ani nie zapisuje pliku. cdrobi coś innego: argument -oznacza „poprzedni katalog”. Polecenie cd -jest równoważne z cd "$OLDPWD" && pwd. To zachowanie jest specyficzne dla cdpolecenia i poleceń inspirowanych bezpośrednio, takich jak pushd.

Zauważ, że -jest operandem, a nie opcją. Tylko argumenty, które zaczynają się -i nie są tylko -lub --są opcjami. Główną implikacją bycia operandem jest to, że --nie wpływa ono na jego specjalne znaczenie. Na przykład cd -- -Pzmiany w podkatalogu o nazwie -P, ale cd -- -jest taki sam jak cd -, nie zmienia się w katalogu o nazwie -. Podobnie, cat -- -nie czyta z pliku o nazwie, -ale ze standardowego wejścia.

Gilles „SO- przestań być zły”
źródło
46

-jest zdefiniowany w Wytycznych dotyczących składni narzędzi POSIX jako standardowe wejście:

Guideline 13:
For utilities that use operands to represent files to be opened for either 
reading or writing, the '-' operand should be used to mean only standard input 
(or standard output when it is clear from context that an output file is being 
specified) or a file named -.

Możesz zobaczyć tę definicję dla narzędzi, które działają z plikami do odczytu lub zapisu. cdnie należy do tych narzędzi, więc -w cd nie przestrzega tych wytycznych.

Poza tym POSIX również zdefiniował -ma własne znaczenie w cd :

-
    When a <hyphen> is used as the operand, this shall be equivalent to the 
    command:

    cd "$OLDPWD" && pwd

    which changes to the previous working directory and then writes its name.
Cuonglm
źródło
36

cd -jest w rzeczywistości skrótem cd "$OLDPWD" && pwd, gdzie $OLDPWDjest ustawiane za każdym razem, gdy zmieniasz katalogi na katalog, w którym właśnie byłeś.

Obsługa -zależy od aplikacji. Niektóre aplikacje używają -oznaczać STDIN, na przykład grep,awk

Inne aplikacje mogą być -skrótem do wszystkiego, co wybiorą, jak określa odpowiedź Michaela za pomocą su, -jest skrótem--login

Lawrence
źródło
tak, naprawdę nie ma na to żadnej reguły.
Kiwy,
2
@Kiwy: W POSIX istnieje reguła, patrz moja odpowiedź.
cuonglm
Mówiąc ściślej, istnieje ogólna zasada, ale ma wiele wyjątków. Istnieje również wiele poleceń poprzedzających regułę lub stare implementacje, które nie zostały zaktualizowane w celu dostosowania do reguły.
Barmar
19

Choć Michael wspomina, że sui inne aplikacje mogą używać -znaczyć co chcą (odczyt z stdin jest powszechne), Git robi wykorzystania -w sposób podobny do tego, jak cdrobi , na zmianę oddziałów.

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master
dotancohen
źródło
18

Każdy program może użyć -jako argumentu, co oznacza, co chce. Jednym z typowych przykładów jest su, który wykorzystuje -jako skrót dla --login. Jedyną konwencją, o której mogę pomyśleć, jest to, że programy, które odczytują z plików często używają, -aby oznaczać „czytać ze standardowego wejścia” , ale to całkowicie zależy od programu

Michał Mrożek
źródło
Czy istnieją standardowe lub niestandardowe konwencje używania specjalnych symboli jako argumentów?
Tim
2

Dodając tutaj moje dwa centy. Używam „-”, aby powiedzieć narzędziu ps2pdf, aby czytało ze standardowego wejścia, jak sugerowało wcześniej kilka osób:

man -t ls | ps2pdf - ls.pdf

Powyższy jeden-linijka tworzy wersję pdf strony man dla ls w bieżącym katalogu.
Mam nadzieję, że ktoś uzna to za przydatne :).

gacanepa
źródło
2

Jak odpowiedział gnouc , -ma swoje znaczenie w cd.

Można jednak replikować zachowanie -innych programów za pomocą ~-. Na przykład:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
Chirag Bhatia - chirag64
źródło