私はログインシェルが何であるか、ログインシェルと非ログインシェルの違いを知っています。
しかし、私を混乱させるのはそれがどのように呼ばれるかです。-
パラメータ0でログインシェルを呼び出すとします。
引数0がシェル自体の名前である場合、呼び出しシェルに引数を渡すにはどうすればよいですか?
# -bash
-bash: -bash: command not found
わかりました。
# bash --login
# echo $0
# bash
私はまだそれを見ていません-bash
。
SSH経由でログインしている場合にのみ公開時に表示でき-bash
ますecho $0
。しかし、元の質問に戻って、
- Unix / Linuxでログインシェルを作成する方法は?
- ログインプロセス中にログインシェルを作成する「モノ」は何ですか?ログイン中にbashシェルを呼び出す「ログイン」プロセスの場合、パラメータ0を
-
bashシェルに渡すにはどうすればよいですか?
答え1
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
0bash
なので、["-bash"]
引数0も同じです-bash
。
答え2
これは複製が簡単で、次の方法で呼び出し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では、doneのようにlogin(1)
コードは次のように実行します。
execlp("/usr/local/bin/bash", "-bash", ..., (char *) 0)
プロセス名にハイフンを挿入します。これはソースコードを実行またはlogin
確認することで確認できます。bash
strace
login
答え3
ユーザー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