Bash shell介紹

Bash是目前大多數系統上的默認shell,包括Linux、macOS以及Windows 10上的WSL。 註:自Catalina(2019年秋季)以來,macOS使用Zsh 有一些歷史原因使得Bash成為世界上最受歡迎的shell。在1989年,當Bash首次發布時,技術世界與現在相去甚遠。當時,UNIX世界中的大多數軟件都是封閉源碼的。Unix本身是專有的,也是封閉源碼的。 要使用Unix系統,您必須使用一個shell。 當時最受歡迎的shell是封閉源碼的,您需要支付費用才能使用它。它被稱為“Bourne shell”,在/bin/sh命令下可用。它之所以被稱為“Bourne”是因為它的創作者是Steve Bourne。 在那些年,Richard Stallman與GNU項目(後來又是Linux)即將引起革命,開始了開源革命。 GNU項目需要一個shell,於是Bash應運而生。Bash受到Bourne Shell的極大啟發,Bash代表“Bourne再次shell”,它是GNU項目的一個重要組成部分,也是該項目最成功的軟件之一,我們仍然在今天使用。 Bash可以執行所有為sh編寫的腳本,這對於其采用是一個必要的功能,它還引入了更多功能,從最早的版本開始,為其用戶提供更好的體驗。從那時以來,Bash獲得了很多改進。本教程介紹了您可以使用Bash執行的最常見和有用的操作。 Bash的第一步 由於Bash是許多系統的默認shell,您只需要開始bash shell就只需以下操作: 登錄到系統(如果是服務器)。 打開終端(如果是您的計算機)。 開始shell後,您應該看到一個提示符(通常以$結尾)。 如何確定shell正在運行bash?請嘗試輸入help並按Enter。 看到了嗎?我們剛才告訴Bash執行help命令。該命令顯示您正在運行的Bash版本以及您可以使用的命令列表。 警告:看到我那裡有的版本了嗎?這是macOS隨附的默認Bash版本,由於許可問題,它不包含更高版本。這個Bash版本來自於2014年。輸入brew install bash使用Homebrew安裝最新的Bash 5.x。 除非您正在創建shell腳本或進行高級操作,否則您通常不會使用bash說明中列出的任何命令。 99%的日常shell使用是在文件夾之間導航和執行像ls,cd和其他常見UNIX實用程序的程序。 瀏覽文件系統 要瀏覽文件系統,您將使用ls命令。它在/bin/ls中可用,並且由於Bash將/bin文件夾列在其路徑列表中,因此您只需輸入ls即可使用它。 ls會列出當前文件夾中的文件。您通常從您的主文件夾開始,它取決於系統,但在macOS下位於/Users下。我的主文件夾位於/Users/flavio。這與Bash無關,而是有關UNIX文件系統的事情,但參數重疊,如果您從未使用過shell,了解這些是很有益的。 要導航到其他文件夾,請使用cd命令,後跟要移動到的文件夾的名稱: cd Documents cd ..會返回到上級文件夾。 根據您的Bash配置,您將在提示符($符號)之前看到您當前的文件夾。或者,您可能不會看到它,但您始終可以通過輸入“pwd”並按Enter來知道您的位置。 pwd表示“工作目錄的路徑名” 命令行編輯 在shell中編寫命令時,請注意您可以使用箭頭鍵向左或向右移動。這是一個shell特性。您可以移動到命令周圍,按退格鍵進行修正。按下Enter鍵會告訴shell繼續並讓系統執行該命令。 這是正常且可接受的行為,但這可能使早期的UNIX用戶感到“驚訝”。 通過鍵盤組合,您可以快速進行編輯,而無需使用箭頭鍵: ctrl+d 刪除當前選定的字符 ctrl+f 跳轉到右邊的字符 ctrl+b 跳轉到左邊的字符 自動完成 Bash在移動文件系統時具有自動完成的功能。嘗試輸入cd Doc 然後按tab鍵,Bash會自動將其完成為cd Documents。如果這些首個字符有多個選擇,Bash將返回列表,以便您可以輸入一些其他字符以幫助它刪除歧義,然後再次按tab鍵以完成。 Shell命令 使用shell,我們可以執行系統中可用的命令。我們可以在命令前綴中使用完整路徑(例如/bin/ls以列出文件夾中的文件),但是shell具有“路徑”的概念,因此我們可以只輸入ls,它就知道大多數命令都在哪裡(我們還可以通過配置它來添加文件夾到這個路徑)。 命令接受參數。例如,ls /bin將列出/bin文件夾中的所有文件。 參數以破折號-為前綴,例如ls -a 告訴 ls 顯示隱藏文件。按照約定,隱藏文件以點(.)開頭。 常見的shell命令 任何系統上都預先安裝了許多命令,這些命令因具體的系統(Linux/macOS)或甚至所用的Linux發行版而異。 然而,讓我們簡單回顧一下您可以運行的最常用shell命令。這些不是shell本身提供的命令,而是通過shell調用的命令行命令。 每當您遇到問題時,例如您不知道一個命令的作用,或者不知道如何使用它,使用man命令。它可以讓您獲得我將列出的所有命令以及更多的命令的幫助。例如,運行man ls。 這些是可以查看、操作文件的命令。 ls:列出文件 cd:更改目錄 rm:刪除文件或文件夾 mv:將文件移動到另一個目錄或更改文件名 cp:複製文件 pwd:顯示當前工作目錄 mkdir:創建文件夾 Unix文件系統中的每個文件都有權限。chmod允許您更改權限(我們現在不深入討論),chown允許您更改文件的所有者。...

