91605


ログインシェルをbashにしてfishを起動したい場合、  
.bashrcに

[code]

    exec fish
    
[/code]

と入力すればできるはずなのですが、fishが起動しません。  
ホームディレクトリから

[code]

    vim ~/.bashrc
    
[/code]

と入力しました。  
何が間違えているのでしょうか。

  * `bash` を実行すると `fish` に変わります
  * ログインシェルを `bash` で行うと、`fish` は起動しません


CC BY-SA 4.0
2022-09-22T14:12:12.000
91243
2022-10-14T14:46:47.340
2022-10-14T14:10:18.690
3054
51450
question
bash shellscript fish
bashをログインシェルにして、fishを使いたい


### ログインシェル時に動作が違うのは `~/.bashrc` が読まれないから

`~/.bashrc` は Bash がログインシェルとして起動された場合、デフォルトでは実行されません。対話シェルとしての Bash
は、ホームディレクトリにあるファイルを、以下のルールで実行します。（ややこしいので、正確な動作は[マニュアル](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html)を確認して下さい）

### ログインシェルの場合

  * `~/.bash_profile`
  * `~/.bash_login`
  * `~/.profile`

がこの順番で探され、最初に見つかった物が実行されます。

### 非ログインシェルの場合

` ~/.bashrc` ファイルがあれば、ここからコマンドを読み込んで実行します

### 対策

よって、ログインシェルの場合もコマンドを実行したいならば、例えば `~/.bash_profile`
にも記述を追加する必要が有るということです。別のシェルを起動するようなコードは、対話シェルの時のみ実行させたいことでしょう。その場合は例えば下のように場合分けできます。

[code]

    case $- in
        *i*)
            # 対話シェル（インタラクティブ）
            # ...
            ;;
        *)
            # 非対話シェル
            # ...
            ;;
    esac
    
[/code]

`. ~/.bashrc` などとして別のファイルを丸々読み込むことで、設定を一箇所にまとめることもあります。


CC BY-SA 4.0
2022-10-14T14:46:47.340
91605
2022-10-14T14:46:47.340
3054
91243
answer