Bash プロンプトで無効なコマンドを入力すると、次のメッセージが表示されます。
-bash: {command}: command not found
-
最初はどういう意味ですか?
答え1
これはログインシェルであることを意味します。
からman bash
:
ログインシェルの引数を持たない最初の文字は、-または--loginオプションで始まります。
(bash
用語「zero」パラメータはコマンド名であり、あなたの場合はですbash
。) bash
これをシグナルとして使用して、実行などのログインアクティビティを実行します.bash_profile
。
ダッシュを自動的に追加する1つの方法は、シェルを起動することですexec
。 ~からバッシュマニュアル:
exec [-cl] [-a name] [command [arguments]]
[...]
-l
このオプションが指定されている場合、シェルは渡された0番目の引数の先頭にダッシュを配置します。注文する。
はい
コマンドを実行する2つの試みを比較してくださいnonexistent
。まず、次はありません-l
。
$ exec bash
$ nonexistent
bash: nonexistent: command not found
第二に、:
$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found
答え2
他の答えはそれ自体は大丈夫ですが、この機能がbashよりも一般的であることは言及する価値があります。
古代から、login
プログラムはユーザーのシェルを実行するときにダッシュ(-)を前に付けargv[0]
、シェルはこれを「ログインシェル」として機能しなければならないというシグナルとして認識しました。 V7のマニュアルページに文書化されています。ログイン(1)、シェル (1)。
ログインに似たサービス(ユーザー認証とシェルの実行)を提供するすべてのプログラムは、「前のダッシュ」ルールに従う必要があります。たとえば、sshdは見てわかるように動作します。SSH/session.cこのコメントの下に:
/*
* 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.
*/
すべてのシェルは先行ダッシュを認識します。これに対応するオプションは既存のBourneシェルまたは元のcshには存在しませんが、ほとんど-l
の最新シェル(bash、dash、ksh、yash、tcsh、zsh、rc、es、fish、およびcshの新しいバージョン)にはこのオプションがあります。
答え3
この関数のパラメータは親main
プロセスによって手動で設定され、カーネルによって事前設定されません。親プロセスは子プロセスに任意の値を設定できますargv[0]
。man 3 exec
たとえば、親はこれを行うことができます。
execlp("bash", "-bash");