🐚

Macのターミナルはシェルをどう探すか

2021/07/25に公開

ターミナルエミュレータを起動すると、ログインシェルが実行される(そう実装されていれば)。macOSのいくつかのターミナルエミュレータがどうやってログインシェルを探しているかを調べた。

login(1)

Terminal.app や iTerm2 は自分でシェルを探さずに login(1) を実行する。

$ login -fp $USER

これによりログインシェルが実行される。

getpwuid(3) / getpwuid_r(3)

libcの関数 getpwuid(3) を呼び出して得られる passwd 構造体のメンバー pw_shell にログインシェルが記載されている。
サンプルコード:

print_login_shell.c
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
#include <unistd.h>
#include <uuid/uuid.h>

int main()
{
	struct passwd *pw = getpwuid(geteuid());
	if (pw == NULL) return 1;
	printf("%s\n", pw->pw_shell);
	return 0;
}

実行例:

$ gcc -o print_login_shell print_login_shell.c
$ ./print_login_shell
/bin/bash

dscl(1)

dscl(1) でディレクトリサービスから情報を取得できる。UserShellを指定するとログインシェルが得られる。

$ dscl . read /Users/$USER UserShell
UserShell: /bin/bash

Discussion