co oznacza myślnik `-` przed błędami` bash` on 'not found'?


28

Gdy wpiszesz nieprawidłowe polecenie w wierszu polecenia, otrzymasz wiadomość

-bash: {command}: command not found

Co oznacza -na samym początku?


Jak dokładnie uruchamiasz polecenie? Próbowałem replikować, ale nie otrzymuję takich samych wyników - np.> jhgjbjbkjln: command not found- nie -bash: . Czy używasz bashw systemach Unix, Linux, OSX, ...? Pytam, bo może jest to domyślnie konkretna implementacja umieszczona przed komunikatem o błędzie, a to nic nie znaczy ... może.
jimm-cl

@jim Wypróbuj ssh computernamei nie licz polecenia do replikacji.
Bernhard,

Odpowiedzi:


27

Oznacza to, że jest to powłoka logowania.

Od man bash:

Powłoka logowania to taka, której pierwszym znakiem argumentu zero jest - lub rozpoczęty z opcją --login.

(W bashterminologii argument „zero” to nazwa polecenia, która w twoim przypadku była bash.) bashUżywa go jako sygnału do wykonywania czynności logowania, takich jak wykonywanie .bash_profileitp.

Jednym ze sposobów dodawania myślnika jest automatyczne uruchamianie powłoki exec. Z podręcznika Bash :

exec [-cl] [-a name] [command [arguments]]

[...] Jeśli -lopcja jest podana, powłoka umieszcza myślnik na początku zerowego argumentu przekazanego do polecenia .

Przykład

Porównaj te dwie próby uruchomienia polecenia nonexistent. Po pierwsze bez -l:

$ exec bash
$ nonexistent
bash: nonexistent: command not found

Po drugie, z:

$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found

3
Myślę, że część cytowanej przez ciebie dokumentacji nie pasuje do twojego wyjaśnienia. Fakt, że exec -lpoprzedza myślnik jest możliwy sposób, który może spowodować bash być uruchamiany jako -bash, ale to samo w sobie nie mówi, że jest to powłoka logowania, a tam jest bardzo duża szansa, że PO nie wykorzystał exec -lw ogóle . Część dokumentacji, która mówi, -bashże jest to powłoka logowania, brzmi: „ZAPROSZENIE Powłoka logowania to taka, której pierwszym znakiem argumentu zero jest - lub zaczyna się od opcji --login”.
hvd

@hvd, zgodził się. Choć poprawna, ta odpowiedź nie ma sensu.
Stéphane Chazelas

1
„Argument zerowy” nie jest bashterminologią, ale konwencją uniksową + indeksowaniem C: Każdy program otrzymuje listę parametrów, której początkową pozycją jest nazwa programu, a następnie argumenty. Ponieważ tablice C są indeksowane zaczynając od zera, argument zero (to znaczy zero) jest nazwą programu, a rzeczywiste argumenty zaczynają się od indeksu 1.
celtschk

15

Druga odpowiedź jest w porządku, ale warto wspomnieć, że ta funkcja jest bardziej ogólna niż bash.

Od czasów starożytnych loginprogram wstawiał myślnik do argv[0]momentu, w którym wykonuje powłokę użytkownika, i powłoka rozpoznała to jako znak, że powinna zachowywać się jak „powłoka logowania”. Jest to udokumentowane na stronach podręcznika V7 tutaj: login (1) , sh (1) .

Wszystkie programy, które zapewniają usługę przypominającą logowanie (uwierzytelniają użytkownika i uruchamiają powłokę), powinny przestrzegać zasady „dodawania myślnika”. Na przykład sshd robi to, co widać w ssh / session.c pod tym komentarzem:

/*
 * If we have no command, execute the shell.  In this case, the shell
 * name to be passed in argv[0] is preceded by '-' to indicate that
 * this is a login shell.
 */

Wszystkie pociski rozpoznają wiodącą kreskę. Odpowiednia -lopcja nie istnieje w klasycznej powłoce Bourne'a lub oryginalnym csh, ale ma ją większość nowszych powłok (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish i jakakolwiek nowsza wersja csh).


2
Mimo że większość pocisków ma teraz tę -lopcję, loginnadal jej nie używa. Oczekuje się, że wszystkie powłoki rozpoznają prefiks argv[0]jako „oficjalny” mechanizm.
Barmar
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.