# Lecture 1: Course Overview + The Shell (2020) ###### tags: `Missing Semester` ref: [Lecture 1: Course Overview + The Shell (2020) - YouTube](https://www.youtube.com/watch?v=Z56Jmr9Z34Q) # Using the shell 打開終端機時,你會看到一個 `prompt` 長得像這樣 ``` missing :~$ ``` `prompt` 中文翻作**命令提示字元** 1. missing -> 現在路徑 2. ~ -> 當前使用者目錄的縮寫 3. $ -> 你不是root使用者 ## echo `echo hello` 會print出hello, `echo` 會把後面的argument用空格切開然後print出來 你可以測試 : `echo` My Photos ## Bash Shell * Bash和Python,Ruby一樣,是一個程式語言,所以就會有variable, conditionals, loops, functions,而bash shell基本上就是ipython的感覺,可以直接互動式產生結果 ## 環境變數(Enviroment Variable) 存在 `$PATH` 中的可以呼叫,不然就要把它找出來用,像是下面這樣 ``` missing:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin missing:~$ which echo /bin/echo missing:~$ /bin/echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ``` 上式使用`which echo`時,echo包含在 `/usr/bin/` 裡面,所以可以被找到,如果沒有在環境變數中,那麼就必須 `/bin/echo $PATH` ## 操控Shell (Navigating the shell) 1. 分隔符 Linux/macOS : `/` , Windows: `\\` 2. 從 `/` , `~` 的就是絕對路徑,其他的都是相對路徑 3. `../..` 是可以被使用的 ``` missing:~$ pwd /home/missing missing:~$ cd /home missing:/home$ pwd /home missing:/home$ cd .. missing:/$ pwd / missing:/$ cd ./home missing:/home$ pwd /home missing:/home$ cd missing missing:~$ pwd /home/missing missing:~$ ../../bin/echo hello hello # ``` ## ls, informative command! `ls -l` : list with long listing format - 會給我們一大把資訊 `ls --help` ## Permissions ``` missing:~$ ls -l /home drwxr-xr-x 1 missing users 4096 Jun 15 2019 missing ``` 依序解釋 `drwx-xr-x` `d` : `missing` 是一個資料夾(directory),也可能會出現其他的,例如以下可能會在`d`位置出現的符號有 : |symbol|meaning|note| |------|-------|----| |`s` | `missing` 是一個socket通訊檔案| |`-` | `missing` 是一個一般檔案| |`l` | `missing` 是一個連結檔| |`b` | `missing` 是一個區塊設備(例如 `dev/sda` )|筆者(Yu Long)猜測b指的應該是block| |`c` | `missing` 序列埠設備檔(例如鍵盤滑鼠印表機tty終端)| `rwxr-xr-x` : 這三個符號表示了目前owner對於 `missing` 的權限 : 9個digits拆成3個一組,個別代表了3個部分的使用者權限 分別為(rwx)(r-x)(r-x) (檔案所有者)(使用者群組)(其他使用者) r : read 可讀, w : write 可寫, x : excute 可執行, - : 不可以! 所以 `rwxr-xr-x` : 檔案擁有者 : 可讀可寫可執行 使用者群組 : 可讀不可寫可執行 其他使用者 : 可讀不可寫可執行 ### Permission related command 1. chmod - change mode 2. chown - change owner 3. chgrp - change group 再來繼續解釋 `1 missing users 4096 Jun 15 2019 missing` `1` : 佔用的節點(inode)數量,如果剛檔案是目錄,那這個數值與該目錄下的子目錄數量有關 `missing` : 該檔案的所有者(可能是當前使用者,也可能不是) `users` : 該檔案的所屬群組 `4096` : 該檔案的大小 `4096 Jun 15 2019` : 該檔案最後一次被修改的時間(modified time),依序為 `月份` , `日期` , `時間` `missing` : 檔名 # mv, cp, mkdir `mv` : move `cp` : copy `mkdir` : make a niew directory * 全部都可以 --help或是 `man mv` , `man cp` , `man mkdir` 查看怎麼用 * man的意思是 manual page(手冊) # 關於重定向 (Connecting Program) 在shell中,程式碼有兩種主要的**流向** 1. 流入(input stream) 2. 流出(output stream) 在正常的情況下,input stream和output stream都會是你的終端機(你輸入指令,以及在terminal看到輸出指令) 但你仍然可以重新改變他們的流向,例如以下的例子 ``` # 把hello的output stream丟到 `hello.txt` 檔案中 missing:~$ echo hello > hello.txt missing:~$ cat hello.txt hello missing:~$ cat < hello.txt hello missing:~$ cat < hello.txt > hello2.txt missing:~$ cat hello2.txt hello ``` `>>` : append模式, `>` : 寫入,前者會在檔案中加入output stream,後者會直接把檔案內容直接覆蓋掉。 `|` : pipe 指令可以讓你將左右程式碼串連起來,該output stream會被pipe指令後面的指令繼續操作。 ``` # 列出根目錄的詳細資訊,並且列出最後一行,你可以在 man tail中查看參數意義 missing:~$ ls -l / | tail -n1 drwxr-xr-x 1 root root 4096 Jun 20 2019 var # 你可以一直pipe下去,沒問題的 curl --head --silent google.com | grep --ignore-case content-length | cut --delimiter=' ' -f2 219 ``` 我們在data wrangling(Chapter 4)會提到使用pipe帶來的更多好處 # 通用且強大的工具 sudo 在多數的Unix-like系統中,有一種使用者非常特別, `root` 使用者, `root` 使用者幾乎擁有所有的權限,可取得,創建,讀取,更新,刪除系統中任何檔案,而通常你不會一直使用 `root` 使用者登入,這樣很容易不小心把系統搞壞,通常我們只有使用 `sudo` 指令時,才會告訴系統說,我現在要換成 `root` (或稱為 `super user` ),當你遇到一些權限不足的錯誤時(permission denied errors),很有可能是你必須切換到 `root` 使用者來進行操作,所以一但使用 `root` 使用者,要確認清楚接下來的指令是不是真的你要做的,不然就悲劇了。 另一項你一定得使用 `root` 進行操作的就是 `sysfs` 檔案系統,在 `/sys` 之下 `sysfs` 會把kernel參數當成檔案show給你看,因此你可以輕易的重新配置kernel,不需要任何複雜的工具,不過要注意的是, `sysfs` 指令在Windows上以及macOS上是不存在的。 例如你螢幕的亮度知訊事實上會在一個叫做 `brightness` 的檔案之下 `/sys/class/backlight` 把值寫入該檔案我們就可以調整螢幕亮度,基本上會長得像是下面這樣 ``` $ sudo find -L /sys/class/backlight -maxdepth 2 -name '*brightness*' /sys/class/backlight/thinkpad_screen/brightness $ cd /sys/class/backlight/thinkpad_screen $ sudo echo 3 > brightness An error occurred while redirecting file 'brightness' open: Permission denied ``` 以上你可以看到權限不足的錯誤(Permission denied),所以我們換個方法,先輸入一個值,然後複製到brightness之中 `echo 3 | sudo tee brightness` # Additinal matrials * 關於ls -l, 以前常用的ls -lh 可以display human understandable 的 檔案大小 `(base) YuLong@macpro:~/Desktop$ ls -lh` ``` drwxr-xr-x 51 YuLong staff 1.7K 3 4 02:38 Working_Area -rw-r--r-- 1 yltsai staff 48K 2 26 10:16 ABCDE.eddx ``` * [bash shell中,單引號、雙引號,反引號的區別以及各種括號的區別](https://www.itread01.com/p/129946.html) * [簡明 Linux Shell Script 入門教學](https://blog.techbridge.cc/2019/11/15/linux-shell-script-tutorial/)