ログインシェルとは何か、ログインシェルと非ログインシェルの違いを知っています。
しかし、私を困惑させるのは、それがどのように呼び出されるかです。ログインシェルは、引数0として-
を使用して呼び出されると言われています。
呼び出されているシェルに引数を渡すにはどうすればよいですか?引数0はシェル自体の名前です。
# -bash
-bash: -bash: command not found
いいよ、気にするな
# bash --login
# echo $0
# bash
まだ-bash
が表示されません。
SSHで接続した場合にのみ、-bash
を発行するときにecho $0
を確認できます。しかし、私の元の質問に戻って、
-
としてbashシェルにどのように渡しますか?SSH、Sudo
、su
などのプログラムは、 システムコールのexec
ファミリ を使用してシェルを起動します。そして、これらのシステムコールにより、呼び出し側プログラムは関数を含むすべての引数を指定できます。たとえば、Sudo
を使用してログインシェルを開始します。
$ strace -fe execve -o Sudo.log Sudo -i
root:~ $ echo $0
-bash
root:~ $ logout
$ grep bash Sudo.log
19124 execve("/bin/bash", ["-bash"], [/* 31 vars */]) = 0
19140 execve("/bin/ls", ["ls", "/etc/bash_completion.d"], [/* 40 vars */]) = 0
最初のexecve
呼び出しに見られるように、bash
に渡される引数の配列は["-bash"]
-したがって、引数ゼロは-bash
。
これはzsh
で簡単に複製できます。これにより、exec(3)
呼び出しへの適切な引数を_ARGV0
_で指定できます。
_% ARGV0=-bash bash
-bash-4.1$ ps o cmd --pid=$$
CMD
-bash
-bash-4.1$ exit
% ARGV0=imnotaduck bash
$ ps o cmd --pid=$$
CMD
imnotaduck
$ exit
%
_
Cでは、login(1)
によって行われるように、コードは次の行に沿って何かを実行します。
_execlp("/usr/local/bin/bash", "-bash", ..., (char *) 0)
_
プロセス名にハイフンを挿入します。これは、login
の下でbash
とstrace
を実行するか、login
のソースコードを調べることで確認できます。
ユーザーusertestとしてログインするには、(rootであること)を実行します。
root:~# login usertest
Password:
usertest:~$ echo $0
-bash
usertest:~$ exit
root:~# _
これは、ユーザーがログインする正式な方法です。
もちろん、$ 0が変更されたコマンドをいつでも実行できます。
bash -c 'echo "hello"; echo $0;' mylogthisshell
常に最初のダッシュがある可能性があります
bash -c 'echo "hello"; echo $0;' -mylogthisshell