嗨!歡迎回到上班族的命令列生存手冊。一首簡單的歌,讓你的心情快樂。一個簡單的 Shell Script,改善下午上班的心情。終於進入了 Shell Script 的環節,本章節會帶領讀者一起來寫一個實際的 Script 並且跑跑看喔。
老實說本篇並不強制在命令列裡頭手刻 Shell Script,讀者可以使用自己喜歡的編輯器開啟即可(像是 VSCode 換成 Shell Script 模式),先來了解一下什麼是 Shell Script。
就是一連串的 Shell 指令,裡頭可以有一些邏輯判斷,像是 if - else 或是 switch 等判斷式。不過大部分的時間都只是一連串的指令連發。
還記得前幾章節介紹過 echo 指令嗎?以下就是一個超簡單的 Shell Script:
#!/bin/bash
echo "Hi there! $1"
把他存成一個 hello.sh 檔案,試著執行看看。你會發現「不能執行」,但這個不是因為寫壞了,或是有瑟情守門員。是因為這個檔案沒有執行的權限。
筆者先用兩個不同的 Shell Script 示範,一個是可以執行的,一個是不能執行的,就像是上面的範例一樣。
還記得 $ ls -la 會印出 Long Format 嗎?有一個環節到現在還沒解釋,就是前面有一塊像是亂碼的地方。

-rwxr-xr-x. 1 louis383 staff 31  8月 20 21:18 sayHi.sh* -rw-r--r--. 1 louis383 staff 31  8月 20 21:26 sayYo.sh
sayHi.sh 是可以執行的,sayYo.sh 則是不能。可以注意到可以執行的 Script 後面有星星以外,請看開頭的那一串字。那一串字就代表這個檔案能不能被不同的角色讀取、寫入和執行。

