存在する
#include <unistd.h>
int execve(const char * pathname , char *const argv [], char *const envp []);
argv [0]
ofは新しいプログラムの主な機能execve
に対応するため、通常は引数のデフォルト名部分と同じです。これは私たちが常に従うべき要件ですか?argv[0]
pathname
プログラムファイルを別の値で呼び出すことができる場合argv[0]
、この規則/慣例はプログラムファイルを呼び出し、特定の値を持つことを望むときにそのargv[0]
値main()
と呼ばれるプログラムファイルへのシンボリックリンクを生成し、argv[0]
シンボリックリンク呼び出しプログラム?それとも必ずしもそうではありませんか?例えば、「argvにプログラム名が含まれているのはなぜですか?」への答えです。説明する
argv[0]
その場合、BashはPOSIXモードで実行されますsh
。で始まると、argv[0]
ログインシェルとして実行されます-
。
これはどういう意味ですか?
POSIXモードでbashを呼び出すには、シンボリックリンクを作成して
/path/to/sh
文字列をポイントして/bin/bash
bashを呼び出す必要があります。これが文字列を指すよりも優れており、問題になりませんか?execve("/path/to/sh", argv, ...)
argv[0]
"sh"
execve("/bin/bash", argv, ...)
argv[1]
"--posix"
argv[0]
bashをログインシェルとして呼び出すには、シンボリックリンクを作成して
/path/to/-
文字列?をポイントして/bin/bash
bashを呼び出す必要があります。この方法は文字列の位置を指すよりも好ましく、重要ではありませんか?execve("/path/to/-", argv, ...)
argv[0]
"-"
execve("/bin/bash", argv, ...)
argv[1]
"--login"
argv[0]
argv [0]
いつ役に立ちますかexecve
?いいえ、同じです。pathname
パラメータのデフォルト名の一部として?
答え1
あなたがリンクした質問に対する答えは次のとおりです。
まず、必ずしも
argv[0]
プログラム名である必要はないことに注意してください。
これは主な問題を解決します。
リリース計画に関するさまざまな質問は、誤解に由来するようです。名前以外の値に設定されたプログラムを実行するためにリンク(シンボルリンクまたはハードリンク)を使用する必要はありません。argv[0]
与えられた配列を制御できるはずですexecve
。login
シェルの起動時に実行する作業は次のとおりです。-
in プレフィックスが付きます。argv[0]
argv[0]
Bashは起動時にPOSIXモードで起動するsh
ため/bin/sh
。--posix
同じ推論が-
ログインシェルにも適用されます。このルールは、--login
オプションがサポートされているかどうかに関係なく、すべてのシェルに適用されます。
ログインユースケースは、argv[0]
プログラム名と同じではない便利な例です。