---
# System prepended metadata

title: login shell
tags: [slide]

---

###### tags: `slide`

# login shell 
# vs.
# no-login shell

---

## 什麼是login shell?
取得 bash 時需要完整的登入流程的，就稱為 login shell

---

## 什麼是non-login shell?

取得 bash 接口的方法不需要重複登入的舉動

---

## interactive 交互式Shell
提供了命令提示符可以輸入命令

---

## non-interactive 非交互式Shell
可以透過bash -c 「CMD指令」

---

### login角色不同會讀不同的設定檔案
```
$env
```
![](https://i.imgur.com/6pjHLS1.png)
```
$sudo env
```
![](https://i.imgur.com/DU5hce6.png)

---

### 查看環境變數
#### login shell去執行 env
```
$ ssh -i keyName user@ip
$ env | grep PATH
```
![](https://i.imgur.com/GorQOQs.png)

#### non-login shell 執行 env結果不同
```
$ ssh -i keyName user@ip "env | grep PATH"
```
![](https://i.imgur.com/Z4kGlud.png)

---

#### login shell去執行npm指令時
```
$ ssh -i keyName user@ip 
$ npm install
// npm install successfully
```
#### non-login shell 執行npm命令結果不同
```
$ ssh -i keyName user@ip "npm install"
// npm command not found
```

---

## 解決辦法
### 讓non-login shell 變成是login shell
```
$ ssh -i keyName user@ip "npm install"
```
```
$ ssh -i keyName user@ip "bash -l -c 'npm install'"
```
- -l 登入，等同於--login
- -c 指令，後面接string

---

## 認識「bash 的環境配置文件」

---

## ~/.bashrc(no login shell讀取)
- 當登入時以及每次開啟新的shell時才會被讀取
- 設定整體的環境設置
- 去加載 /etc/bashrc(當系統擁有多個 shell 時，最好把 bash 的配置個別放在這個檔案)
<div style="text-align: left;"><font size = "4">
<font color = "yellow">Ubuntu不會有/etc/bashrc只會有/etc/bash.bashrc</font></font></div>

---

## /etc/profile(login shell讀取)
<div style="text-align: left;"><font color = "yellow"><font size = "5">與–login 選項交互調用時，或者作為sh調用時，Bash 會讀取 /etc/profile，通常用來讀取環境參數，例如 PATH, USER, MAIL, HOSTNAME and HISTSIZE</font></font></div>
<div style="text-align: left;">
接著它會按順序讀取1個：
~/.bash_profile, ~/.bash_login, ~/.profile</div>

![](https://i.imgur.com/yqFCy20.png)

---

# env
### 位置 /usr/bin/env
#### env 是 environment （環境）的簡寫
他的PATH會加載所有被export出的$PATH


---

# env 內容
- HOME:「代表使用者的主文件夾」
- SHELL: 「目前這個環境使用的 SHELL 是哪支」
- PATH: 「就是可執行文件搜尋的路徑」

---

![](https://blog.flowblok.id.au/static/images/shell-startup.png)

---

## 實測login shell和non login shell

---

1. "non-interactive" + "non-login shell"
![](https://i.imgur.com/6Ffngmo.png)
![](https://i.imgur.com/5Ag8zG2.png)

---

2. "non-interactive" + "沒有--login"
![](https://i.imgur.com/nOS3NtT.png)
![](https://i.imgur.com/5Ag8zG2.png)

---

3. "non-interactive" + "有--login"
![](https://i.imgur.com/9i7CMho.png)
![](https://i.imgur.com/TSHunZV.png)

---

4. "interactive" + "login shell"
![](https://i.imgur.com/9v0Fh1T.png)
![](https://i.imgur.com/XZQUilx.png)