這裡需要前情提要一些事情,也把以下的 output 放進來討論:
drwxr-xr-x. 2 louis383 staff  32  8月 20 21:22 newFolder/ lrwxrwxrwx. 1 louis383 staff  10  8月 13 20:59 link -> file
先看第一個字,在 Day13 除了介紹 cp 指令複製檔案以外,還有介紹怎麼建立捷徑。(就不贅述,忘記了記得往前看喔。)如果一個檔案是軟連結,也就是 Symbolic Link,第一個字就會是 l。
接著看資料夾,newFolder 是一個資料夾,他的第一個字是 d。除此之外,一般的檔案都會是 -。
第一個字的意義是提供這個檔案的「檔案類型」,現在知道三種:
- :一般的檔案l:捷徑 Symbolic Linkd:目錄,也就是資料夾前幾章節隱約透漏 POSIX 系統「萬物皆檔案」的設計,也有一些在其他系統 (aka. Windows) 不常見的類型,舉一些範例來說:
b:這是區塊裝置(Block device),例如隨身碟c:字元裝置(Character device),通常是某種輸入裝置,像是鍵盤之類的。古早時期可能是一個終端機。當然不只這幾個,不過這邊還是以經典的三件套(-/l/d)來看就好。
好,知道了第一個字之後,接下來需要「三個字」一組來看。
| 檔案類型 | 擁有者 (User) | 檔案所在群組的人們 (Group) | 其他人 (Other) | 
|---|---|---|---|
| -/l/d | rwx | rwx | rwx | 
先來看 rwx 這一串,這三個文字分別代表三種權限:
r :Read 讀取權限w: Write 寫入權限,可以修改檔案x:Execute 執行權限-:未授權,無權做這件事拿上面筆者的範例檔案作為例子,
-rwxr-xr-x. 1 louis383 staff  31  8月 20 21:18 sayHi.sh*
套到上面的表格中,可以這樣解讀:
| 檔案類型 | 擁有者 (User) | 檔案所在群組的人們 (Group) | 其他人 (Other) | 
|---|---|---|---|
| - | rwx | r-x | r-x | 
| 是檔案! | 作者本人可以讀取、修改、執行! | 檔案群組裡的人,可以讀取、執行,但不能修改 | 閒雜人等,可以讀取、執行,但不能修改 | 
喔?所以 sayHi.sh 可以正常執行,因為擁有者本人可以執行。
再來看看不能執行的那個檔案:
-rw-r--r--. 1 louis383 staff  31  8月 20 21:26 sayYo.sh
套用到表格上面
| 檔案類型 | 擁有者 (User) | 檔案所在群組的人們 (Group) | 其他人 (Other) | 
|---|---|---|---|
| - | rw- | r-- | r-- | 
| 是檔案! | 作者本人可以讀取、修改、但無法執行。 | 檔案群組裡的人,可以讀取,其他禁止。 | 閒雜人等,可以讀取,其他禁止。 | 
看來在調整執行權限以前,擁有者本人製作出來的檔案,也是無法「執行」的!
接下來來分析權限設定裡頭的角色,分別有三位:
權限控管功能非常強大,這種可以設定非常細的權限控制,很適合在多人協作的情境,像是伺服器。
以下舉幾個例子來說明:
你們團隊負責最新 iOS 46 的鍵盤功能,專案目錄叫 project k 。權限怎麼設定呢?
| 擁有者 (User) | 檔案所在群組的人們 (Group) | 其他人 (Other) | 
|---|---|---|
| rwx | rw- | r-- | 
| 你是主管!可以讀取、修改任何內容(你是主管!)、執行編譯 Script 等等,還要可以部屬 Dogfood。 | 同一個團隊的工程師、設計師…等,需要可以編輯程式碼,設計稿。 | 閒雜人等,可以讀取文件之類的吧(嘿我們談論的是庫克時期以後的 Apple) | 
你寫了一個超讚的 Shell Script,可以提昇生產力至少 10 倍(10 倍工程師)但有毒的工作環境讓你不想分享,只想私藏,享受更早下班的特權。權限怎麼設定呢?
| 擁有者 (User) | 檔案所在群組的人們 (Group) | 其他人 (Other) | 
|---|---|---|
| rwx | --- | --- | 
| 你可以讀取、修改內容、執行這個超讚 Script。 | 別想用,連讀取都不行 | 別想用,連讀取都不行 | 
前一陣子公司發表會吹太兇,隨意放無線充電板難產出包,要從網頁上移除掉。因為是一塊蛋糕你做超快,更新好網頁後。權限怎麼設定呢?
| 擁有者 (User) | 檔案所在群組的人們 (Group) | 其他人 (Other) | 
|---|---|---|
| rw- | r-- | r-- | 
| 你可以讀取、修改內容。沒什麼東西需要執行,因為只是網頁。 | 其他人要可以看才行,包含團隊成員。 | 網頁要開放給大家看。 | 
目錄和一般檔案的權限稍微有點不同,尤其是 x 執行權限的意義,和一般檔案有差別。目錄的 x 的意思是:擁有這個目錄的鑰匙,可以進入的權限。
也有這個狀況,有 x 進入的權限,卻沒有 r 讀取權限。這什麼神奇的狀況?在這情境,該使用者可以成功的進去這個目錄,但是看不到任何的檔案,也就是 $ ls 會沒反應。
不過,如果知道想存取的檔案名的話,是可以正常存取的喲!
$ cat /some/dir/my_secret.txt
只要有目標檔案的讀取權限,這樣還是可以正常看到的。
如果狀況反過來,一個目錄只給 r 權限,而不給 x 權限會是怎麼樣呢?就變成能看到該目錄下的檔案($ ls 有反應)但進不去,就像隔著玻璃看裡面的房間。
| 目錄權限 | ls dir(列出內容) | cd dir(進入目錄) | cat dir/file.txt(存取內部檔案) | 
|---|---|---|---|
| r-x(可讀可執行) | 成功 | 成功 | 成功 | 
| r--(僅可讀) | 成功 | 失敗 | 失敗 | 
| --x(僅可執行) | 失敗 | 成功 | 成功 (若你知道檔名) | 
| ---(無權限) | 失敗 | 失敗 | 失敗 | 
寫入權限代表能夠調整該目錄下檔案的能力,例如刪除、建立、移動這個目錄的檔案。如果沒有 w 權限,則以上能力都做不到。
| 權限 | 作用於一般檔案 | 作用於目錄 | 
|---|---|---|
| r(讀取) | 允許讀取檔案的內容 ( cat,less) | 允許列出目錄內的檔名列表 ( ls) | 
| w(寫入) | 允許修改檔案的內容 ( nano,tee) | 允許修改目錄的內容 ( touch,rm,mv) | 
| x(執行) | 允許將檔案作為程式執行 ( ./script.sh) | 允許進入該目錄 ( cd) | 
欸,因為筆者寫到這邊已經半夜了(已哭),所以 Shell Script 篇就先暫時停在這邊,這章節介紹權限怎麼看,下一個章節就可以說明怎麼改變權限,並寫一個 Script,下次見囉。