Macでのログインシェルを確認したり変更したりする方法について。
Unix的な通常の方法に加えてMac独特の方法もあります。
アプリ毎の設定
システムとして各ユーザーのデフォルトログインシェルは指定してありますが、 さらにこれをアプリが上書きする事が出来ます。
これをしていると下で書いてある事をしても変わらないので最初に確認。
ターミナル.appなら環境設定 一般にある 開くシェルという設定がログインシェルを決めます。
これがデフォルトのログインシェル以外のコマンドが指定してあると Macのシステム設定を無視してそれがログインシェルの代わりに最初に実行され、 通常のシェルであればログインシェルとして使われる様になります。
iTerm2の場合にはPreferences Profilesで自分の使っているプロファイルの設定の GeneralタグにあるCommandがこの設定。
これが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というファイルを開いて、
1 2 3 4 5 6 7 8 9 10 11 |
|
の様に、最後に加えたいシェルの絶対パスを追加します。
これで他のシェルと同じように/usr/local/bin/bashをchsh
で選べる様になります。
Unixではユーザー情報を/etc/passwdにログインシェル情報と共に残しますが、 Macでは通常ユーザーの情報は他で管理しているので このファイルには載っていません。
1つ注意としては、コマンドラインからbash --version
みたいな事をして
見られる物はログインシェルとは違う事。
bash --version
とした場合にはPATH
中の最初に見つかった
bash
を使うだけなのでログインシェルとは直接関係ありません。
なので/bin/bash
でログインしていても
which bash
やbash --version
で
/usr/local/bin/bash
の物が出る事があるので注意です。
(なのでこれらのコマンドではログインシェルの確認にはなりません。)
ただ、コマンドラインからbash
としてシェルを起動させた際には
PATH
の中の最初のbash
が使われます。
これはログインシェルとは違うものの可能性があります。
シェルスクリプトでShebangで
#/usr/bin/env bash
とした場合にもログインシェルではなくて単にPATH上の最初のbash
になります。
システム環境設定からGUIで変更
Macではログインシェルを環境設定から変更することも出来ます。
システム環境設定ユーザーとグループ へ行き、 左下のカギをクリックしてパスワードを入れて変更できる状態にします。
この状態で変更したいユーザーの名前の上で右クリック(二本指クリック) すると詳細オプションというコンテクストメニューが出るのでこれを選択。 (下のカギをクリックして変更できるようにしておかないと右クリックしても 何も出ません。)
ここで出てくるログインシェルという項目を自分の好きなものに 変更して上げればOKです。
上に設定の変更を有効にするにはコンピュータを再起動する必要があります。 とありますが、 ログインシェルだけであれば再起動しなくても OKを押した瞬間に有効になります。
また、ドロップダウンメニューには元々入っているシェルのリストしか出ませんが、 /usr/local/bin/bashと書いて上げればこれを使える様になります。
chsh
コマンドと違って、こちらから変更する場合には
/etc/shells等を書き換える必要がありません。
また、書き換えてもメニューに新たなシェルが加わったりすることはありません。
dscl
dscl
はDirectory 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を書き換える必要があるため。)