rcmdnk's blog

20150525_details_200_200

Macでのログインシェルを確認したり変更したりする方法について。

Unix的な通常の方法に加えてMac独特の方法もあります。

アプリ毎の設定

システムとして各ユーザーのデフォルトログインシェルは指定してありますが、 さらにこれをアプリが上書きする事が出来ます。

これをしていると下で書いてある事をしても変わらないので最初に確認。

ターミナル.appなら環境設定 一般にある 開くシェルという設定がログインシェルを決めます。

terminal

これがデフォルトのログインシェル以外のコマンドが指定してあると Macのシステム設定を無視してそれがログインシェルの代わりに最初に実行され、 通常のシェルであればログインシェルとして使われる様になります。

iTerm2の場合にはPreferences Profilesで自分の使っているプロファイルの設定の GeneralタグにあるCommandがこの設定。

iterm2

これがLogin shellではなくCommandで何か指定されてると それがシステムのログインシェルの代わりに実行されます。

この辺の設定を使って、Bashを使いたい時はターミナル、 Zshを使いたい時はiTerm2を立ち上げる、といったことも出来ないこともありません。 (便利かどうかは別として)

以下ではどちらを使ってても良いですが いずれにしろデフォルトのログインシェルを使えるようなターミナルだとして 作業します。

$SHELLで確認、chshで変更

Unixのシステムで通常使われる方法です

現在使っているログインシェルの絶対パスは $SHELLという環境変数に入っています。

$ echo $SHELL
/bin/bash

これをコマンドラインから変更するには

$ chsh -s /bin/zsh

とします(ユーザーのパスワードを聞かれる)。

また、Homebrew等で/usr/local/bin/bash等、新たに入れたシェルを使いたい場合、 そのままchshすると

$ chsh -s /usr/local/bin/bash
Changing shell for USER.
Password for USER:
chsh: /usr/local/bin/bash: non-standard shell
$

の様に、通常のシェルではない、と言って怒られてしまいます。

standard shellに加えるためには/etc/shellsというファイルを開いて、

/etc/shells
1
2
3
4
5
6
7
8
9
10
11
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/bash

の様に、最後に加えたいシェルの絶対パスを追加します。

これで他のシェルと同じように/usr/local/bin/bashchshで選べる様になります。

Unixではユーザー情報を/etc/passwdにログインシェル情報と共に残しますが、 Macでは通常ユーザーの情報は他で管理しているので このファイルには載っていません。

1つ注意としては、コマンドラインからbash --versionみたいな事をして 見られる物はログインシェルとは違う事。 bash --versionとした場合にはPATH中の最初に見つかった bashを使うだけなのでログインシェルとは直接関係ありません。

なので/bin/bashでログインしていても which bashbash --version/usr/local/bin/bashの物が出る事があるので注意です。 (なのでこれらのコマンドではログインシェルの確認にはなりません。)

ただ、コマンドラインからbashとしてシェルを起動させた際には PATHの中の最初のbashが使われます。 これはログインシェルとは違うものの可能性があります。

シェルスクリプトでShebangで

#/usr/bin/env bash

とした場合にもログインシェルではなくて単にPATH上の最初のbashになります。

システム環境設定からGUIで変更

Macではログインシェルを環境設定から変更することも出来ます。

システム環境設定ユーザーとグループ へ行き、 左下のカギをクリックしてパスワードを入れて変更できる状態にします。

この状態で変更したいユーザーの名前の上で右クリック(二本指クリック) すると詳細オプションというコンテクストメニューが出るのでこれを選択。 (下のカギをクリックして変更できるようにしておかないと右クリックしても 何も出ません。)

settings

ここで出てくるログインシェルという項目を自分の好きなものに 変更して上げればOKです。

details

上に設定の変更を有効にするにはコンピュータを再起動する必要があります。 とありますが、 ログインシェルだけであれば再起動しなくても OKを押した瞬間に有効になります。

また、ドロップダウンメニューには元々入っているシェルのリストしか出ませんが、 /usr/local/bin/bashと書いて上げればこれを使える様になります。

chshコマンドと違って、こちらから変更する場合には /etc/shells等を書き換える必要がありません。 また、書き換えてもメニューに新たなシェルが加わったりすることはありません。

dscl

dsclDirectory Service command line utility の略だそうで コマンドラインからディレクトリサービス(ユーザー情報等を管理するサービス) を扱えるコマンドです。

これを使うとコマンドラインから簡単にシェルを変更でき、 かつ、chshと違って/etc/shellsを書き換えずに 新たなシェルを使うことが出来ます。

現在のシェルを確認するためには

$ dscl . -read /Users/$USER UserShell
UserShell: /usr/local/bin/bash

とします。最初の引数の.はIPアドレス等、知りたい情報を持つサーバーの場所を 指す物をしてするのですが、 通常は今使っている端末のものを知りたいので、 その場合は.とすると今いる端末を示します。

ユーザーの指定はHOMEディレクトリを指します。

同様にシェルを変更する際には

$ sudo dscl . -create /Users/$USER UserShell /usr/local/bin/bash

と、createを使ってユーザーを指定してUserShellを書いた後に 使いたいシェルの絶対パスを入力します。 (変更するにはroot権限が必要なのでsudoで。)

まとめ

GUIでやりたい場合には環境設定からでも出来ますが、 一番簡単なのはdsclを使った方法だと思います。 (chsh/etc/shellsを書き換える必要があるため。)

Sponsored Links
Sponsored Links

« AppleScriptを使ったウィンドウサイズを変えるやつ BashでZshのsuffix aliasやauto cdを実現する »

}