Shell

Shell 是什麼

Shell 是使用者和作業系統互動的介面,平常在終端裡輸入的指令,通常都會先經過 shell 解讀,再執行。

Interactive shell

會和使用者直接互動的 shell。像是打開終端後,直接在裡面打指令,這種通常就是 interactive shell。

Non-interactive shell

不直接和使用者互動,而是拿來執行 script。例如執行 bash script.sh,這種通常就是 non-interactive shell。

Login shell

使用者登入主機系統時啟動的 shell,例如透過 ssh 登入的主機,這類 shell 會讀取登入相關的設定檔。

Non-login shell

不是登入時啟動的 shell,例如多開 screen 或 tmux,這通常就是 non-login shell。

設定檔 適用範圍
~/.bashrc 當前使用者,每次開新終端機,通常給 interactive non-login bash 使用
~/.bash_profile 當前使用者,登入時執行一次,通常和 login shell 有關
/etc/profile 所有使用者,登入時執行,系統全域 login shell 設定

Basic

command 功能 ex
cd 變更目前位置 cd <path>
ls 顯示指定/當前資料夾有多少檔案 ls (flags) (path)
mkdir 創建資料夾 mkdir <name>
mv 移動或重新命名檔案 mv a.txt /b / mv a.txt b.txt
cp 複製檔案
rm 刪除檔案 rm (flags) [file] / rm file.txt / rm -r folder
pwd 當前目錄位置
source / . 在目前 shell 環境讀入並執行,不會開新的 shell source a.sh
./ ./a.sh執行目前目錄下的 a.sh
./ 本身代表目前目錄 ./a.sh
路徑參數
. 當前目錄(僅在當路徑狀況下)
.. 上一資料夾位置
- 上一資料夾位置
# ls 的參數
ls -l # 完整資訊格式(權限、大小、日期)
ls -a # 顯示隱藏檔(就是 . 開頭)
ls -lh  # 檔案大小改 KB/MB/GB 這種格式 不是用 bit 計算
ls -lt  # 依修改時間排序
ls -lS  # 依檔案大小排序

# 別名 alias
# 打 ls 其實是輸出 ls -lA
# 打 ll 其實是輸出 ls -l

alias 自訂名稱='指令'
unalias name
unalias -a # DEL ALL

# 重開就不見了

~/.bash_aliases # 把別名寫到這裡面
source ~/.bashrc # 立即執行

File

cat 列出檔案內容
more <file> / less <file> 用分頁的方式瀏覽內容(兩者有些微差異,less 不會一次讀完所有資料,開比較快,他只讀檔案目前會顯示的部分,動態讀取的意思,more 會一次讀取完,大檔案可能比較久)
tail (flags) <file> 從底部開始列出檔案部分內容
vi / vim (file) 編輯檔案
nano 另一個編輯檔案的
grep <flags> <關鍵字> <file> 查找關鍵字
du -sh 看指定目錄內的檔案總大小
df -h 查看目前已掛載的硬碟使用狀況
這下面的應該比較用不到
tar 壓/解壓縮、打/解包
cut 把一行文字切開,只拿你要的那一塊
awk 進階版的切法,可以順便幫你算數學或過濾
sed 自動把 A 換成 B
diff 比對兩個檔案哪裡不一樣
type 這個指令檔案在哪/是什麼樣的指令
which 這個指令的檔案在哪