Linux 命令:find

快速指南,介紹用於在文件系統上查找文件和文件夾的 find 命令。 find 命令用於查找與特定搜索模式匹配的文件或文件夾。它可以遞歸搜索。 讓我們通過例子來學習它。 查找當前目錄下具有 .js 擴展名的所有文件,並打印每個匹配文件的相對路徑: find . -name '*.js' 重要提示:使用引號引起來處理特殊字符,例如 *,以避免shell解釋它們。 查找當前目錄下名稱為 “src” 的目錄: find . -type d -name src 使用 -type f 只搜索文件,使用 -type l 只搜索符號鏈接。 -name 區分大小寫,使用 -iname 執行不區分大小寫的搜索。 你可以在多個根目錄下進行搜索: find folder1 folder2 -name filename.txt 查找當前目錄下名稱為 “node_modules” 或 ‘public’ 的目錄: find . -type d -name node_modules -or -name public 你還可以使用 -not -path 排除某個路徑: find . -type d -name '*.md' -not -path 'node_modules/*' 你可以搜索具有超過 100 個字符(字節)的文件:...

Linux 命令:grep

快速指南 grep 命令,用於在文本中匹配模式。 grep 命令是一種非常有用的工具,當您掌握它時,將在您的日常工作中大大幫助您。 如果您想知道,grep 代表全局正則表達式打印 您可以使用 grep 在文件中搜索,或將其與管道結合以過濾另一個命令的輸出。 例如,這裡是如何在 index.md 文件中查找 document.getElementById 行的出現次數: grep -n document.getElementById index.md 使用 -n 選項將顯示行號: grep -n document.getElementById index.md 其中一個非常有用的功能是告訴 grep 在匹配行之前和之後打印 2 行,以提供更多上下文。這可以使用 -C 選項完成,該選項接受一個行數: grep -nC 2 document.getElementById index.md 默認情況下,搜索區分大小寫。使用 -i 標誌使其不區分大小寫。 正如前面提到的,您可以使用 grep 過濾另一個命令的輸出。我們可以使用以下方式復制上面的功能: less index.md | grep -n document.getElementById 搜索字符串可以是正則表達式,這使得 grep 具有很強的功能。 您可能會發現非常有用的另一個功能是反轉結果,排除匹配特定字符串的行,使用 -v 選項: grep 命令可在 Linux、macOS、WSL 和任何具有 UNIX 環境的地方運行。

Linux 指令:alias

