# Linux 基本指令(everything is file) ###### tags: `c` `linux` --- 複習linux基本指令筆記,大部分都是邊讀[鳥哥的私房菜](https://linux.vbird.org/)邊作筆記下來的,基本上指令都在終端機man一下就可以觀看細節了,此處只列出部分常用的指令。 **實作平台: [WSL (Windows Subsystem for Linux)](https://docs.microsoft.com/zh-tw/windows/wsl/install-win10)** --- ## linux檔案系統架構 * /bin:主要放置一般使用者可以做的指令 /usr/bin * /boot:主要放置開機相關檔案 * /dev:放置device裝置檔案 * /etc:放置系統檔案 * /home:一般用戶的家目錄 * /lib:放置系統核心函示庫 /usr/lib * /mnt:管理員/使用者手動掛上(mount)的目錄 * /proc:將記憶體內的資料作成檔案 * /root:系統管理者的家目錄 * /sbin:主要放置系統管理者可以做的指令/usr/sbin * /sys:與/proc相似,主要針對硬體參數 * /tmp:Temporary,放暫存檔案 * /usr:Unix Software Resource,放置系統相關軟體服務 * /var:Variable,放置變數或紀錄檔 ## 檔案指令 * `ls`(檔案與目錄顯示): * ls -a:全部檔案,連同隱藏檔(.xxx)都顯示。 * ls -l:長資料串列出。 * `cd`(移動目錄): * cd ~:移動到家目錄。cd \.\. :移動到上一層。cd /:移動到根目錄。 * `pwd`(列印目前工作目錄): * pwd -p:顯示確實路徑,而非連結(link)路徑。 * `mkdir`(建立新的目錄): * mkdir -m:設權限。EX: mkdir -m 777 filename * mkdir -p:遞迴建立。EX: mkdir -p test1/test2/test3 * `rmdir`(刪除"空"目錄): * rmdir -p :遞迴刪除。 * `rm`(刪除檔案或目錄): * ~~rm -f:force意思,忽略不存在的檔案,不出現警告~~。 **一定要少用** * rm -i:互動模式,刪除前會詢問。 * rm -r:遞迴刪除。 * `mv`(移動檔案與目錄,或更改名): * mv -f:如果目標已存在,直接覆蓋它。 * mv -i:互動模式。 * mv -u:如果目標已存在且source較新,才會update。 * `cp`(複製檔案或目錄): * cp -i:若目標檔(destination)已存在,會詢問覆蓋。 * cp -p:連檔案的屬性(權限 用戶 時間)一起copy過去。 * cp -r:遞迴copy過去。 * `cat`(由第一行開始顯示): * cat -b:列出行號(空白不顯示)。 * cat -n:列出行號。 * tac:由最後一行開始顯示。 * `nl` (添加行號列印): * nl -b a:表示不論是否為空行,也同樣列出行號(類似 cat -n); * nl -b t :如果有空白,則跳過列出。(預設值) * `head`(取出前面幾行): * head -n number filename * `tail`(取出後面幾行): * tail -n number filename * `touch`(建立新檔案): * touch test.c * `which`(尋找"執行檔"): * which -a command:將所有PATH目錄中可以找到的指令都列出。 * `whereis`(特定的目錄中尋找檔案名): * whereis -l:列出whereis會去尋找的目錄。 * whereis -b:只找binary格式的檔案。 * whereis -s:只找source來源檔案。 * whereis -m:只找在說明檔manual路徑下的檔案。 * whereis -u:搜尋不再上列敘述的三個項目中,其他特殊檔案。 * `more`(將檔案一頁一頁列印在終端機顯示) **不可往前翻閱** * `less`(將檔案一頁一頁列印在終端機顯示) **可往前翻閱** --- 友人推薦[tldr](https://github.com/tldr-pages/tldr) ![](https://i.imgur.com/lPMe99a.jpg) 輸入指令 $ tldr cp 直接在終端機查看 cp的參數功能。 [Minimum list of useful bash shortcuts](https://manukyan.dev/notes/2019-12-08-minimum-list-of-useful-bash-shortcuts/) ![](https://manukyan.dev/images/moving_cli.png) --- ## 打包&壓縮 * `tar`(打包) : * tar -c: 建立打包文件 * tar -v: 顯示打包過程 * tar -x: 解開已打包的檔案、或解壓縮的檔案 * tar -z: 使用gzip壓縮格式 * tar -f: 被處理的檔名 打包一整個文件並解壓縮成gzip格式: `tar -vcz -f xxx.gz xxx` 解壓縮: `tar -vxz -f xxx.gz` ## 權限相關 在目錄下打上 ls -l會顯示出"-rwxrwxrwx"的資訊。r=可讀,w=可寫,x=可執行。 - 前半部"-rwx"是屬於 owner的權限,-:檔案 d:目錄檔案 l:連結檔。 - 中半部"rwx"是屬於 group的權限。 - 後半部"rwx"是屬於 others的權限。 **分數 r:4 w:2 x:1** owner = rwx = 4+2+1=7 group = rw- = 4+2+0 =6 others = - - - =0+0+0 = 0 * `chmod`(改權限): * chmod 760 filename * -rw-rw-r-- =664 / -rwxr-xr-x =755 * 以上是我最常用的方法,chmod還有其他表示法 * `chown`(改擁有者): * chown -R 帳號名稱/群組名稱 檔案/目錄 * -R: 遞迴更變。 * `chgrp`(改群組): * chgrp -R dirname/filename --- * 檔案特殊權限 內容較細[鳥歌私房菜 第六章](https://linux.vbird.org/linux_basic/centos7/0220filemanager.php#suid_sgid_sbit) * SUID(Set UID) * SGID(Set GID) * SBIT(sticky Bit) ## BASH shell (linux 預設) * [鳥歌私房菜 第10章](https://linux.vbird.org/linux_basic/centos7/0320bash.php#bash) ## 資料流重導向 standard output(標準輸出,**STDOUT**) => 指令所傳回的正確訊息。 standard error output(標準錯誤輸出,**STDERR**) => 指令執行失敗,所傳回的失敗訊息。 **1. 標準輸入(stdin)&nbsp; :代碼0,使用<或<<** **2. 標準輸出(stdout)&nbsp; :代碼1,使用>或>>** **3. 標準錯誤輸出(stderr)&nbsp; :代碼2,使用2>或2>>** 1>:已**覆蓋**方式將「正確的資料」輸出到指定的檔案或裝置上。 1>>:以**累加**方式將「正確的資料」輸出到指定的檔案或裝置上。 2>:已**覆蓋**方式將「錯誤的資料」輸出到指定的檔案或裝置上。 2>>:以**累加**方式將「錯誤的資料」輸出到指定的檔案或裝置上。 **2>/dev/null** = 丟去垃圾桶 - 用於檔案的建立 EX. cat/etc/issue > /tmp/issue => etc/issue 輸出至tmp/issue,如果tmp/issue不存在則建立。 - 要讓alisa指令永久有效要寫入 ~/.bash裡 => echo "alisa cls='clear'" >> ~/.bash - 2>&1:STDOUT與STDERR同時寫入同一個檔案 => find /home -name .bashrc > list **2>&1** => find /home -name .bashrc **&>** list 以上2種結果都一樣 ## 命令執行的判斷依據 * cmd **;** cmd(不考慮指令相關性,連續下達指令) **指令回傳值:若前一個指令執行結果為正確,在Linux底下會傳回一個$?=0的值**。 * cmd1 && cmd2: * 若cmd1執行完畢且正確($?=0),則開始執行cmd2。 * 若cmd1執行完畢且錯誤($?!=0),則不執行cmd2。 * cmd1 || cmd2: * 若cmd1執行完畢且正確($?=0),則不執行cmd2。 * 若cmd1執行完畢且錯誤($?!=0),則開始執行cmd2。 * 管線命令(pipe『|』): * 處理前一個指令傳來的"正確資訊",對stderr沒有處理能力。 ## 擷取命令指令 擷取訊息通常是針對『一行一行』來分析,並非本篇訊息。 * cut(同一行裡面的資料進行分解): * cut -d '分隔字元' -f number <= 用於有特定分隔字元 -f :依據 -d 的分隔字元將一段訊息分割成為數段,用 -f 取出第幾段的意思; * cut -c 字元區間 <=用於排列整齊的訊息 常使用在分析一些數據和文字資料時。 * grep(分析一段訊息,如有符合的資訊就擷取出來): * -a :將 binary 檔案以 text 檔案的方式搜尋資料。 * -c :計算找到 '搜尋字串' 的次數。 * -i :忽略大小寫的不同,所以大小寫視為相同。 * -n :順便輸出行號。 * -v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行。 ## Process [另一篇Process的流程](https://hackmd.io/Zp7uUl5KTpSZSviYantg8w?view#%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1OS) * `&`: 將工作丟到背景去執行。 * `jobs`: 觀察目前的背景工作狀態。 * -l: 列出job number與指令外,同時列出PID。 * -r: 僅列出背景正在run的工作。 * -s: 僅列出正在背景當中暫停的工作。 * 將「目前」的工作丟到背景「暫停」:[ctrl]+z * `fg`(foreground): 背景工作拿到前景處理。 * fg %jobnumber <= %可以省略。 * `bg`(background): 讓工作在背景下的狀態便運行中 * bg %jobnumber。 * `kill`: 管理背景中的工作。 * kill -l: 列出目前kill能使用的signal有哪些。 * kill -signal %jobnumber * -1: 重新讀取一次參數的設定檔。 * -2: 代表與鍵盤輸入[ctrl]+c有同樣的動作,就是通知程式停止。 * -9: "立刻"強制刪除一個工作。 * -15: 以"正常程序"終止一項工作,與-9不同。(預設值) * -19: 相當[ctrl]+z暫停process。 * kill後面數字預設會是PID,如果想管理bash的工作控制需要加上%。 * `ps`: 程序的觀察 * ps aux: 觀察系統所有程序資料。 * ps -lA: 也是觀察系統所有程序的資料。 * ps axjf: 連同部分程序樹狀態。 * -A: 所有process均顯示出來。 * -a: 不與terminal有關的所有process。 * -u: 有效使用者。 * x : 通常與a這個參數一起使用,可以列出完整資料。 * l : 較長較詳細。 * j : 工作的格式。 * -f: 做一個更為完整的輸出。 * ps -l: 只能查自己的bash程序。 * `top`: 動態觀察程序的變化 * top [-d 秒數] | top [-bnp] * -d: 後面接秒數,預設是5秒。 * -b: 以批次執行top,通常搭配資料流重導向。 * -h: 與-b搭,需要進行幾次的top的輸出結果。 * -p: 指定某些個PID來進行觀察監測。 * `pstree` * -A: 個程序樹枝間的連接以ASCII字元來連結。 * -U: 個程序樹之間以萬國碼字元來連結。 * -p: 並同時列出每個process的PID。 * -u: 並同時列出每個process的所屬帳號名稱。 * `killall` * kill [iIe][command] * -i: 互動模式。 * -e: excat的意思,表示要跟後面的command name一致。 * -I: 指令名稱(可能含參數)忽略大小寫。 * 程序的執行順序,只能調整nice值 * 一開始執行程式就給予一個特定的nice值,用nice指令。 * nice[-n 數字] command (nice範圍:-20~19) * 調整某個已經存在的PID的nice值,用renice指令。 * renice [number] PID * `free`: 觀察記憶體使用的情況 * -b :直接輸入 free 時,顯示的單位是 Kbytes,我們可以使用b(bytes),m(Mbytes) k(Kbytes),及 g(Gbytes) 來顯示單位。 * -t :在輸出的最終結果,顯示實體記憶體與 swap 的總量。 * -s :可以讓系統每幾秒鐘輸出一次。 * `uname` -a:所有系統相關的資訊。 * `uptime`: 觀察系統啟動時間與工作負載。 * `dmesg`: 分析核心產生的訊息。