1. Shell

簡而言之,shell是用戶與Kernel交互的界面。shell是用戶使用操作系統來操作硬件的一個接口。shell可以調用其他的軟件,比如各種各樣的命令,來調用內核運行所需的工作。
狹義上是僅僅只命令行,廣義上的shell也包括圖形操作界面。
我在mac和linux上用的shell都是bash.(Bourne Again SHell)
目錄/etc/shells可以用來查看當前系統中有多少可以使用的shell

/home/username/.bash_history 目錄中存放有上一次登錄所使用的命令
2. 環境變量
-
習慣性的,環境變量要求全部大寫
-
env命令可以查看當前所有的【環境變量】 -
set命令用於查看當前所有【變量】 -
環境變量與自定義變量的區別在於,后者不可以被子進程所繼續引用,而環境變量可以。
-
export命令可以將自定義變量轉化為環境變量
PS1 提示符設置,這玩意可以改變命令提示符的樣式

3. Bash Shell的操作環境
a.路徑與命令查找順序
- 以相對/絕對路徑執行命令,如"/bin/ls"或者"./ls"
- 由alias找到該命令來執行
- 由bash內置的(builtin)命令來執行
- 通過$PATH這個變量的順序找到的第一個命令來執行

b.Bash的歡迎信息文件
/etc/issue 文件內寫了登錄終端機接口tty時的歡迎信息,你可以在里面畫圖之類的。
/etc/issue.net 文件內寫了遠程登錄終端機時的歡迎信息
/etc/motd 是讓所有人都知道的信息
【如何登錄tty】
- 按下Ctrl + Alt + Fn1進入圖形化用戶登錄界面
- 按下Ctrl + Alt + Fn2進入當前圖形化界面
- 按下Ctrl + Alt + Fn3-Fn6進入命令行虛擬終端
- 按下Ctrl + Alt + Fn7-Fn12進入另外的虛擬終端,這些虛擬終端沒有任何程序執行,所以只能看到一個閃爍的光標
| issue內的各代碼意義 | |
|---|---|
| \d | 本地端時間的日期 |
| \l | 顯示第幾個終端機接口 |
| \m | 顯示硬件的等級 |
| \n | 顯示主機網絡名稱 |
| \o | 顯示domain name |
| \r | 顯示操作系統版本(相當於uname -r) |
| \t | 顯示本地端時間的時間 |
| \s | 操作系統的名稱 |
| \v | 操作系統的版本 |
c.Bash的環境配置文件
①. login shell 與 non-login shell
login shell 取得bash時需要完整的登錄流程,稱為login shell, 如tty2~tty6
non-login shell 取得bash接口時不需要完整的登錄流程,如tty1是從圖形界面進入terminal,不需要再次登錄,屬於non-login shell
②. Login shell的配置文件讀取
| 文件 | |
|---|---|
| /etc/profile | 內寫有系統的整體設置,最好不要修改。 |
| ~/.bash_profile 或者~/.bash_login或者 ~/.profile | 用戶個人設置 想改動的話改動這里吧。左邊三個文件只會讀取其中一個,按照優先級順序為.bash_profile→.bash_login→.profile |
/etc/profile文件內容
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "${PS1-}" ]; then #判斷命令提示符的設定
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then # `id -u`拿到當前用戶的uid,判斷是否為root uid=0(root) 設定命令提示符
PS1='# '
else
PS1='$ '
fi
fi
fi
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do #對用戶有r權限的.sh文件進行調用
if [ -r $i ]; then
. $i
fi
done
unset i
fi
# /etc/profile.d/*.sh中設置了顏色,語系,別名等等
~/.profile文件內容
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.
# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc" # 這個文件里寫了非常多自己bash的配置 .是source命令的簡寫,如果對這個文件進行了修改 可以直接source ~/.bashrc讀取新環境
fi
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH" # 修改環境變量PATH
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH" #修改環境變量PATH
fi
login shell的啟動流程圖

③.non-login shell的配置文件讀取
僅僅讀取~/.bashrc文件而已
④. 其他相關文件
~/.bash_history記錄歷史命令~/.bash_logout注銷bash系統后幫我做完什么操作再離開
3.Bash的通配符與特殊符號以及組合按鍵
- bash默認組合按鍵
| 組合按鍵 | 執行結果 |
|---|---|
| Ctrl + C | 終止目前的命令 |
| Ctrl + D | 輸入結束(EOF) |
| Ctrl + M | 就是Enter |
| Ctrl + S | 暫停屏幕輸出 |
| Ctrl + Q | 恢復屏幕輸出 |
| Ctrl + U | 在提示符下,將整行命令刪除 |
| Ctrl + Z | 暫停目前的命令 |
- 通配符
| 符號 | 意義 |
|---|---|
| * | 代表0到無窮多個任意字符 |
| ? | 代表一定有一個任意字符 |
| [] | 同樣代表一定有一個在中括號內的字符(非任意字符) 如[abcd]表示有abcd其中某一個 |
| [-] | 表示在編碼順序內的所有字符 [0-9] |
| [^] | 中括號中的第一個字符為^ 表示原向選擇 [ ^abc] 表示非a,b,c的任意字符 |
- 特殊符號
| 符號 | 內容 |
|---|---|
| # | 腳本注釋 |
| \ | 轉義符 |
| | | 管道 分隔兩個管道命令的界定 |
| ; | 連續執行命令分隔符 連續命令的界定 |
| ~ | 用戶主文件夾 |
| $ | 變量前導符 $? 命令回傳碼 |
| & | 作業控制(job control)將命令變成背景下工作 |
| ! | 邏輯運算 非 |
| / | 目錄符號 路徑分隔 |
| >,>> | 輸出重定向 "替換" "累積" |
| <,<< | 輸入重定向 "" <<表示輸入結束 |
| '' | 單引號 不具有變量置換功能 |
| "" | 雙引號 具有變量置換功能 |
| `` | 被反引號包住的命令可以先執行 |
| () | 子shell的起始與結束 |
| {} | 命令塊的組合 |
- 命令執行的判斷
| 語句 | 說明 |
|---|---|
| cmd;cmd | 不考慮命令系相關性的連續執行 |
| cmd1 && cmd2 | 若cmd1執行完畢且$?=0, 則開始執行cmd2 |
| 若cmd1執行完畢且$?≠0,則cmd2不執行 | |
| cm1 || cmd2 | 若cmd1執行完畢且$?=0,則不執行cmd2 |
| 若cmd1執行完畢且$?≠0,則執行cmd2 |
