[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沒有此指令) ![](https://i.imgur.com/fTsLxj2.png) ![](https://i.imgur.com/m2Ujgy8.png) 最前面的-表示文件,如果是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` > 原理 ![](https://i.imgur.com/it8RBgW.png) ![](https://i.imgur.com/fX9kTEX.png) * 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會跳出提醒 ![](https://i.imgur.com/GPF0lF7.jpg) ### 進入 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