「コマンドが見つかりません」エラーで「bash」の前のダッシュ「-」とはどういう意味ですか?

「コマンドが見つかりません」エラーで「bash」の前のダッシュ「-」とはどういう意味ですか?

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");

関連情報