當前位置: 妍妍網 > 碼農

極大提高工作效率的 Linux 命令

2024-03-22碼農

連結:https://www.linuxmi.com/linux-commands-for-improving-work-efficiency.html

作為一名軟體開發人員,掌握 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 {} +

輸出結果會稍有不同。如果命令以 + 結尾,將會打印總計行數。

更改檔和資料夾的許可權

更改檔和資料夾的許可權也是一個常見任務。我們很容易在許可權程式碼上感到困惑。這篇文章(https://www.linuxmi.com/linux-file-permissions.html)很好地解釋了許可權程式碼和不同的組合。在這裏,我們只展示最常見的幾個:

# 與其他人共用資料夾,以便他們可以檢查資料夾中的內容:chmod755 <path-to-your-folder># 與其他人共享不可執行檔:chmod644 <path-to-your-file># 與其他人共享可執行檔:chmod755 <path-to-your-file># 使檔唯讀:chmod400 <path-to-your-file># 使檔可執行:chmod +x <path-to-your-file>

建議檢視這篇文章中程式碼的含義,這太好了,不能在這裏重復。

自訂 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 <service-name> && docker-compose stop <service-name> && yes | docker-compose rm <service-name> && docker-compose up -d <service-name>"

使用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.shecho mysql -u ${USERNAME} -p${PASSWORD}# 在命令列上:USERNAME=johndoe PASSWORD=12345 bash some_script.sh

    對於在雲環境(如Cloud Build)中執行的某些指令碼,這一點尤為重要,因為變量可以自動註入。

    如果指令碼需要許多變量,逐個在命令列中指定會變得很麻煩。在這種情況下,可以將這些變量儲存在檔中,並在執行指令碼時進行參照:

    # variables.envUSERNAME=johndoePASSWORD=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>&1ls-al existing.txt non-existing.txt &>/dev/null

    請註意,不是所有的Shell都支持&>語法。它支持常用的BASH。

    命令列模糊尋找器

    我們可以按下CTRL-R來尋找我們使用過的歷史命令。然而,預設情況下,當我們輸入時,它只顯示一個命令,不方便找到我們想要的命令。

    幸運的是,fzf極大地增強了CTRL-R的功能。fzf是一個通用的命令列模糊尋找器,可以模糊搜尋歷史命令。最重要的是,它將匹配的命令顯示為列表,使得找到我們想要的命令非常方便。

    安裝fzf非常簡單:

    # Linux:git clone --depth 1https://github.com/junegunn/fzf.git ~/.fzf~/.fzf/install# 您可以接受所有預設設定.# MacOS:brew install fzf$(brew --prefix)/opt/fzf/install

    如果你之前從未嘗試過fzf,那麽絕對值得一試,你會立刻喜歡上它 😍。

    在本文中,介紹了一些實用的Linux命令,如果你還不熟悉它們,它們可以提高你的效率。一篇文章不可能涵蓋所有的Linux命令。然而,我們不需要學習所有的命令,通常只需要學習在工作中實際需要的命令。希望本文能成為你工作中有用的參考。

    往期推薦


    點亮,伺服器三年不宕機