都快0202年了,還不會Linux 基礎命令?

  • 2019 年 11 月 25 日
  • 筆記

前言

程式設計師:「我要跑路了,告訴我命令行是rm -rf /*的那個人你小心點。」

rm -rf引發的血案都在菜鳥程式設計師中經常出現,初初入行的前後端們基礎不紮實。

容易出現沒有圖形用戶介面 (GUI)就無從下手,連部署應用都不會的尷尬局面。

竊以為,熟悉掌握Linux下的Vim和常用的命令是每個程式設計師的必修課。

而且,連微軟都擁抱Linux terminal,推出了Windows Terminal。你還有 什麼理由不學?

1. grep:查找文件中的關鍵字

$ grep "string" [選項] file

使用grep命令查找文件中的所有React關鍵字:

  • -i選項可以在文件中不區分大小寫地搜索字元串。它匹配"REACT","REact"和"react"等詞。$ grep -i "REact" file
  • -c (count)選項,可以找到給定字元串/模式匹配的行數$ grep -c "react" index.js

更多的選項可以查看下圖:

2. ls:列出當前路徑中的文件和目錄。

$ ls

ls列出當前路徑中的文件和目錄。

  • 如果為文件夾,則顯示成藍色。
  • 如果為文件,則顯示成灰色

3. pwd: 顯示工作目錄

$ pwd

4. cat:查看文件的內容

$ cat somefile.js

cat 主要有三大功能:

  1. 一次顯示整個文件。
$ cat filename
  1. 創建一個文件,並將前面命令的輸出內容填充進去
br

只能創建新文件,不能編輯已有文件。

  1. 將幾個文件合併為一個文件。 $cat file1 file2 > file

以下例子,將index.js拷貝一份為index2.js

5. echo:字元串的輸出

$ echo "some text"

這是一個內置命令,主要用於 Shell 腳本和批處理文件中,以將狀態文本輸出到螢幕或文件。

6. touch:創建文件

$ touch somefile

touch命令用於創建沒有任何內容的文件。

請注意,在上圖中,我們用touch創建文件和cat查看文件內部的。由於新創建的index2.js文件為空,因此cat不返回任何內容。

以下是cattouch之間的主要區別:

  • cat,用於創建包含內容的文件。
  • touch,創建一個沒有任何內容的空文件。

7. mkdir:創建一個新的空目錄

$ mkdir some-directory

mkdir在當前路徑中創建一個新的空目錄

8.rm:刪除文件/目錄

$ rm [選項] someFile

rm命令用於刪除一個文件或者目錄。

選項:

  • -i 刪除前逐一詢問確認。
  • -f 即使原檔案屬性設為唯讀,亦直接刪除,無需逐一確認。
  • -r 將目錄及以下之檔案亦逐一刪除。

8.1 rmdir:刪除空目錄

$ rmdir some-directory

如果目錄中沒有內容,該命令將刪除目錄。否則返回提示xxx not empty

9. tail:查看文檔的內容

$ tail [選項] somefile

默認顯示文檔的最後 10 行

幾個常用的參數:

  • -f,循環讀取。tail -f notes.log 此命令顯示 notes.log 文件的最後 10 行。當將某些行添加至 notes.log 文件時,tail 命令會繼續顯示這些行。顯示一直繼續,直到您按下(Ctrl-C)組合鍵停止顯示。
  • +,從 xx 行到結尾tail +20 notes.log 顯示文件 notes.log 的內容,從第 20 行至文件末尾。
  • -c,最後 xx 行。tail -c 10 notes.log 顯示文件 notes.log的最後 10 個字元:

tail命令在查看崩潰報告或以前的歷史記錄日誌時很有用:

# tail /var/log/messages  Mar 20 12:42:22 hameda1d1c dhclient[4334]: DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x280436dd)  Mar 20 12:42:24 hameda1d1c avahi-daemon[2027]: Registering new address record for fe80::4639:c4ff:fe53:4908 on eth0.*.  Mar 20 12:42:28 hameda1d1c dhclient[4334]: DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x280436dd)  Mar 20 12:42:28 hameda1d1c dhclient[4334]: DHCPACK from 10.76.198.1 (xid=0x280436dd)  Mar 20 12:42:30 hameda1d1c avahi-daemon[2027]: Joining mDNS multicast group on interface eth0.IPv4 with address 10.76.199.87.  Mar 20 12:42:30 hameda1d1c avahi-daemon[2027]: New relevant interface eth0.IPv4 for mDNS.  Mar 20 12:42:30 hameda1d1c avahi-daemon[2027]: Registering new address record for 10.76.199.87 on eth0.IPv4.  Mar 20 12:42:30 hameda1d1c NET[4385]: /sbin/dhclient-script : updated /etc/resolv.conf  Mar 20 12:42:30 hameda1d1c dhclient[4334]: bound to 10.76.199.87 -- renewal in 74685 seconds.  Mar 20 12:45:39 hameda1d1c kernel: usb 3-7: USB disconnect, device number 2

10. find:搜索文件

$ find path -name filename

find命令可以快速查找文件或目錄。當你正在處理具有數百個文件和多個目錄的大型項目時,此功能很有用。

查找所有名為index.js的文件:

查找指定類型的文件:

$ find . -name "*.js"

11. mv:移動文件

$ mv somefile /to/some/other/path

該 mv 命令將文件或目錄從一個位置移動到另一個位置。

支援移動單個文件,多個文件和目錄。

12. wget:下載文件的工具

$ wget someurl

Wget是一個免費軟體包,用於使用HTTP,HTTPS,FTP和FTPS(最廣泛使用的Internet協議)檢索文件。

這是一個非互動式的命令行工具,因此可以很容易地從腳本,CRON 作業,不支援X-Windows的終端等中調用它。

Wget具有許多使檢索大型文件或鏡像整個 Web 或 FTP 站點變得容易的功能,包括:

  • 可以使用RESTRANGE恢復中止的下載。
  • 可以使用文件名通配符並遞歸鏡像目錄
  • 基於 NLS 的消息文件,適用於多種語言
  • 可將下載的文檔中的絕對鏈接轉換為相對鏈接,以便下載的文檔可以在本地鏈接。
  • 在大多數類似UNIX的作業系統以及Microsoft Windows上運行
  • 支援HTTP代理,cookie 和持久的HTTP連接.
  • 無人值守/後台操作。

13. tree:以樹狀圖列出目錄的內容

常在寫文檔時需要列一下文件目錄結構,這個時候tree命令就能幫個忙了。某些LinuxmacOS上沒有tree命令,需要執行安裝:

  1. 先確保安裝了Homebrew,若沒有則執行:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. 安裝tree命令
brew install tree

效果:

(base) xxx$ tree  .  ├── djangoStudy  │   ├── __init__.py  │   ├── settings.py  │   ├── urls.py  │   └── wsgi.py  └── manage.py    1 directory, 5 files

14. "|":管道命令

通常情況下,我們在終端只能執行一條命令,然後按下回車執行,那麼如何執行多條命令呢?

  • 順序執行多條命令:command1;command2;command3;簡單的順序指令可以通過 ;來實現。
  • 有條件的執行多條命令:which command1 && command2 || command3
    • && : 如果前一條命令執行成功則執行下一條命令,和JavaScript中用法一致
    • || :與&&命令相反,執行不成功時執行下一個。
  • $?: 存儲上一次命令的返回結果
// 栗子:  $ which git>/dev/null && git --help  // 如果存在git命令,執行git --help命令  $ echo $?

而管道命令則可以銜接各種命令的輸出輸入,使得連鎖操作變得簡單。

管道是一種通訊機制,通常用於進程間的通訊(也可通過 socket 進行網路通訊),它表現出來的形式將前面每一個進程的輸出(stdout)直接作為下一個進程的輸入(stdin)

 $ 指令1 | 指令2 | …

管道命令的注意事項:

  • 只能處理前一條指令的正確輸出,不能處理錯誤輸出;
  • 後一條指令,必須能夠接收標準輸入流命令才能執行。

例子:1、分頁顯示 /etc 目錄 中內容的詳細資訊

$ ls -l /etc | more

2、將一個字元串輸入到一個文件中

$ echo "Hello World" | cat > hello.txt

後記 & 引用

  • Here Are 11 Console Commands Every Developer Should Know[1]
  • Linux 管道命令(pipe)[2]
  • MacOS 上使用 tree 命令[3]附贈一張強大無比的Linux命令表

也可以來我的GitHub部落格里拿所有文章的源文件:

前端勸退指南:https://github.com/roger-hiro/BlogFN

參考資料

[1]

Here Are 11 Console Commands Every Developer Should Know: https://medium.com/better-programming/here-are-11-console-commands-every-developer-should-know-54e348ef22fa

[2]

Linux管道命令(pipe): https://www.jianshu.com/p/9c0c2b57cb73

[3]

MacOS上使用tree命令: https://www.jianshu.com/p/f540e8b6e53f