Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Open2

Mac OS bash/zsh周りのメモ

omakazuomakazu

今のOSのシェル環境がzshを使っているのか、bashを使っているのか確認する

Macはもともとはbashを採用していたが、Catalina世代から購入したMacはデフォルトシェルがzshに変更になった。

$ echo $SHELL
/bin/bash
or
/bin/zsh

https://mykii.blog/what-is-shell-bash-and-zsh/

どうやら、terminalを開いた時のインタラクティブシェルがデフォルトでzshなどに変わっただけのようで、だいたいの今までのシェルは標準でinstallされていて、使用することはできる。

Mac のシェルは macOS 10.15 Catalina で bash から zsh に変わったと一般に言われていますが、インストールされているシェルはバージョン番号の違いを除いて以前とほとんど変わっていません。

/bin/sh は POSIX モードで bash (/bin/bash) を起動します
/bin/bash は bash 3.2.57 (正確には Apple 版 bash-123.40.1)です
/bin/zsh は zsh 5.8 です
その他に以下のシェルも標準でインストールされています。

/bin/csh, /bin/tcsh は tcsh 6.21.00 です
/bin/ksh は ksh 93u+ で主に商用 UNIX でよく使用されていた POSIX シェルです。
/bin/dash は純粋な POSIX シェルに一番近くて高速なシェルです
ただしインタラクティブシェルには向いていません
macOS 10.15 Catalina で変更になったのは新規作成したユーザーがデフォルトで使うインタラクティブシェル(ターミナルで使うシェル)が zsh になった事と macOS 標準の古い bash をインタラクティブシェルとして使い続けてる人に警告が表示されるようになっただけです。シェルが変わったのではなく、デフォルトで使用するシェルが変更になっただけです。
https://qiita.com/ko1nksm/items/59c2e8a7afa969af8212

omakazuomakazu

bash環境による処理の流れ


https://blog1.mammb.com/entry/2019/12/01/090000

検索順序が存在して、場合によっては下位のものは読み込まないケースもあるので注意。

zsh環境による処理の流れ

読み込まれるファイルと順番
本当は/etc/zsh/以下の設定ファイルも読み込まれるのですが、そこは基本的にデフォルトのままなので、今回は気にしていないです。

ログインシェルでzshを起動した時
~/.zshenv
~/.zprofile
~/.zshrc
~/.zlogin
インタラクティブシェルでzshを起動した時
~/.zshenv
~/.zshrc
シェルスクリプトとしてzshを起動した時
~/.zshenv
ログアウトする時
~/.zlogout
[引用] https://blog.masasuzu.net/entry/20120506/1336286016

ログインシェル

ログインシェルとはデスクトップ画面や仮想コンソールでログインしたときに起動されるシェルを指します。
bash の man page から抜粋すると以下のように説明されています。

A login shell is one whose first character of argument zero is a -, or one started with the --login option.
ログインシェル(login shell)とは、0 番目の引き数の最初の文字が - であるシェル、または --login オプション付きで起動されたシェルのことです。
[引用] https://blog1.mammb.com/entry/2019/12/01/090000

具体的なケース
ログインプロンプトよりシステムにログイン
bash --login のように --login オプションを明示して bash を起動
su - <user> のように -(-lまたは--login)オプションを指定した場合、su コマンドがシェル名の前に - を付加
ssh user@hostname などでSSHログイン

インタラクティブ(対話的)シェル

An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both con-nected to terminals (as determined by isatty(3)), or one started with the -i option. PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state.

対話的なシェルとは、 オプションでない引き数がなく、 標準入力と標準エラー出力がいずれも端末に接続されていて (これは isatty(3) で調べられます)、 -c オプションが指定されていない状態で起動されたシェル、または -i オプション付きで起動されたシェルのことです。 bash が対話的に動作している場合には、 PS1 が設定され、 $- に i が含まれます。 これを利用すると、対話的動作の状態であるかどうかを、 シェルスクリプトや起動ファイルの内部で調べられます。
[引用] https://blog1.mammb.com/entry/2019/12/01/090000

具体的なケース
標準入力と標準エラー出力が端末に接続されている
-c オプションが指定されていない
オプション以外の引数が指定されていない
-i オプションで強制的にインタラクティブ扱いになっている

bash環境による一般的な、運用上でよく使われる処理の流れ
/etc/profileを実行
/etc/profileによって、/etc/profile.dディレクトリ配下のすべてのファイルを実行
ログインユーザーのホームディレクトリにある~/.bash_profileが実行
~/.bash_profileによって、~/.bashrcを実行
~/.bashrcによって、/etc/bashrcを実行

引用元:bashが起動時に実行するファイル

システムプロファイル

/etc配下にあるもの。
/etc/profile, /etc/bashrc
これらは全ユーザーに影響を与えるグローバルな初期設定が記述されている。
ホームディレクトリよりも先に実行されるシェル

ユーザーごとに設定したいような内容は~/以下のファイルに書く。

bash ~/ホームディレクトリ配下

~/.bash_profile

ログイン時にだけ1回、実行される。
例えば、ターミナル.appを起動した際に読み込まれる。

具体的な使い方
環境変数(exportで宣言)

~/.profile

元々は/bin/sh (Bourne shell)の「ログインシェル」のときに呼び出されるものらしい。bash(Bourne Again shell)Bourne shellの互換性のため~/.profileを読み込めるようにしている?
bashのログインシェルで、~/.bash_profileがなかった場合、~/.profileを読み込む。

具体的な使い方は
~/.bash_profileと同じだが、シェルの種類に依存しないものを記述する用途で使われる。
~/.bash_profileはbashでしか使われないため。

~/.bashrc

bashシェル起動時に1回実行される。
ログイン時には読み込まれない。(ただ、~/.bash_profileの中で読み込むように指定されている場合は~/.bashrcも呼び出される)

具体的な使い方
エイリアス
シェルオプション
プロンプト設定

ここに環境変数を設定するのは推奨されない。これをやるとターミナル以外からの起動するプログラムに環境変数が渡らなくなるケースがある。

~/.bash_alias

これは独自に作成しているもので、bashがサポートしているものではない。
エイリアス周りの設定をここに書いて、~/.bashrcで存在をチェックして呼び出すようにすると便利。

~/.bash_history

bashで実行したコマンドの履歴を記録するファイル。

~/.bash_login

~/.bash_profileがなかったときに読み込まれる。

あんまり最近見る記事では推奨されていないことが多いので使わなくてもいいと思われる。
~/.bash_profileで済む。

~/ .bash_logout

ログアウト時に実行される。

/etc配下のzsh

/etc/zshenv
/etc/zprofile
/etc/zlogin
/etc/zlogout

zsh ~/ホームディレクトリ配下

~/.zshenv

ログインシェル、インタラクティブシェル、シェルスクリプト、どんな時でもzshが起動してからなず最初に読み込まれるファイル

影響範囲が一番広いもの
扱いに注意。

~/.zprofile

ログインシェルで1回呼び出されるもの

~/.zshrc

ログインシェル、インタラクティブシェルの場合に読み込まれる。

~/.zlogin

ログインシェルの一番最後に読みこまれる。

~/.zlogout

exitコマンドでzshを抜けたときに読み込まれる。

~/.zsh_hisotry

zshで入力したコマンドが表示される

Reference

https://qiita.com/takutoki/items/021b804b9957fe65e093

https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/168bpronrc.html

https://techracho.bpsinc.jp/hachi8833/2021_07_08/66396

https://www.itmedia.co.jp/enterprise/articles/0803/10/news012.html

https://blog1.mammb.com/entry/2019/12/01/090000