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
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).
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.
jhgjbjbkjln: command not found
- nie-bash:
. Czy używaszbash
w 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.ssh computername
i nie licz polecenia do replikacji.Odpowiedzi:
Oznacza to, że jest to powłoka logowania.
Od
man bash
:(W
bash
terminologii argument „zero” to nazwa polecenia, która w twoim przypadku byłabash
.)bash
Używa go jako sygnału do wykonywania czynności logowania, takich jak wykonywanie.bash_profile
itp.Jednym ze sposobów dodawania myślnika jest automatyczne uruchamianie powłoki
exec
. Z podręcznika Bash :Przykład
Porównaj te dwie próby uruchomienia polecenia
nonexistent
. Po pierwsze bez-l
:Po drugie, z:
źródło
exec -l
poprzedza 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 -l
w 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”.bash
terminologią, 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.Druga odpowiedź jest w porządku, ale warto wspomnieć, że ta funkcja jest bardziej ogólna niż bash.
Od czasów starożytnych
login
program wstawiał myślnik doargv[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:
Wszystkie pociski rozpoznają wiodącą kreskę. Odpowiednia
-l
opcja 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).źródło
-l
opcję,login
nadal jej nie używa. Oczekuje się, że wszystkie powłoki rozpoznają prefiksargv[0]
jako „oficjalny” mechanizm.