---
# System prepended metadata

title: 'Lecture 1: Course Overview + The Shell (2020)'
tags: [Missing Semester]

---

# 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/)

  

