嗨!歡迎回到上班族的命令列生存手冊。一首簡單的歌,讓你的心情快樂。一個簡單的 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,下次見囉。