Gdy wpiszesz nieprawidłowe polecenie w wierszu polecenia, otrzymasz wiadomość
-bash: {command}: command not found
Co oznacza -
na samym początku?
ssh computername
i nie licz polecenia do replikacji.
Gdy wpiszesz nieprawidłowe polecenie w wierszu polecenia, otrzymasz wiadomość
-bash: {command}: command not found
Co oznacza -
na samym początku?
ssh computername
i nie licz polecenia do replikacji.
Odpowiedzi:
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 bash
terminologii argument „zero” to nazwa polecenia, która w twoim przypadku była bash
.) 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 :
exec [-cl] [-a name] [command [arguments]]
[...] Jeśli
-l
opcja jest podana, powłoka umieszcza myślnik na początku zerowego argumentu przekazanego do polecenia .
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
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 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 -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).
-l
opcję, login
nadal 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.