Linux 基礎 1:Shell、檔案系統與常用指令¶
目標:讓你在 Linux 終端機裡「住得舒服」。這是後面一切的操作基礎 ——
kubectl、docker、aws全都在 Shell 裡跑。
1. Shell 是什麼?¶
Shell(殼層) 是你和核心 (Kernel) 之間的翻譯官。你打字下指令,Shell 解讀後請核心執行,再把結果顯示給你。
graph LR
You[你打的指令] --> Shell[Shell<br/>bash / zsh]
Shell -->|解讀並呼叫| Kernel[核心 Kernel]
Kernel -->|結果| Shell --> You
最常見的 Shell 是 bash(Bourne Again Shell),較新的系統預設可能是 zsh。指令用法大同小異。
💡 提示字元 (Prompt):
$代表一般使用者,#代表 root(超級使用者)。看到#就要小心,你有最高權限。
2. 檔案系統階層 (Filesystem Hierarchy)¶
Linux 的檔案系統是一棵從根目錄 / 開始的樹,沒有 Windows 的 C:、D: 槽概念。所有東西(包含硬碟、USB)都「掛載 (mount)」到這棵樹的某個位置。
graph TD
root["/ 根目錄"] --> bin["/bin 基本指令"]
root --> etc["/etc 系統設定檔"]
root --> home["/home 一般使用者家目錄"]
root --> var["/var 變動資料(日誌等)"]
root --> tmp["/tmp 暫存檔"]
root --> usr["/usr 應用程式"]
root --> proc["/proc 行程與核心資訊(虛擬)"]
root --> sys["/sys 核心與裝置(虛擬)"]
root --> dev["/dev 裝置檔"]
home --> u1["/home/you"]
| 目錄 | 用途 | 跟 K8s/容器的關聯 |
|---|---|---|
/etc |
設定檔(設定都放這) | 容器映像檔裡也有 /etc;K8s 的 ConfigMap 常掛載到這 |
/var |
變動資料,如 /var/log 日誌 |
容器日誌、容器執行時資料 (/var/lib/docker) |
/proc |
虛擬檔案系統,每個行程的資訊在這 | 理解命名空間時超重要(見第 4 章) |
/sys |
虛擬檔案系統,核心與 cgroup 資訊 | cgroup 限制就寫在 /sys/fs/cgroup |
/dev |
裝置檔(磁碟、終端機…) | 「一切皆檔案」的體現 |
/tmp |
暫存,重開機通常清空 | — |
🔑
/proc和/sys不是真的存在磁碟上的檔案,而是核心「即時生成」的視窗。你cat它們時,看到的是核心當下的狀態。這對理解容器原理非常關鍵。
絕對路徑 vs 相對路徑¶
/home/you/notes.txt # 絕對路徑:從根目錄 / 開始,永遠明確
notes.txt # 相對路徑:相對於「目前所在目錄」
../config # .. 代表上一層目錄
./script.sh # . 代表目前目錄
~ # 代表你的家目錄 /home/you
3. 必學的核心指令¶
移動與查看¶
pwd # print working directory:我現在在哪
ls # 列出目前目錄內容
ls -l # 詳細列表(權限、擁有者、大小、時間)
ls -la # 連隱藏檔(. 開頭)一起列
ls -lh # 大小用人類易讀格式(K/M/G)
cd /etc # 切換到 /etc
cd ~ # 回家目錄
cd - # 回到上一個目錄
tree # 樹狀顯示(可能需 apt install tree)
檔案與目錄操作¶
mkdir myproject # 建目錄
mkdir -p a/b/c # -p:連同中間層一起建
touch file.txt # 建空檔(或更新時間戳)
cp source.txt dest.txt # 複製檔案
cp -r dir1 dir2 # -r:遞迴複製整個目錄
mv old.txt new.txt # 移動或改名
rm file.txt # 刪檔
rm -r dir/ # 刪目錄(遞迴)
rm -rf dir/ # 強制遞迴刪(⚠️ 危險,不會問你)
⚠️
rm -rf沒有資源回收桶。 刪掉就沒了。特別小心rm -rf /或變數沒設好時的rm -rf $VAR/。
看檔案內容¶
cat file.txt # 整個印出來
less file.txt # 分頁瀏覽(q 離開,/ 搜尋,上下鍵捲動)
head -n 20 file.txt # 前 20 行
tail -n 20 file.txt # 後 20 行
tail -f app.log # -f:持續追蹤新增內容(看即時日誌神器)
wc -l file.txt # 算行數
💡
tail -f你之後會在看容器日誌時天天用到(kubectl logs -f就是這個概念)。
4. 搜尋:find 與 grep(超重要)¶
grep:在內容裡找文字¶
grep "error" app.log # 找含 error 的行
grep -i "error" app.log # -i:不分大小寫
grep -r "TODO" ./src # -r:遞迴搜整個目錄
grep -n "error" app.log # -n:顯示行號
grep -v "debug" app.log # -v:反向,排除含 debug 的行
grep -c "error" app.log # -c:只算數量
find:依條件找檔案¶
find . -name "*.yaml" # 在目前目錄(含子目錄)找所有 .yaml
find /etc -name "*.conf" # 找設定檔
find . -type d -name "logs" # -type d:只找目錄
find . -mtime -1 # 最近 1 天內修改過的
find . -size +100M # 大於 100MB 的檔案
5. I/O 重導向與管線(Linux 哲學的精華)¶
這是 Linux 最強大的概念之一,務必搞懂。每個行程預設有三個資料流:
| 名稱 | 代號 | 說明 |
|---|---|---|
| 標準輸入 (stdin) | 0 |
預設來自鍵盤 |
| 標準輸出 (stdout) | 1 |
預設印到螢幕 |
| 標準錯誤 (stderr) | 2 |
錯誤訊息,預設也印到螢幕,但與 stdout 分流 |
重導向 (Redirection)¶
echo "hello" > file.txt # > 把 stdout 寫入檔案(覆蓋)
echo "world" >> file.txt # >> 附加到檔案結尾(不覆蓋)
command < input.txt # < 把檔案當 stdin 餵進去
command 2> error.log # 2> 把 stderr 導到檔案
command > out.log 2>&1 # stdout 和 stderr 都導到 out.log
command > /dev/null 2>&1 # 丟棄所有輸出(/dev/null 是黑洞)
管線 (Pipe) |:把上一個指令的輸出,當作下一個的輸入¶
# 找出 nginx 相關的行程
ps aux | grep nginx
# 算出目前有幾個 .yaml 檔
ls *.yaml | wc -l
# 看日誌裡 error 出現最多的前 10 種
grep "error" app.log | sort | uniq -c | sort -rn | head -10
graph LR
A["ps aux<br/>(列所有行程)"] -->|stdout 變 stdin| B["grep nginx<br/>(過濾)"] --> C[螢幕顯示]
🔑 Linux 哲學:每個工具只做好一件事,再用管線把它們串起來組合出強大功能。這個「組合小工具」的思維,你在 K8s 排錯時會反覆用到(
kubectl get pods | grep ...)。
常搭配管線的工具¶
sort # 排序
uniq -c # 去除重複並計數(需先 sort)
cut -d: -f1 # 以 : 分隔,取第 1 欄(例如解析 /etc/passwd)
awk '{print $1}' # 取第 1 欄(更強大的文字處理)
sed 's/old/new/g' # 文字取代
xargs # 把 stdin 變成下一個指令的參數
6. 環境變數 (Environment Variables)¶
環境變數是「行程執行時帶在身上的設定」。容器與 K8s 大量用環境變數傳設定。
echo $HOME # 顯示某個變數
echo $PATH # PATH:系統去哪些目錄找可執行檔
export MY_VAR="hello" # 設定環境變數(子行程會繼承)
env # 列出所有環境變數
MY_VAR=hi command # 只在這次執行時設定變數
💡
PATH很重要:當你打kubectl,系統會依序在$PATH列出的目錄裡找這個執行檔。找不到就會說command not found。
7. 取得說明¶
man ls # 完整手冊(q 離開)
ls --help # 快速說明
tldr ls # 簡明範例(需安裝 tldr,推薦)
which kubectl # 這個指令的執行檔在哪
type cd # 這是指令、別名還是 shell 內建?
動手練習¶
- 檔案系統探索:用
cd、ls -la、pwd逛一圈/、/etc、/var/log、/proc。打開/proc/cpuinfo和/proc/meminfo看看(cat),這些是核心即時生成的。 - 建立練習區:
mkdir -p ~/linux-practice/{a,b,c},在裡面建幾個檔案,練習cp、mv、rm。 - 管線挑戰:用一行指令,找出
/etc/passwd裡所有使用者名稱(提示:cut -d: -f1 /etc/passwd),並用wc -l數出系統有幾個使用者。 - 日誌過濾:
dmesg(核心訊息)用管線接grep和tail,找出最近的訊息。 - 重導向練習:把
ls -la /etc的結果存到~/etc-list.txt,再用wc -l數有幾行。把一個會出錯的指令(如ls /not-exist)的錯誤訊息導到error.log。
本節檢核點¶
- [ ] 能說出
/etc、/var、/proc、/sys、/dev各放什麼。 - [ ] 理解
/proc與/sys是核心即時生成的虛擬檔案系統。 - [ ] 熟練
cd、ls、cp、mv、rm、mkdir、cat、less、tail -f。 - [ ] 會用
grep與find搜尋內容與檔案。 - [ ] 理解 stdin/stdout/stderr 與
>、>>、2>、2>&1、|的用法。 - [ ] 能用管線把多個指令組合起來解決問題。
- [ ] 理解環境變數與
$PATH的作用。
➡️ 下一節:行程管理