[Linux](http://shenshanlaoyuan.com/PythonTraining/)
===
* Unix、Minix、Linux沿革
* [Unix](https://zh.wikipedia.org/wiki/UNIX) : [Kenneth Lane Thompson](https://zh.wikipedia.org/wiki/%E8%82%AF%C2%B7%E6%B1%A4%E6%99%AE%E9%80%8A)
* [Minix](https://zh.wikipedia.org/wiki/MINIX) : [Andrew Stuart "Andy" Tanenbaum](https://zh.wikipedia.org/wiki/%E5%AE%89%E5%BE%B7%E9%B2%81%C2%B7%E6%96%AF%E5%9B%BE%E5%B0%94%E7%89%B9%C2%B7%E5%A1%94%E8%83%BD%E9%B2%8D%E5%A7%86)
* [Linix](https://zh.wikipedia.org/wiki/Linux) : [Linus Benedict Torvalds](https://zh.wikipedia.org/wiki/%E6%9E%97%E7%BA%B3%E6%96%AF%C2%B7%E6%89%98%E7%93%A6%E5%85%B9)
* 很多OS皆是以Linix的Kernal改成的,如Andriod、OSX
* [Linux Kernel](https://www.kernel.org/)
* ### Graphviz
```graphviz
digraph hierarchy {
nodesep=1.0 // increases the separation between nodes
node [color=Red,fontname=Courier,shape=box] //All nodes will this shape and colour
edge [color=Blue, style=dashed] //All the lines look like this
Unix->{BSD Sun_Solaris IBM_AIX ATandT_System_V}
BSD->{FreeSD}
ATandT_System_V->{Minix}
Minix->{Linux}
Linux->{Ubuntu Redhat SUSE Fedora}
{rank=same;Ubuntu Redhat SUSE Fedora}// Put them on the same level
}
```
* Ubuntu 文件系統
>/ : 根目錄
>/bin : 程序相關
>/boot : 開機相關
>/cdrow : 光碟相關
>/dev : 設備相關
>/etc : 配置相關
>/lib : library
>/home : 家目錄
* Linux Terminal 指令
* ls : 當前目錄清單(list)
* `$ ls /` : 顯示根目錄(指定路徑)的清單
* `$ ls -a` : 顯示指定目錄下所有子目錄與文件(包含隱藏文件)
* `$ ls -l` : 以list方式顯示
* `$ ls -l -h` : 以人性化的方式顯示文件大小
* `$ ls -a -l -h` 與 `$ ls -l -h -a` 顯示相同 ->順序沒差
* `$ ls -a -l -h` = `$ ls -alh`
* `$ ls -al` = ll (Mac沒有此指令)


最前面的-表示文件,如果是d表示文件夾
r表示讀, w表示寫, x表示可執行
rwx: 可讀可寫可執行
r-x: 可讀可執行
r--: 只能讀
* `$ ls --help` : 查看ls(命令)選項功能
* `$ man ls` : 查看ls(命令)文件; man(manual)
>文件內操作:
>q 離開;
>f 下一頁;
>b 上一頁;
>上下鍵移動。
* `$ ls > xxx.txt` : 將欲顯示之資訊寫入xxx.txt文件中(會清空檔案資料)
* `$ ls >> xxx.txt` : 將欲顯示之資訊附加至xxx.txt文件中(不會清空檔案資料)
* 萬用字元 (wildcard character)
* `$ ls 2*` : 顯示開頭2的文件
* `$ ls 2?` : 顯示兩字元的2開頭文件
* `$ ls 2??` : 顯示三字元的2開頭文件
* `$ ls 2?3` : 顯示三字元的2開頭3結尾文件
* `$ ls 2[12345]3` = `$ ls 2[1-5]3` : 顯示213 223 233 243 253文件
* pwd : 顯示當前路徑
* cd : change directory
* `$ cd 指定路徑`
* 想輸入決定路徑卻不知道該怎麼走時,可以案Tab來查詢目前有什麼路徑可以走
* `$ cd ./A` : 前往當前路徑下的A資料夾
* `$ cd ..` : 前往當前路徑下的上一個路徑
* `$ cd ../..` : 往前跳兩個路徑
* `$ cd -` : 快速回到移動前的路徑
* `$ cd ~` : 移動到Home
* touch : 創建文件
* `$ touch 1.txt`
* `$ touch .1.txt` : .開頭->創建隱藏文件
* mkdir : 創建文件夾
* `$ mkdir gogogo`
* 如果我想直接創一個A資料夾裡面創B資料夾,B裡創C,C李創D,一個一個慢慢創太麻煩了
* `$ mkdir A/B/C/D -p` (Mac好像無法,-r也無法)
* 創建軟快捷(原文件砍了,此快捷即作廢)
* `$ ln -s 1.txt(快捷目標) 1-softlink.txt(快捷名)` : 對1.txt創建一個名為1-softlink.txt的快捷
* 創建應快捷(原文件砍了,此快捷還能用)
* `$ ln 1.txt 1-hardlink.txt`
> 原理


* MV :移動或重新命名
* `$ mv 1.txt(目標) 2.txt(命名)` : 將1.txt改為2.txt
* `$ mv 1.txt A` : 將1.txt移動至A資料夾
* CP :複製
* `$ cp 1.txt B` : 將1.txt複製一份至B資料夾中
* `$ cp 1.txt 2.txt` : 將 1.txt 的內容複製到 2.txt
* clear : 清除
* Tab鍵可以自動補齊名稱
* gedit : 文件編輯器
* `$ getit 文件名`
* cat : 查看文件內容(一次顯示所有文件,適合小文件)
* `$ cat 文件名稱`
* `$ cat 1.txt 2.txt` : 顯示1.txt跟2.txt的文件內容
* `$ cat 1.txt 2.txt > xxx.txt` : 把顯示內容存入xxx.txt ->做到合併1.txt跟2.txt的效果
* more : 查看文件內容(分次慢慢顯示,適合大文件)
* `$ more 文件名稱`
* 想查一個資料顯示龐大的,可以先將資料寫入一文件,再以More查看
> `$ ls -alh /bin >> xxx.txt`
> `$ more xxx.txt`
* 但如此會多了一個不必要的文件;故可以用"|", 如此資料會存進|中,more再於|讀取資料
* | : 一個命令的輸出,可以通過管道作為另一個命令的輸入
> `$ ls -alh /bin | more`
* history : 歷史命令
* `$ !指定歷史命令次數` : 執行該次輸入指令
* `上下鍵也能翻歷史命令`
* rm : (remote)
* `$ rm 想刪的文件`
* `$ rm *.txt` : 刪掉所有txt檔
* `$ rm A文件夾 -r` = `$ rmdir A文件夾`
* Control + C : 不執行我所輸入的命令,直接跳下一行
> 用法:不用全選刪掉這麼麻煩
* Tree : 以樹狀圖方式顯示文件
* Grep : 搜索文件裡內容
* `$ grep "s" xxx.txt` : 顯示xxx.txt有s字眼的行
* `$ grep "^s" xxx.txt` : 顯示以s開頭的內容
* `$ grep "s$" xxx.txt` : 顯示以s結尾的內容
* `$ grep -n "s" xxx.txt` : -n -> 顯示行數
* `$ grep -v "s" xxx.txt` : -v -> 顯示沒有s的內容
* Find : 於指定路徑尋找文件或目錄
* `$ find / -name "*name*"` : 於根目錄下尋找有name的文件
* `$ find / -name "name"` : 於根目錄下尋找全名為name的文件
* `$ find ./ -name [A-Z] : 於當前目錄下尋找大寫字母開頭的文件
* `$ find /tmp -size 2M` : 於tmp目錄下尋找文件大小等於2M的文件
* `$ find /tmp -size +4K -size -5M` : 於tmp目錄下尋找 4k<file<5M 之文件
* `$ find ./ -perm 777` : 於當前目錄尋找權限為777的文件
* Tar : 打包與解包
* `$ tar -cvf test.tar *.txt` : 把所有txt檔==打包==成test.tar
* -c : 生成檔案,創建打包文件
* -v : 列出歸檔過程,顯示進度
* -f : 指定檔案文件名,f一定要放最後
* `$ tar -xvf test.tar` : 將test.tar解包
* -x : 解開檔案文件
* `$ tar -zcvf test.tar.gz *.txt` : 將所有txt檔==壓縮==成 test.tar.gz
* `$ tar -zxvf test.tar.gz` : 解壓gz檔
* `$ tae -zxvf test.tar.gz -C gogogo/` : -C 指定路徑
* `$ tar -jcvf yyy.tar.bz2 *.txt` : bz2檔比gz大一點點
* `$ tar -jxvf yyy.tar.bz2` : 解壓bz2檔
* `$ zip zzz.zip *.txt` : 壓縮成zip
* `$ unzip zzz.zip` : 解壓zip
* `$ unzip -d ./gogogo zzz.zip` : -d 指定路徑
* which 查看我用的命令在哪
```
$ which ls
/bin/ls
```
* cal : 日歷
* `$ cal -y 2008` : 2008年日曆
* `$ cal -m 5` : 今年五月日曆
* date : 查看當前時間
* `$ date "+%Y%m%d"` : 20190304
* `$ date "+%Y年%m月%d日"` : 2019年03月04日
* `$ date "+%D"` : 03/04/19
* ps : 查看當前進程 (另外還有top跟htop)
* `$ ps -aux` (mac沒反應)
* `$ kill PID編號` : 關閉程式
* `$ kill -9 PID編號` : 強制關閉程式
* reboot : 重啟OS
* shutdown -h now : 立刻關機
* shutdown -h 20:25 : 20:25關機
* shutdown -h +10 : 十分鐘後關機
* init 0 : 關機
* init 6 : 重開機
* df : 顯示當前磁盤空間
* du : 顯示當下資料夾佔用多大空間
```
$ du -h // -h: 顯示單位
12k ./test3 // 這個資料夾裡的test3資料夾佔用12k
24k . // 這個資料夾總共佔用24k
```
* ifconfig 查看網卡訊息
* `$ ifconfig 網卡名稱 欲設置的網卡IP地址` : 更改IP地址
* `$ ifconfig | grep 172` : 只顯示172的資料
* ping 查看有無正常連線
* `$ ping IP地址或域名(www.google.com)`
1-6 Linux 命令 - 用戶、權限管理
---
* Unix/Linux 係多任務多用戶 <-> Windows 不允許多用戶
> 也就是說Unix/Linux 一個用戶可以同時多人登,一台電腦也可以同時登入多個用戶,Windows 則無法
* useradd : 創建用戶
* `$ useradd ABC(欲創建的用戶名) -m` : 創建 ABC 用戶
* 查看有無成功 : `$ cat /etc/passwd` ,如果有ABC,即創建成功
* `$ useradd -d /home/ABC ABC -m` : 創建ABC用戶,如果 /Home/ABC 不存在,就自動創建這個目錄,同時用戶屬於 ABC
* 設置用戶密碼 / 修改密碼
```
$ passwd ABC
設置新的Unix密碼:
重新輸入新的Unix密碼:
passwd:已設置成功
```
* 切換用戶
* 切換用戶至ABC,工作目錄不會跟著切
```
$ su ABC
密碼:
$ pwd
/home/切換前的帳戶
```
* 切換用戶,同時將當前工作目錄切換至該用戶的主目錄
```
$ su - ABC
密碼:
$ pwd
/home/ABC
```
* 切換至root
```
$ sudo -s
密碼:
# // root權限時,輸入符是 # 而非 $
```
* 刪除用戶
* `$ userdel ABC` : 刪除ABC用戶,但不會刪除用戶的主目錄
* `$ userdel -r ABC` : 連同主目錄一起刪掉
* 查看當前用戶: `$ whoami`
* 查看登入用戶:`$ who`
* 退出登入用戶:`$ exit`
* 遠程登入 : `$ ssh 用戶名@IP地址`
```
$ ssh pokemonovvo(用戶名)@123.45.6.789(IP地址)
The authenticity of host '123.45.6.789(123.45.6.789)' can't be estable ECDSA key fingerprint is SHA256:/O0d2GZ+OZ85kT+GacHP5WrgpMeJwyWBOSfk1x
Are you sure you wnat to continue conneting (yes/no)? yes
Waring: Permanently added '123.45.6.789' (ECDSA) to the list of known pokemonovvo@123.45.6.789's password:
Welcome to ...............
```
* New Tab
* Linux: ^ + ⇧ + T
* Linux 切換: ⌥ + 1/2/3/4/5
* osx: ⌘ + T
* 用戶組
* 用戶組擁有權限,用戶必須在用戶組裡才能使用該用戶組權限!
* 當創建新用戶時,實際上已創建了一個組,該組名與該用戶名相同
* 新創建的帳戶,默認不在sudo組中,無法使用sudo -s指令,需將新創建帳戶加入sudo中才得以使用(adm也是)
```
$ sudo useradd apple -m
$ sudo passwd apple
Enter new UNIX password:
Retype new UNIX password:
passwd: password update succssflly
$ su - apple
password:
$ pwd
/home/apple
$ sudo -s
[sudo]password for apple:
apple is not in sudoers file. This incident will be reported
// 如何解決?
// 將apple user加入sudo group即可
$ sudo usermod -a -G sudo apple
$ sudo -s
[sudo]password for apple:
# whoami
root
```
* 查看用戶組
* 方法一:`$ cat /etc/group`
* 方法二: `$ groupmod` + Tab三次 (mac沒反應)
* 增刪用戶組 `$ groupadd YYY` `$ groupdel YYY`
* 修改文件擁有者
`$ chown apple 1.txt` : 將1.txt的擁有者改成apple
* 修改文件所屬組
`$ chgrp yyy 1.txt` : 將1.txt所屬組別改成yyy
* 修改文件權限 `$ chmod u/g/o/a +/-/= rwx 文件名`
`$ chmod u=rwx 1.txt` : 將1.txt的文件所有者權限改為可讀可寫可執行(-rwx)
`$ chmod u=,g=,o= 1.txt` : 將1.txt所有人的所有權限全部拿掉(----------)
`$ chmod u=rwx,g=r,o=wx 1.txt` = `$ chmod u=7,g=4,o=3 1.txt` (-rwxr---wx)
7=4( r)+2(w)+1(x), 4=r, 3=2(w)+1(x)
|u/g/o|含義|
|--|--|
|u|user|
|g|group|
|o|other|
|a|all|
|+/-/=|含義|
|--|--|
|+|增加權限|
|-|刪除權限|
|=|設定權限|
|rwx|含義|數字法|
|--|--|--|
|r|read|4|
|w|write|2|
|x|excute|1|
|-|沒有權限|0|
Python-編輯器
===
Sublime
---
* 整行 Tab空:選取 + Tab
* 退回 Tab空:選取 + Shift + Tab
* 選取單字 : command + D
* 將選標直接跳到最右邊 : command + 方向右鍵
Vim `$ vi file_name`
--
* 如果你不正常關閉vi,你編輯中的檔案(4.py)會被vi存成隱藏文件(.4.py.swp) -> 用 `$ ls -a` 就會看到,再次打開時該文件時($ vi 4.py) , vi會跳出提醒

### 進入 vi
> - `$ vim`
> - `$ vim 檔名`
### Normal
> - yy : 複製當前行
> - 4yy : 複製4行(從當前行算下去)
> - p : 於當前行下面另開一行貼上
> - dd : 剪下當前行
> - 3dd : 剪下3行(從當前行算下去)
> - D : 剪下當前光標位置至該行末
> - d0 : 剪下當前光標前一個字符至行首
> - dw : 剪下當前光標的字
> - x : 刪除當前光標的字符,相當於 Del
> - X : 刪除光標的前一字符,相當於 Backspace
> - r : 替換當前一個字符
> - R : 替換當前行字符
> - :%s/123/abc/g : 把所有123換成abc
> - :%s/^/#/g : 在所有開頭都加上#
> - :11,16s/123/abc/g : 第11行到16行的123換成abc
> - u : 恢復上一洞
> - ctrl + r : 反恢復上一洞
> - v : 按字移動, 選取
> - V : 按行移動, 選取
> - \>\> : 整行向右移動
> - << : 整行向左移動
> - . : 執行上一個操作指令
> #### 移動
> - `h` : 左
> - `l` : 右
> - `k` : 上
> - `j` : 下
> - 上下會記憶位置, 上下行的字數不夠時, 會到該行頁尾,
> 到下行字數夠時, 會回到該列垂直位置
> - [VimAdventures](https://vim-adventures.com/) : 讓你習慣 vim 移動方式的小遊戲
> - `w` ( word ): 向後移一字首處, 遇到符號會停下來
> - `W` : 向後移字首處, 遇到符號不會停下來
> - `b` ( back ): 往回移字首處, 遇到符號會停下來
> - `B` : 往回移字首處, 遇到符號不會停下來
> - `}` : 按段移動, 下移
> - `{` : 按段移動,上移
> - `G` : 移至文件末尾
> - `gg` : 移至文件開頭
> - `20G` : 移至第20行
> - `0` : 跳到該行最前面
> - `^` : 跳到該行有字的最前面
> - `$` : 跳到開航有字的最後面
> - H : 移到畫面最上行
> - M : 移到畫面中間行
> - L : 移到畫面最下行
> - ^ + f : 往下翻頁
> - ^ + b : 往上翻頁
> - ^ + d : 往下翻半頁
> - ^ + u : 往上翻半頁
> - / : 搜尋
> - n : 下一個
> - N : 上一個
### EX模式
> - `:w` : 儲存
> - `:w 檔名`
> - `:q` : 退出
> - `:wq` : 儲存並退出
> - `shift + zz` = :wq = :x:
### Insert
> - ctrl + n : 自動補齊曾輸入過的單字
> - `i` ( insert ) : 光標
> - `a` ( append ) : 光標後
> - `o` ( new line ): 新行
> - `Ctrl + [` 或 `esc` : 回到一般模式
### other
> - `ctrl + z` : 把vim放到背景
> - `$ fg` : 叫回
> - vi a.py +11 : 用 vi 打開 a.py, 並直接跳到第11行
> - Windows 使用 Vi 可能有點卡手, 可以考慮使用 [WSL](https://blog.miniasp.com/post/2019/02/01/Useful-tool-WSL-Windows-Subsystem-for-Linux) 來跑 Linux