iOS之認識Shell-1

語言: CN / TW / HK

這是我參與11月更文挑戰的第12天,活動詳情檢視:2021最後一次更文挑戰

shell

確認當前終端tty使用的Shell型別:

\ Shell(Unix Shell)是一種命令列直譯器,是Unix作業系統下最傳統的人機介面。 Shell指令碼是解釋執行的,不需要編譯,和大部分的程式語言很相似,也有基本的變數和流程控制語句。我們平時使用Shell有兩種方式: - 輸入命令,執行,這種方式稱為互動式(Interactive); - 批處理(Batch)方式,使用者事先寫好Shell指令碼檔案,然後順序執行指令碼中的命令。 第一個Shell環境是Thompson Shell,在貝爾實驗室開發並於1971年釋出。\ 現代Shell最突出的祖先是被稱為shBourneShell,這是以在AT&T工作的創始人Stephen Bourne命名的。\ Shell一直在基於這個概念,不斷新增各種新功能,演變出很多種的Shell。 例如,很早版本的OS X中使用的是: - tcsh 作為預設的Shell。這是由csh(C shell),一種類似C語言的Shell演變而來。 在OS X 10.3版與10.4版之後,預設的Shell是: - bash,由GNU開發。

除了預設的bash,現在macOS中,預設的Shell變成了zsh。這是一種由Paul Falstad於1990年開發的。它是一個BourneShell,它使用bashprevious shell的特性,並添加了更多的特性: - 拼寫檢查功能 - 內建的程式設計特性 - 友好的互動

\ 與此同時,macOS還提供了很多其他種類的Shell:\

.bashrc.bash_profile.zshrc作用與區別

在使用命令列工具時,我們可能會遇到一些教程,可能需要你把一些配置寫入到.bashrc.bash_profile或者.zshrc等。那麼這幾個檔案到底有什麼作用和區別?\ 首先,從檔名稱判斷.bashrc.bash_profile是給Bash來使用的。而.zshrc是給zsh來使用的。

互動式登入和非登入Shell

當呼叫Shell時,Shell從一組啟動檔案中讀取資訊並執行命令。讀取什麼檔案就取決於Shell是作為互動式登入還是非登入呼叫。

換言之,Shell分為互動式的或非互動式的: - 互動式Shell是讀取和寫入到使用者終端的Shell程式,使用者在終端上輸入命令,並在回車後立即執行。 - 非互動式Shell是與終端不相關的Shell程式,例如執行指令碼時。 互動式Shell可以是登入Shell,也可以是非登入Shell。 當用戶通過ssh或本地遠端登入到終端時,或者使用--login選項啟動時,將呼叫登入shell

當作為互動式登入Shell呼叫時,Bash會先查詢/etc/profile檔案,如果該檔案存在,它將執行檔案中列出的命令。然後,搜尋\ ~/.bash_profile~/.bash_login以及~/.profile檔案,順序讀取。

Bash作為互動式非登入shell呼叫時,會讀取~/.bashrc。\

所以說,.bashrc.bash_profile之間的區別是,.bash_profileBash作為互動式登入shell呼叫時被讀取並執行,而.bashrc對於互動式非登入shell被執行。

大多數Linux/Unix發行版都使用~/.profile代替~/.bash_profile~/.profile所有shell都讀取該檔案,而~/.bash_profile只有Bash才會讀取該檔案。\ ~/.zshrczsh的互動式shell的使用者配置。

對於Bash,它們的工作方式如下: - 讀取適當的內容,執行A,然後執行B,然後執行C,依此類推。B1B2B3表示僅執行找到的那些檔案中的第一個。

+----------------+-----------+-----------+------+ | |Interactive|Interactive|Script| | |login |non-login | | +----------------+-----------+-----------+------+ |/etc/profile | A | | | +----------------+-----------+-----------+------+ |/etc/bash.bashrc| | A | | +----------------+-----------+-----------+------+ |~/.bashrc | | B | | +----------------+-----------+-----------+------+ |~/.bash_profile | B1 | | | +----------------+-----------+-----------+------+ |~/.bash_login | B2 | | | +----------------+-----------+-----------+------+ |~/.profile | B3 | | | +----------------+-----------+-----------+------+ |BASH_ENV | | | A | +----------------+-----------+-----------+------+ | | | | | +----------------+-----------+-----------+------+ | | | | | +----------------+-----------+-----------+------+ |~/.bash_logout | C | | | +----------------+-----------+-----------+------+ 對於zsh,它們的工作方式如下: - 讀取適當的內容,執行A,然後執行B,然後執行C,依此類推。

+----------------+-----------+-----------+------+ | |Interactive|Interactive|Script| | |login |non-login | | +----------------+-----------+-----------+------+ |/etc/zshenv | A | A | A | +----------------+-----------+-----------+------+ |~/.zshenv | B | B | B | +----------------+-----------+-----------+------+ |/etc/zprofile | C | | | +----------------+-----------+-----------+------+ |~/.zprofile | D | | | +----------------+-----------+-----------+------+ |/etc/zshrc | E | C | | +----------------+-----------+-----------+------+ |~/.zshrc | F | D | | +----------------+-----------+-----------+------+ |/etc/zlogin | G | | | +----------------+-----------+-----------+------+ |~/.zlogin | H | | | +----------------+-----------+-----------+------+ | | | | | +----------------+-----------+-----------+------+ | | | | | +----------------+-----------+-----------+------+ |~/.zlogout | I | | | +----------------+-----------+-----------+------+ |/etc/zlogout | J | | | +----------------+-----------+-----------+------+

確認當前是登入還是非登入shell

tty中執行echo $0,輸出的Shell如果前面帶-,說明是登入Shell

配置建議

  1. bash
  2. 將配置選項放到~/.bashrc中,然後在~/.bash_profile中通過source呼叫。
  3. zsh`:
  4. 建議仍然將配置選項放到~/.bashrc~/.bash_profile中通過source呼叫,最後在~/.zshrcsource呼叫~/.bash_profile