作為一名軟件開發人員,掌握 Linux 命令是必不可少的技能。即使你使用 Windows 或 macOS,你總會遇到需要使用 Linux 命令的場合。例如,大多數 Docker 鏡像都基于 Linux 系統。要進行 DevOps 工作,你需要熟悉Linux,至少要了解一些常用命令。
在本文中,我將介紹一些我每天使用的命令。如果你是Linux的新手,或者想要更新、提高或加強對 Linux 命令的了解,本文對你可能會有所幫助。不過,本文不會重點介紹像 cd 或 ls 這樣的基礎命令,而是介紹一些從實踐中學到的更高級的命令。
自定義bash提示符
嗯,這個主題本身可以是一篇冗長的文章。不過,我們不需要學習所有的內容。在大多數情況下,我們只需要修改 PS1 變量,該變量指定在每個命令之前顯示的內容。如果不修改它,提示符將顯示路徑,當我們深入到一個文件夾中時,這是非常不方便的。我更喜歡在提示符中只顯示用戶名和當前文件夾,可以通過以下命令設置:
?
linuxmi@linuxmi:~/www.linuxmi.com$ export PS1="[u@W]$"?
這里,u表示當前用戶名,W表示當前工作目錄。[、]和@保持原樣顯示。對于$,如果當前用戶不是root,則顯示$,否則顯示#。更多代碼可以在這里找到。
請注意,如果您希望更改持久化,這個命令和下面顯示的命令應添加到 ~/.bashrc中。
查找文件或文件夾
? 查找文件或文件夾是一個非常常見的需求,可以使用find命令來實現:
# 查找文件: find ~ -type f -name data-model.ts # 查找文件夾: find ~ -type d -name angular15?
請注意,第一個參數是要查找的目標文件或文件夾的路徑。如果未指定類型,默認為文件。
這似乎有點太簡單了 。讓我們來做一些稍微復雜一點的事情。讓我們找一些文件,并統計每個文件的行數:
#查找所有.html文件并計算每個文件的行數: find src/app/ -name "*.html" -exec wc -l {} ;?
請注意這里的魔法語法。-exec 指定了要針對每個找到的文件運行的命令。花括號 {} 是文件的占位符,而轉義的分號 ; 用于防止 shell 解釋該命令。我們也可以使用加號 + 來實現同樣的效果:
find src/app/ -name "*.html" -exec wc -l {} +?
輸出結果會稍有不同。如果命令以 + 結尾,將會打印總計行數。
更改文件和文件夾的權限
更改文件和文件夾的權限也是一個常見任務。我們很容易在權限代碼上感到困惑。這篇文章很好地解釋了權限代碼和不同的組合。在這里,我們只展示最常見的幾個:
# 與其他人共享文件夾,以便他們可以檢查文件夾中的內容: chmod 755?# 與其他人共享不可執行文件: chmod 644 # 與其他人共享可執行文件: chmod 755 # 使文件只讀: chmod 400 # 使文件可執行: chmod +x
建議查看這篇文章中代碼的含義,這太好了,不能在這里重復。
自定義 rm 命令將文件移動到回收站
如果在 Linux 系統上意外刪除了一些文件,恢復它們將非常困難。因此,將 rm 命令設置為將文件或文件夾移動到回收站而不是永久刪除是一種安全策略。我們可以在需要時清空回收站。
這個自定義功能可以通過別名(alias)來實現,在 Linux 上非常方便(稍后會介紹更多相關內容):
alias rm='gio trash'?使用別名可以簡化輸入
如果你有一個帶有許多參數的長命令,或者你有一系列需要一起執行的命令,使用別名非常方便:
?
# 為長命令設置別名: alias dc="docker compose" alias prettier="npx prettier -w" alias eslint="npx eslint --fix" alias pre="pre-commit run --files" # 將一些命令鏈接在一起: alias update-container="docker-compose pull&& docker-compose stop && yes | docker-compose rm && docker-compose up -d "
使用awk從輸入中提取數據
awk是Linux中非常強大的工具。你甚至可以使用awk編寫腳本,盡管可讀性和維護性是另外一個問題。作為軟件開發人員,我們通常使用awk從輸入文件或前一個命令的輸出中獲取所需的字段。
例如,讓我們ping google.com并獲取每個ping的時間:
ping google.com -c 2 | grep -iE 'time=.*ms' | awk 'BEGIN {FS="="} {print $NF}'?
這個命令的重要注意事項:
我們使用-iE來為grep指定一個正則表達式,因此只有與模式匹配的消息將進一步處理。
對于awk來說,BEGIN指定在處理文本之前要執行的命令。在這里,我們指定字段分隔符(FS)應為等號。此外,NF表示字段的數量,$NF將返回最后一個字段。如果你想進一步學習awk,
這是一個很好的參考。
以上命令也可以簡化如下:
ping google.com -c 2 | grep -iE 'time=.*ms' | awk -F"=" '{print $NF}' ping google.com -c 2 | awk -F"=" '/time=.*ms/ {print $NF}'?
在這些簡化版本中,我們還可以利用 awk 的另外兩個功能:
可以直接使用 -F 選項指定字段分隔符。
可以在 awk 中使用正則表達式模式,在花括號之前指定。
使用 xargs 鏈接命令
我們已經展示了使用 -exec 選項可以為 find 命令鏈接命令。一個更好的工具是 xargs,它可以以更靈活的方式鏈接任何命令。
?
# 檢查當前文件夾中每個文件的大小: ls | xargs -I % du -sh % # 查找一些文件并將其復制到新位置: find ~/Downloads/ -name "*.jpeg" | xargs -I {} cp {} ~/Pictures/ # 將所有文件夾和子文件夾的權限更改為755: find . -type d | xargs -I {} chmod 755 {} # 將當前文件夾和子文件夾中所有文件的權限更改為644: find . -type f | xargs -I {} chmod 644 {}?
請注意,-I 選項指定了一個占位符,可以在需要的任何地方使用。占位符可以是任何有效的字符串,其中 % 和 {} 是最常見的。
為腳本傳遞變量
有時我們需要為腳本傳遞一些變量。這些變量可以在運行腳本的命令之前通過命令行指定。例如:
# linuxmi.sh echo mysql -u ${USERNAME} -p${PASSWORD} # 在命令行上: USERNAME=johndoe PASSWORD=12345 bash some_script.sh?
對于在云環境(如Cloud Build)中運行的某些腳本,這一點尤為重要,因為變量可以自動注入。
如果腳本需要許多變量,逐個在命令行中指定會變得很麻煩。在這種情況下,可以將這些變量存儲在文件中,并在運行腳本時進行引用:
# variables.env USERNAME=johndoe PASSWORD=12345 # 在命令行上: env $(grep -v '^#' variables.env | xargs) bash some_script.sh?
請注意,使用此命令時,變量會從目標文件中讀取(注釋除外),并通過xargs命令執行。env命令用于在修改的環境中運行腳本,而不是當前的Shell環境。
重定向STDOUT和STDERR
命令的輸出和錯誤被寫入標準輸出(STDOUT)和標準錯誤(STDERR)。STDOUT和STDERR的文件描述符分別為1和2。默認情況下,STDOUT和STDERR都會輸出到控制臺。然而,我們可以將它們重定向到文件或空設備(/dev/null),即丟棄它們。
?
# 讓我們假設existing.txt存在,而nonexisting.txt不存在。 # 將STDOUT重定向到文件。這是最常見的用例。 ls -al existing.txt 1>out.log # STDOUT的文件描述符是可選的。 ls -al existing.txt >out.log # 將STDOUT重定向到一個文件,將STDOUT重定向到另一個文件。 ls -al existing.txt non-existing.txt 1>out.log 2>error.log # 將STDOUT和STDERR都指向同一個文件: ls -al existing.txt non-existing.txt 1>combined.log 2>&1 # 它可以簡化為: ls -al existing.txt non-existing.txt &>combined.log # 忽略命令的輸出和錯誤: ls -al existing.txt non-existing.txt 1>/dev/null 2>&1 ls -al existing.txt non-existing.txt &>/dev/null?
請注意,不是所有的Shell都支持&>語法。它支持常用的BASH。
命令行模糊查找器
我們可以按下CTRL-R來查找我們使用過的歷史命令。然而,默認情況下,當我們輸入時,它只顯示一個命令,不方便找到我們想要的命令。
幸運的是,fzf極大地增強了CTRL-R的功能。fzf是一個通用的命令行模糊查找器,可以模糊搜索歷史命令。最重要的是,它將匹配的命令顯示為列表,使得找到我們想要的命令非常方便。
?
安裝fzf非常簡單:
# Linux: git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf ~/.fzf/install # 您可以接受所有默認設置. # MacOS: brew install fzf $(brew --prefix)/opt/fzf/install?
如果你之前從未嘗試過fzf,那么絕對值得一試,你會立刻喜歡上它 。
在本文中,介紹了一些實用的Linux命令,如果你還不熟悉它們,它們可以提高你的效率。一篇文章不可能涵蓋所有的Linux命令。然而,我們不需要學習所有的命令,通常只需要學習在工作中實際需要的命令。希望本文能成為你工作中有用的參考。
審核編輯:湯梓紅
?
評論
查看更多