快速指南,介紹 alias 指令,用於建立對其他指令的快捷方式。 通常,我們會使用一組自訂的選項運行程式。 以 ls 指令為例。默認情況下,它只會顯示很少的資訊: 但是,使用 -al 選項時,它將顯示更多有用的資訊,包括檔案的修改日期、大小、擁有者和權限,同時還會列出隱藏檔案(以 . 開頭的檔案): 你可以建立一個新的指令,比如我喜歡叫它 ll,它會成為 ls -al 的別名。 你可以使用以下方式建立這個別名: alias ll='ls -al' 建立完後,你可以像使用一個普通的 UNIX 指令一樣呼叫 ll: 現在,只呼叫 alias 指令而不使用任何選項,將會列出所有已定義的別名: 別名會在終端機會話結束前一直有效。 若要使其永久生效,你需要將其添加到 shell 配置文件中,依據使用的 shell 不同,配置文件可能是 ~/.bashrc、~/.profile 或 ~/.bash_profile。 如果指令中包含變數,注意使用引號:使用雙引號時,變數在定義時解析;使用單引號時,變數在調用時解析。這兩者是不同的: alias lsthis="ls $PWD" alias lscurrent='ls $PWD' $PWD 代表 shell 目前所在的資料夾。如果你切換到新資料夾,lscurrent 將列出新資料夾中的檔案,而 lsthis 仍會列出你定義別名時所在資料夾的檔案。 alias 指令適用於 Linux、macOS、WSL,以及任何具有 UNIX 環境的地方。

linux-command-clear

#Linux命令:clear 快速指南:clear命令,用於清除終端的屏幕。 輸入clear以清除當前終端中過去執行的所有命令。 屏幕將清除,您將只看到頂部的提示符: 注意:這個命令有一個方便的快捷鍵:ctrl-L 這樣做后,您將無法滾動查看先前輸入的命令的輸出。 因此,您可能想使用clear -x,它仍然清除屏幕,但允許您向上滾動查看先前的工作。 clear命令適用於Linux、macOS、WSL和任何擁有UNIX環境的地方

linux-command-pwd

#Linux命令:pwd pwd 命令的快速指南,用於檢查當前工作目錄 每當您在文件系統中感到迷失時,請調用 pwd 命令以了解您所在的位置: pwd 它將顯示當前文件夾路徑。 此命令適用於Linux、macOS、WSL和任何您擁有UNIX環境的地方。

Linux命令:ps

ps命令是用於列出當前正在系統中運行的進程的快速指南。 您的計算機始終運行著大量不同的進程。 您可以使用ps命令檢查它們: 這是當前會話中正在運行的由用戶啟動的進程列表。 這裡有幾個fish shell實例,大多數是在編輯器內部由VS Code打開的,還有一個運行Hugo的實例,用於開發預覽網站。 這些只是分配給當前用戶的命令。要列出所有進程,我們需要向ps傳遞一些選項。 我最常用的是ps ax: a選項用於列出其他用戶的進程,而不僅僅是我們自己的進程。x顯示未與任何終端鏈接的進程(並非通過終端使用者啟動)。 如您所見,較長的命令被截斷了。使用命令ps axww以換行方式繼續命令列表,而不是截斷它: 我們需要兩次指定w以應用此設置,這不是錯別字。 您可以使用grep和管道來搜索特定的進程,就像這樣: ps axww | grep "VS Code" ps返回的列代表一些關鍵信息。 第一個信息是PID,即進程ID。這在您想在另一個命令中引用這個進程時很重要,例如要終止它。 然後,我們有TT,告訴我們所使用的終端ID。 然後,STAT告訴我們進程的狀態: I表示空閑的進程(睡眠時間超過約20秒) R表示可運行的進程 S表示睡眠的進程(睡眠時間不到約20秒) T表示停止的進程 U表示不可中斷等待的進程 Z表示死亡的進程(僵尸進程) 如果有多個字母,第二個字母表示進一步的信息,這可能非常專業。 通常會出現+,它表示進程在其終端中處於前景。s表示該進程是會話領導者。 TIME告訴我們進程運行的時間。 這個命令適用於Linux、macOS、WSL以及任何具有UNIX環境的地方。

Linux命令:uname

