missing semester - The shell
shell如何尋找諸如echo、date的命令?
shell 是一個程式設計環境,所以它具備變數、條件、迴圈和函式。在 shell 中執行命令時,實際上是在執行一段 shell 可以解釋執行的簡短程式碼。如果使用者要求 shell 執行某個指令,但是該指令並不是 shell 所瞭解的程式設計關鍵字,那麼它會去查詢 環境變數 (environment variable)$PATH
,它會列出當 shell 接到某條指令時,進行程式搜尋的路徑。
當執行 echo
命令時,shell 瞭解到需要執行 echo
這個程式,隨後它便會在 $PATH
中搜索由 :
所分割的一系列目錄,基於名字搜尋該程式。當找到該程式時便執行。
確定某個程式名代表的是哪個具體的程式,可以使用 which
程式。
Navigating in the shell
以Linux/Mac OS為例說明檔案系統的使用:
路徑 /
代表的是系統的根目錄。
如果某個路徑以 /
開頭,那麼它是一個 絕對路徑。
其他的路徑都是 相對路徑 。相對路徑是指相對於當前工作目錄的路徑,當前工作目錄可以使用 pwd
命令來獲取。
切換目錄需要使用 cd
命令。
在路徑中,.
表示的是當前目錄,而 ..
表示上級目錄(空目錄中也包含.
和..
)。
一般來說,當執行一個程式時,如果沒有指定路徑,則該程式會在當前目錄下執行。
大多數的命令接受標記(Flag)和選項(帶有值的標記)(Option),它們以 -
-h
或 --help
標記可以列印幫助資訊,以便了解有哪些可用的標記或選項。
這個引數可以打印出更加詳細地列出目錄下檔案或資料夾的資訊。
第一個字元 d
表示 missing
是一個目錄。
然後接下來的九個字元,每三個字元構成一組(rwx
)。它們分別代表了檔案所有者(missing
),使用者組(users
) 以及其他所有人具有的許可權。其中 -
表示該使用者不具備相應的許可權。
為了進入某個資料夾,使用者需要具備該資料夾以及其父資料夾的“搜尋”許可權(以“可執行”:x
)許可權表示。
為了列出它的包含的內容,使用者必須對該資料夾具備讀許可權(r
命令 | 完成動作 | 注意事項 |
---|---|---|
pwd |
列印當前工作目錄 | |
cd |
切換目錄 | cd -: 切換空間 |
ls |
檢視指定目錄下包含哪些檔案 | |
mv |
重新命名或移動檔案 | source->dest |
cp |
拷貝檔案 | source->dest |
rm |
刪除檔案 | 刪除資料夾需要使用-r(遞迴)標記 |
mkdir |
新建資料夾 | 空格間隔會建立多個資料夾 |
rmdir |
刪除資料夾 | 只能刪除空資料夾 |
Connecting programs
在 shell 中,程式有兩個主要的“流”:
- 輸入流:當程式嘗試讀取資訊時,它們會從輸入流中進行讀取。
- 輸出流:當程式列印資訊時,它們會將資訊輸出到輸出流中。
通常,一個程式的輸入輸出流都是終端(程式會預設開啟0-2三個fd表示輸入、輸出、錯誤)。
符號 | 動作 |
---|---|
< file1 |
重定向file1至輸入流 |
> file2 |
重定向file2至輸出流 |
>> file3 |
向一個檔案追加內容 |
command1 | command2 |
將一個程式(command1)的輸出作為另外一個程式(command2)的輸入 |
A versatile and powerful tool
對於大多數的類 Unix 系統,根使用者(root user)是非常特殊的。
根使用者幾乎不受任何限制,他可以建立、讀取、更新和刪除系統中的任何檔案。
通常在我們並不會以根使用者的身份直接登入系統,因為這樣可能會因為某些錯誤的操作而破壞系統。 在需要的時候使用 sudo
命令。顧名思義,它的作用是可以以 su(super user 或 root 的簡寫)的身份執行一些操作。 當遇到拒絕訪問(permission denied)的錯誤時,通常是因為此時必須是根使用者才能操作。
對於|
、>
、和 <
,需要注意一點,sudo需要加在對應程式前(修改顯示器亮度,前者不行,後者可以,tee
用於讀取標準輸入的資料,並將其內容輸出成檔案)。
$ sudo echo 3 > brightness
An error occurred while redirecting file 'brightness'
open: Permission denied
$ echo 3 | sudo tee brightness