Wie genau führen Sie den Befehl aus? Ich habe versucht, zu replizieren, aber ich erhalte nicht die gleichen Ergebnisse - z. B.> jhgjbjbkjln: command not found- nein -bash: . Verwenden Sie bashin Unix, Linux, OSX, ...? Ich frage, weil dies möglicherweise eine bestimmte Implementierung ist, die standardmäßig vor die Fehlermeldung gestellt wird, und sie nichts bedeutet ... vielleicht.
Jimmy-Cl
@jim Versuchen Sie ssh computernameund Ihr Befehl nicht zu zählen, um zu replizieren.
Bernhard
Antworten:
27
Dies bedeutet, dass es sich um eine Anmeldeshell handelt.
Von man bash:
Eine Login-Shell ist eine Shell, deren erstes Zeichen des Arguments Null ein - ist, oder eine Shell, die mit der Option --login gestartet wurde.
(In der bashTerminologie ist das "nullte" Argument der Befehlsname, der in Ihrem Fall lautete bash.) bashVerwendet diesen als Signal für Anmeldeaktivitäten wie das Ausführen .bash_profileusw.
Ein Weg, wie der Bindestrich automatisch hinzugefügt werden kann, ist, wenn die Shell mit gestartet wird exec. Aus dem Bash-Handbuch :
exec [-cl][-a name][command [arguments]]
[...] Wenn die -lOption angegeben ist, setzt die Shell einen Bindestrich am Anfang des nullten Arguments, das an command übergeben wird .
Beispiel
Vergleichen Sie diese beiden Versuche, um den Befehl auszuführen nonexistent. Zuerst ohne -l:
$ exec bash
$ nonexistent
bash: nonexistent: command not found
Und zweitens mit:
$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found
Ich denke, der Teil der Dokumentation, den Sie zitieren, stimmt nicht mit Ihrer Erklärung überein. Die Tatsache , dass exec -lein Strich prepends ist eine mögliche Art und Weise , die bash verursachen kann wie ausgeführt werden -bash, aber das allein sagt nicht , dass es sich um ein Login - Shell ist, und es gibt eine sehr gute Chance , dass die OP nicht verwendet hat exec -lüberhaupt . Der Teil der Dokumentation, der besagt, -bashdass es sich um eine Anmeldeshell handelt, lautet "INVOCATION Eine Anmeldeshell ist eine Shell, deren erstes Zeichen des Arguments Null ein - ist, oder eine Shell, die mit der Option --login gestartet wurde."
HDV
@hvd, einverstanden. Diese Antwort ist zwar richtig, geht aber am eigentlichen Punkt vorbei.
Stéphane Chazelas
1
"Das nullte Argument" ist keine bashTerminologie, sondern Unix-Konvention + C-Indizierung: Jedem Programm wird eine Parameterliste übergeben, deren erster Eintrag der Programmname ist, gefolgt von den Argumenten. Da C-Arrays beginnend mit Null indiziert werden, ist das Argument Null (
dh
15
Die andere Antwort ist in Ordnung, aber es ist erwähnenswert, dass die Funktion allgemeiner ist als bash.
Seit loginjeher hat das Programm der Ausführung argv[0]der Benutzer-Shell einen Gedankenstrich vorangestellt , und die Shell hat dies als Zeichen dafür erkannt, dass sie sich als "Anmelde-Shell" verhalten sollte. Dies ist in den V7-Manpages hier dokumentiert: login (1) , sh (1) .
Alle Programme, die einen anmeldungsähnlichen Dienst bereitstellen (Benutzer authentifizieren und eine Shell ausführen), sollten der Regel "Bindestrich voranstellen" folgen. Zum Beispiel macht sshd, wie Sie in ssh / session.c unter diesem Kommentar sehen können:
/**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.*/
Alle Muscheln erkennen den führenden Strich. Die entsprechende -lOption gibt es in der klassischen Bourne-Shell oder der ursprünglichen csh nicht, aber die meisten neueren Shells (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish und alle neueren Versionen von csh) haben sie.
Obwohl die meisten Shells jetzt die -lOption haben, wird sie loginimmer noch nicht verwendet. Von allen Shells wird erwartet, dass sie das Präfix argv[0]als "offiziellen" Mechanismus erkennen.
jhgjbjbkjln: command not found
- nein-bash:
. Verwenden Siebash
in Unix, Linux, OSX, ...? Ich frage, weil dies möglicherweise eine bestimmte Implementierung ist, die standardmäßig vor die Fehlermeldung gestellt wird, und sie nichts bedeutet ... vielleicht.ssh computername
und Ihr Befehl nicht zu zählen, um zu replizieren.Antworten:
Dies bedeutet, dass es sich um eine Anmeldeshell handelt.
Von
man bash
:(In der
bash
Terminologie ist das "nullte" Argument der Befehlsname, der in Ihrem Fall lautetebash
.)bash
Verwendet diesen als Signal für Anmeldeaktivitäten wie das Ausführen.bash_profile
usw.Ein Weg, wie der Bindestrich automatisch hinzugefügt werden kann, ist, wenn die Shell mit gestartet wird
exec
. Aus dem Bash-Handbuch :Beispiel
Vergleichen Sie diese beiden Versuche, um den Befehl auszuführen
nonexistent
. Zuerst ohne-l
:Und zweitens mit:
quelle
exec -l
ein Strich prepends ist eine mögliche Art und Weise , die bash verursachen kann wie ausgeführt werden-bash
, aber das allein sagt nicht , dass es sich um ein Login - Shell ist, und es gibt eine sehr gute Chance , dass die OP nicht verwendet hatexec -l
überhaupt . Der Teil der Dokumentation, der besagt,-bash
dass es sich um eine Anmeldeshell handelt, lautet "INVOCATION Eine Anmeldeshell ist eine Shell, deren erstes Zeichen des Arguments Null ein - ist, oder eine Shell, die mit der Option --login gestartet wurde."bash
Terminologie, sondern Unix-Konvention + C-Indizierung: Jedem Programm wird eine Parameterliste übergeben, deren erster Eintrag der Programmname ist, gefolgt von den Argumenten. Da C-Arrays beginnend mit Null indiziert werden, ist das Argument Null (Die andere Antwort ist in Ordnung, aber es ist erwähnenswert, dass die Funktion allgemeiner ist als bash.
Seit
login
jeher hat das Programm der Ausführungargv[0]
der Benutzer-Shell einen Gedankenstrich vorangestellt , und die Shell hat dies als Zeichen dafür erkannt, dass sie sich als "Anmelde-Shell" verhalten sollte. Dies ist in den V7-Manpages hier dokumentiert: login (1) , sh (1) .Alle Programme, die einen anmeldungsähnlichen Dienst bereitstellen (Benutzer authentifizieren und eine Shell ausführen), sollten der Regel "Bindestrich voranstellen" folgen. Zum Beispiel macht sshd, wie Sie in ssh / session.c unter diesem Kommentar sehen können:
Alle Muscheln erkennen den führenden Strich. Die entsprechende
-l
Option gibt es in der klassischen Bourne-Shell oder der ursprünglichen csh nicht, aber die meisten neueren Shells (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish und alle neueren Versionen von csh) haben sie.quelle
-l
Option haben, wird sielogin
immer noch nicht verwendet. Von allen Shells wird erwartet, dass sie das Präfixargv[0]
als "offiziellen" Mechanismus erkennen.