本文將介紹uname命令,該命令用於打印有關當前機器和運行在上面的操作系統的詳細信息。 在不使用任何選項的情況下調用uname將返回操作系統的代號: m選項顯示硬件名稱(本例中為x86_64),p選項打印處理器架構名稱(本例中為i386): s選項打印操作系統名稱,r打印發佈版號,v打印版本號: n選項打印節點網絡名稱: a選項打印所有可用的信息: 在macOS上,您還可以使用sw_vers命令打印有關macOS操作系統的更多信息。請注意,這與上面的Darwin(內核)版本不同,後者為19.6.0。 Darwin是macOS的內核名稱。內核是操作系統的"核心",而整個操作系統被稱為macOS。在Linux中,Linux是內核,GNU/Linux將是操作系統名稱,儘管我們都稱之為"Linux"。 uname命令在Linux、macOS、WSL和所有有UNIX環境的地方都可用。

Linux指令:env

一個快速指南,介紹如何使用env指令運行指令並與環境變量進行互動。 env指令可用於傳遞環境變量,而無需在外部環境(即當前shell)中設置它們。 假設您想要運行一個Node.js應用程序並將USER變量設置給它。您可以運行以下命令: env USER=flavio node app.js 這樣,Node.js應用程序可以通過Node的process.env接口訪問USER環境變量。 您還可以運行清除所有已經設置的環境變量的命令,使用-i選項: env -i node app.js 在這種情況下,您將收到一個錯誤,顯示env: node: No such file or directory,這是因為命令node無法被訪問,因為外殼使用的PATH變量未設置,用於在常用路徑中查找命令。 因此,您需要傳遞到node程序的完整路徑: env -i /usr/local/bin/node app.js 嘗試使用一個擁有以下內容的簡單的app.js文件: console.log(process.env.NAME) console.log(process.env.PATH) 您將看到輸出結果為: undefined undefined 您可以傳遞一個環境變量: env -i NAME=flavio node app.js 輸出結果將是: flavio undefined 刪除-i選項將使PATH在程式內再次可用: 如果不帶任何選項運行env指令,則可以打印出所有環境變量: env 它將返回一個已設置的環境變量列表,例如: HOME=/Users/flavio LOGNAME=flavio PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin PWD=/Users/flavio SHELL=/usr/local/bin/fish 您還可以使用-u選項在運行的程式內讓某個變量無法訪問,例如以下代碼會從命令環境中刪除HOME變量: env -u HOME node app.js env指令可在Linux、macOS、WSL以及任何具有UNIX環境的地方使用。

Linux指令:ping

快速指南到ping命令,用於ping一個網絡主機 ping命令用於ping一個特定的網絡主機,可以是本地網絡或互聯網上的主機。 使用語法ping <host>,其中<host>可以是域名或IP地址。 這是一個ping google.com的示例: 該命令發送一個請求到服務器,服務器返回一個響應。 默認情況下,ping每秒發送一次請求,并且會一直運行,直到用Ctrl-C停止它,除非通過-c選項傳遞您想要嘗試的次數:ping -c 2 google.com。 一旦停止ping,它將打印有關結果的一些統計信息:丟包的百分比以及有關網絡性能的統計信息。 正如您所看到的屏幕上顯示主機的IP地址以及獲得響應所花費的時間。 並非所有的服務器都支持ping,如果請求超時: 有時這是故意的,為了“隱藏”服務器,或者只是為了減少負載。 ping數據包也可能被防火牆過濾。 ping使用ICMP協議 (Internet Control Message Protocol)工作,這是一個與TCP或UDP一樣的網絡層協議。 該請求將一個帶有ECHO_REQUEST消息的數據包發送到服務器,服務器返回一個ECHO_REPLY消息。我不會詳細介紹,但這是基本概念。 ping主機對於了解主機是否可到達(假設它支持ping)以及它與您之間的距離有多遠是有用的。通常情況下,就地理位置而言,服務器越接近,返回您的時間就越短,這是由於線纜引入更多延遲的簡單物理原則。 ping命令在Linux、macOS、WSL以及任何具有UNIX環境的地方可用。