終端與Shell入門(mén):從命令操作到腳本實(shí)戰(zhàn))
在國(guó)產(chǎn)操作系統(tǒng)逐步走進(jìn)企業(yè)辦公、政務(wù)生產(chǎn)和個(gè)人開(kāi)發(fā)環(huán)境的過(guò)程中銀河麒麟Kylin系統(tǒng)是出鏡率非常高的一款。很多人第一次接觸 Linux 就是從麒麟開(kāi)始的但剛上手時(shí)最不習(xí)慣的就是終端和 shell。圖形界面下裝軟件、改配置還能點(diǎn)一點(diǎn)一旦遇到軟件商店報(bào)錯(cuò)、想批量處理文件、寫(xiě)自動(dòng)化腳本就繞不開(kāi)終端和 shell。這篇文章就以麒麟系統(tǒng)為背景系統(tǒng)梳理終端和 shell 的核心概念、常用操作、軟件安裝方法、shell 腳本入門(mén)和常見(jiàn)故障排查盡量讓剛接觸國(guó)產(chǎn)系統(tǒng)的讀者能照著操作也讓有 Linux 基礎(chǔ)的開(kāi)發(fā)者能快速對(duì)齊麒麟環(huán)境下的差異點(diǎn)。1. 終端和 shell 到底是什么1.1 終端不是黑框框而是操作系統(tǒng)的入口很多讀者剛打開(kāi)麒麟系統(tǒng)里的“終端”應(yīng)用時(shí)看到的是一個(gè)類(lèi)似黑色窗口的界面里面只有一個(gè)提示符比如kylinkylin:~$這個(gè)窗口其實(shí)就是終端模擬器。它本身并不執(zhí)行命令而是提供一個(gè)交互界面把用戶(hù)在鍵盤(pán)上輸入的內(nèi)容發(fā)送給 shell 程序再把 shell 返回的結(jié)果顯示出來(lái)。你可以把它理解成“操作系統(tǒng)的文字入口”。在 Linux 系統(tǒng)中終端是運(yùn)維、開(kāi)發(fā)、問(wèn)題排查繞不開(kāi)的工具。圖形界面能完成大部分日常操作但遇到下面這些場(chǎng)景時(shí)終端反而更高效批量重命名文件。查看系統(tǒng)運(yùn)行狀態(tài)。安裝和卸載軟件包。定位軟件商店報(bào)錯(cuò)的原因。編寫(xiě) shell 腳本實(shí)現(xiàn)自動(dòng)化。在麒麟系統(tǒng)上終端的重要性并不比其他 Linux 發(fā)行版低。很多和系統(tǒng)底層、軟件源、服務(wù)狀態(tài)相關(guān)的操作通過(guò)終端能獲得更直接的反饋。1.2 shell 是解釋命令的程序shell 是一個(gè)命令行解釋器。用戶(hù)輸入的命令最終由 shell 解釋并轉(zhuǎn)發(fā)給操作系統(tǒng)內(nèi)核執(zhí)行。bashBourne Again Shell是 Linux 系統(tǒng)中最常見(jiàn)的 shell麒麟系統(tǒng)默認(rèn)使用的也是 bash。從用戶(hù)視角來(lái)看shell 提供了幾類(lèi)核心能力執(zhí)行普通命令比如ls、cd、cp。支持通配符比如*.txt表示匹配所有 txt 文件。支持重定向和管道比如cat a.txt | grep error。支持變量、條件判斷、循環(huán)等編程語(yǔ)法把多條命令組織成腳本。對(duì)普通用戶(hù)而言shell 是命令的翻譯官對(duì)開(kāi)發(fā)者和運(yùn)維工程師而言shell 還是一種輕量級(jí)編程語(yǔ)言適合編寫(xiě)自動(dòng)化運(yùn)維腳本、數(shù)據(jù)處理腳本和系統(tǒng)管理工具。1.3 麒麟系統(tǒng)終端和 shell 的使用場(chǎng)景銀河麒麟 V10 常見(jiàn)的使用場(chǎng)景有幾類(lèi)桌面辦公安裝辦公軟件、配置打印機(jī)、管理系統(tǒng)更新。開(kāi)發(fā)測(cè)試部署中間件、運(yùn)行 Python 或 Java 程序、操作數(shù)據(jù)庫(kù)。運(yùn)維管理查看服務(wù)狀態(tài)、清理磁盤(pán)空間、管理用戶(hù)和權(quán)限。信創(chuàng)適配將原本運(yùn)行在 CentOS 或 Ubuntu 上的腳本遷移到麒麟系統(tǒng)。在這些場(chǎng)景里終端和 shell 幾乎是繞不開(kāi)的基礎(chǔ)能力。2. 環(huán)境準(zhǔn)備與版本說(shuō)明2.1 銀河麒麟常見(jiàn)版本銀河麒麟系統(tǒng)目前最常見(jiàn)的是 V10 系列分為桌面版和服務(wù)器版。不同 CPU 架構(gòu)還有不同版本例如x86_64Intel、AMD 平臺(tái)。ARM64飛騰、鯤鵬平臺(tái)。MIPS64龍芯平臺(tái)。SW64申威平臺(tái)。同一套命令在不同架構(gòu)上基本一致差異主要集中在軟件包來(lái)源和部分底層庫(kù)。本文示例以銀河麒麟桌面版 V10 為主多數(shù)命令和腳本在服務(wù)器版同樣適用。如果系統(tǒng)版本不同個(gè)別軟件源的地址或包管理器行為可能有差異。遇到問(wèn)題時(shí)建議先確認(rèn)系統(tǒng)版本cat /etc/os-release2.2 終端模擬器和 shell 環(huán)境麒麟桌面版自帶終端模擬器一般可以在“開(kāi)始菜單 - 系統(tǒng)工具 - 終端”中找到也可以在桌面空白處右鍵選擇“打開(kāi)終端”。默認(rèn) shell 是 bash可以執(zhí)行下面命令確認(rèn)echo $SHELL正常情況下會(huì)輸出/bin/bash。如果需要在腳本中指定解釋器在腳本第一行加上#!/bin/bash2.3 用戶(hù)權(quán)限說(shuō)明在使用終端時(shí)普通用戶(hù)提示符通常是$root 用戶(hù)提示符是#。很多管理類(lèi)命令需要管理員權(quán)限有兩種方式第一種是臨時(shí)切換用戶(hù)su - root第二種是使用sudo臨時(shí)提權(quán)sudo 命令需要提醒的是日常操作盡量使用普通用戶(hù)不要長(zhǎng)期使用 root。涉及系統(tǒng)關(guān)鍵配置的修改先確認(rèn)操作目的再執(zhí)行命令避免誤操作影響系統(tǒng)穩(wěn)定性。3. 麒麟終端高頻操作與核心命令3.1 打開(kāi)終端和切換目錄打開(kāi)終端后通常停留在當(dāng)前用戶(hù)的家目錄。查看當(dāng)前目錄pwd切換目錄是終端里最高頻的操作之一使用cd命令cd /etc # 進(jìn)入 /etc 目錄 cd ~ # 進(jìn)入當(dāng)前用戶(hù)家目錄 cd .. # 返回上一級(jí)目錄 cd - # 返回上一次所在目錄在命令行里~代表當(dāng)前用戶(hù)家目錄.代表當(dāng)前目錄..代表上一級(jí)目錄。這個(gè)約定在 Linux 中通用。3.2 終端換行和多行輸入很多人在終端里遇到一個(gè)疑問(wèn)命令行太長(zhǎng)怎么換到下一行繼續(xù)輸入在 bash 中如果一行命令還沒(méi)寫(xiě)完可以按反斜杠\再按回車(chē)shell 會(huì)在下一行繼續(xù)等待輸入echo hello \ world如果是想在已執(zhí)行的命令中重新編輯可以使用方向鍵上下翻看歷史命令也可以按Ctrl A跳到行首、Ctrl E跳到行尾。還有一種情況是腳本或命令中間不小心按了回車(chē)終端進(jìn)入續(xù)行狀態(tài)提示符變成。此時(shí)可以按Ctrl C取消當(dāng)前輸入重新開(kāi)始。3.3 文件與目錄管理日常操作中最常用的一組命令ls # 查看當(dāng)前目錄文件 ls -l # 查看詳細(xì)信息 ls -a # 查看隱藏文件 cp file1 file2 # 復(fù)制文件 mv file1 dir/ # 移動(dòng)文件 rm file1 # 刪除文件 mkdir newdir # 創(chuàng)建目錄需要注意的是rm刪除的文件不會(huì)進(jìn)入回收站直接刪除。生產(chǎn)環(huán)境中尤其是 root 用戶(hù)下執(zhí)行rm之前要仔細(xì)檢查路徑。3.4 管理員權(quán)限和軟件包管理麒麟系統(tǒng)安裝軟件常見(jiàn)有兩種方式一種是在軟件商店中搜索安裝適合普通用戶(hù)。但有時(shí)會(huì)遇到軟件商店打不開(kāi)、安裝報(bào)錯(cuò)等問(wèn)題。另一種是使用命令行工具安裝更適合排查問(wèn)題和批量部署。銀河麒麟 V10 基于 Debian 體系底層包管理器是dpkg依賴(lài)管理使用apt。常用命令如下。更新軟件源緩存sudo apt update升級(jí)已安裝軟件包sudo apt upgrade安裝軟件包sudo apt install 軟件包名卸載軟件包sudo apt remove 軟件包名徹底卸載并清理配置sudo apt purge 軟件包名安裝本地 deb 安裝包sudo dpkg -i 軟件包名.deb如果 dpkg 安裝時(shí)提示依賴(lài)缺失可以執(zhí)行sudo apt -f install自動(dòng)修復(fù)依賴(lài)關(guān)系后再安裝。需要注意的是麒麟系統(tǒng)的軟件源可能與企業(yè)內(nèi)網(wǎng)、離線(xiàn)環(huán)境綁定。如果apt update報(bào)錯(cuò)優(yōu)先檢查網(wǎng)絡(luò)、軟件源配置和 DNS。3.5 查找命令和查看幫助記不住命令參數(shù)時(shí)可以查看幫助man ls也可以用命令自帶的幫助參數(shù)ls --help想查找某個(gè)命令的位置which python3想查找系統(tǒng)里某個(gè)文件的位置find /etc -name *.conf4. 麒麟系統(tǒng)軟件安裝的完整示例4.1 通過(guò)軟件商店安裝銀河麒麟桌面版自帶軟件商店相當(dāng)于圖形化的軟件管理工具。適合安裝常用辦公軟件、開(kāi)發(fā)工具和日常應(yīng)用。步驟很簡(jiǎn)單打開(kāi)軟件商店。在搜索框輸入軟件名稱(chēng)。點(diǎn)擊安裝按鈕。輸入管理員密碼。這種方式適合新手但安裝失敗時(shí)不方便看到底層錯(cuò)誤日志排查問(wèn)題有一定局限。4.2 通過(guò) apt 命令行安裝軟件以安裝vim文本編輯器為例sudo apt update sudo apt install vim -y參數(shù)-y表示自動(dòng)確認(rèn)安裝腳本中使用時(shí)比較方便。安裝完成后執(zhí)行vim --version可以確認(rèn)安裝是否成功。4.3 安裝本地 deb 包如果你手里已經(jīng)有一個(gè).deb安裝包比如某個(gè)適配麒麟系統(tǒng)的辦公軟件安裝包安裝方式如下sudo dpkg -i your-software.deb如果提示依賴(lài)缺失sudo apt -f install然后重新安裝。這個(gè)過(guò)程建議在測(cè)試環(huán)境中先驗(yàn)證一次確認(rèn)軟件與原系統(tǒng)兼容后再批量部署。4.4 卸載和清理卸載軟件時(shí)普通卸載sudo apt remove your-software如果希望連配置文件一起清理sudo apt purge your-software清理無(wú)用的依賴(lài)包sudo apt autoremove清理包管理器緩存sudo apt clean在生產(chǎn)環(huán)境或重要機(jī)器上執(zhí)行卸載命令前建議先確認(rèn)軟件包名避免誤刪依賴(lài)組件。5. shell 腳本入門(mén)與實(shí)戰(zhàn)5.1 第一個(gè) shell 腳本shell 腳本本質(zhì)上是把多條命令寫(xiě)入一個(gè)文件并賦予執(zhí)行權(quán)限后運(yùn)行。新建一個(gè)腳本文件vim hello.sh輸入以下內(nèi)容#!/bin/bash # 這是一個(gè)簡(jiǎn)單的 shell 腳本示例 echo Hello, Kylin Shell保存退出后賦予執(zhí)行權(quán)限chmod x hello.sh執(zhí)行腳本./hello.sh輸出Hello, Kylin Shell這里需要解釋一下腳本第一行的#!/bin/bash是 shebang告訴系統(tǒng)用哪個(gè)解釋器來(lái)執(zhí)行腳本。chmod x是添加可執(zhí)行權(quán)限如果不加權(quán)限執(zhí)行時(shí)會(huì)出現(xiàn)Permission denied錯(cuò)誤。5.2 變量和用戶(hù)輸入shell 腳本中定義變量很簡(jiǎn)單#!/bin/bash namekylin echo 當(dāng)前系統(tǒng)用戶(hù)是 $name從用戶(hù)輸入讀取內(nèi)容可以使用read#!/bin/bash echo 請(qǐng)輸入文件名 read filename echo 你輸入的文件名是 $filename變量名不能包含空格賦值時(shí)等號(hào)兩邊不能有空格。這是新手比較容易踩的坑。5.3 for 循環(huán)批量處理文件shell 腳本中for循環(huán)非常實(shí)用。比如批量重命名當(dāng)前目錄下的.txt文件在前面加上日期前綴#!/bin/bash for file in *.txt do mv $file $(date %Y%m%d)_$file done這段腳本會(huì)遍歷當(dāng)前目錄下所有以.txt結(jié)尾的文件并把文件重命名為類(lèi)似20250101_oldname.txt的格式。使用變量時(shí)加上雙引號(hào)可以避免文件名包含空格時(shí)出錯(cuò)。這是腳本健壯性的關(guān)鍵點(diǎn)。再來(lái)看一個(gè)批量創(chuàng)建目錄的例子#!/bin/bash for i in {1..5} do mkdir folder_$i done循環(huán)執(zhí)行完后當(dāng)前目錄下會(huì)生成folder_1到folder_5五個(gè)目錄。5.4 條件判斷條件判斷用來(lái)控制腳本的分支邏輯。例如判斷文件是否存在#!/bin/bash if [ -f /etc/hosts ] then echo 文件存在 else echo 文件不存在 fi[ -f 文件路徑 ]是判斷是否為普通文件。類(lèi)似的判斷還有[ -d 路徑 ]判斷是否為目錄。[ -e 路徑 ]判斷是否存在。[ -z 字符串 ]判斷字符串是否為空。在使用[ ]判斷時(shí)注意方括號(hào)內(nèi)側(cè)必須有空格否則會(huì)報(bào)語(yǔ)法錯(cuò)誤。5.5 忽略命令執(zhí)行錯(cuò)誤在腳本中如果某一條命令執(zhí)行失敗默認(rèn)情況下腳本不會(huì)停止而是繼續(xù)執(zhí)行下一條。如果你希望在腳本中忽略某些步驟的錯(cuò)誤繼續(xù)執(zhí)行可以在命令末尾追加|| true#!/bin/bash echo 開(kāi)始執(zhí)行 some_maybe_fail_command || true echo 忽略錯(cuò)誤繼續(xù)執(zhí)行如果希望腳本只要遇到任何錯(cuò)誤就立即退出可以在腳本開(kāi)頭加上set -e實(shí)際項(xiàng)目中可以根據(jù)需求選擇不同的錯(cuò)誤處理策略。對(duì)于自動(dòng)部署腳本通常會(huì)先用set -e做嚴(yán)格檢查再單獨(dú)對(duì)允許失敗的步驟做例外處理。6. 常見(jiàn)問(wèn)題與排查思路6.1 麒麟軟件商店錯(cuò)誤代碼 0006不少用戶(hù)在使用麒麟系統(tǒng)時(shí)軟件商店安裝軟件會(huì)提示錯(cuò)誤代碼 0006。這個(gè)錯(cuò)誤通常和軟件源、網(wǎng)絡(luò)連接或軟件倉(cāng)庫(kù)緩存有關(guān)。排查思路如下。第一步檢查網(wǎng)絡(luò)是否正常ping -c 4 mirrors.kylinos.cn第二步更新軟件源緩存sudo apt update第三步清理緩存后重試sudo apt clean如果是在內(nèi)網(wǎng)環(huán)境需要確認(rèn)/etc/apt/sources.list中配置的軟件源地址是否可訪(fǎng)問(wèn)。6.2 軟件安裝提示依賴(lài)缺失使用dpkg -i安裝本地包時(shí)經(jīng)常出現(xiàn)依賴(lài)缺失的提示。解決方法是先執(zhí)行sudo apt -f install自動(dòng)修復(fù)依賴(lài)然后重新安裝軟件包。也可以使用apt install ./軟件包名.deb的方式直接安裝本地包apt 會(huì)嘗試處理依賴(lài)。6.3 終端提示權(quán)限不足執(zhí)行命令時(shí)提示Permission denied或Operation not permitted通常有兩種情況。第一命令需要管理員權(quán)限。檢查當(dāng)前用戶(hù)身份非 root 用戶(hù)需要加sudo。第二文件沒(méi)有執(zhí)行權(quán)限。如果是要執(zhí)行腳本先加權(quán)限chmod x script.sh6.4 終端打不開(kāi)或異常退出如果終端模擬器打不開(kāi)可以先嘗試從另一個(gè)終端執(zhí)行kylin-terminal查看終端進(jìn)程的報(bào)錯(cuò)信息。常見(jiàn)原因包括顯卡驅(qū)動(dòng)問(wèn)題、中文輸入法沖突、桌面環(huán)境組件異常。也可以嘗試刪除終端應(yīng)用的殘留配置后重啟rm -rf ~/.config/kylin-terminal這個(gè)操作會(huì)重置終端配置適合配置損壞的場(chǎng)景但最好先備份原配置目錄。6.5 常見(jiàn)問(wèn)題一覽問(wèn)題現(xiàn)象常見(jiàn)原因解決思路軟件商店提示錯(cuò)誤代碼 0006軟件源不可達(dá)、緩存損壞檢查網(wǎng)絡(luò)、更新軟件源、清理緩存apt update 報(bào)錯(cuò)軟件源地址錯(cuò)誤檢查 /etc/apt/sources.list安裝 deb 包提示依賴(lài)缺失依賴(lài)包未安裝apt -f install 修復(fù)依賴(lài)執(zhí)行腳本提示 Permission denied腳本沒(méi)有可執(zhí)行權(quán)限chmod x 腳本名終端字體或界面錯(cuò)亂終端配置損壞備份并重置終端配置命令找不到軟件未安裝或 PATH 缺失which 檢查路徑安裝相應(yīng)軟件包7. 最佳實(shí)踐與工程建議7.1 命令操作規(guī)范在終端執(zhí)行命令時(shí)盡量養(yǎng)成幾個(gè)好習(xí)慣。命令執(zhí)行前先確認(rèn)路徑pwd刪除操作前先查看ls -l 路徑使用rm -rf時(shí)要格外謹(jǐn)慎最好先列目錄確認(rèn)內(nèi)容再執(zhí)行刪除避免誤刪系統(tǒng)文件或用戶(hù)數(shù)據(jù)。7.2 shell 腳本編寫(xiě)規(guī)范編寫(xiě) shell 腳本時(shí)建議注意以下幾點(diǎn)。腳本開(kāi)頭聲明解釋器#!/bin/bash變量命名使用小寫(xiě)字母和下劃線(xiàn)避免與系統(tǒng)環(huán)境變量沖突file_path/home/kylin/data給關(guān)鍵步驟添加注釋方便后期維護(hù)# 備份配置文件 cp /etc/app.conf /etc/app.conf.bak對(duì)路徑加雙引號(hào)防止空格導(dǎo)致錯(cuò)誤cp $source_file $target_dir在生產(chǎn)環(huán)境中腳本里涉及遠(yuǎn)程服務(wù)器操作或數(shù)據(jù)庫(kù)變更時(shí)先在小范圍測(cè)試確認(rèn)邏輯正確后再全量執(zhí)行。7.3 日志記錄與錯(cuò)誤處理腳本運(yùn)行出現(xiàn)問(wèn)題后日志是排查的第一手資料。建議在腳本中增加輸出重定向bash deploy.sh deploy.log 21這樣標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出都會(huì)寫(xiě)入deploy.log文件。在腳本內(nèi)部也可以對(duì)關(guān)鍵步驟做簡(jiǎn)單的日志追加echo $(date) 開(kāi)始備份 deploy.log7.4 權(quán)限最小化在服務(wù)器或生產(chǎn)環(huán)境中不建議直接用 root 執(zhí)行日常命令也不要給腳本授予過(guò)高的 sudo 權(quán)限。普通用戶(hù)能完成的任務(wù)就用普通用戶(hù)執(zhí)行只有安裝軟件、修改系統(tǒng)配置時(shí)才臨時(shí)提權(quán)。對(duì)于可能影響系統(tǒng)穩(wěn)定性的操作比如替換軟件源、修改內(nèi)核參數(shù)、調(diào)整服務(wù)狀態(tài)建議先備份原文件再執(zhí)行修改。修改完成后確認(rèn)系統(tǒng)功能正常再清理備份或保留在固定目錄中。7.5 軟件源與網(wǎng)絡(luò)安全配置軟件源時(shí)優(yōu)先使用官方源或企業(yè)內(nèi)部可信源。不要隨意添加來(lái)源不明的軟件源避免安裝到被篡改的軟件包。安裝第三方軟件時(shí)確認(rèn)軟件包來(lái)源可靠在測(cè)試環(huán)境驗(yàn)證后再部署到正式環(huán)境。8. 下一步學(xué)習(xí)建議終端和 shell 是 Linux 操作系統(tǒng)中適用范圍很廣的基礎(chǔ)能力。讀完這篇文章你應(yīng)該已經(jīng)可以完成幾件事在麒麟系統(tǒng)中打開(kāi)終端并執(zhí)行基礎(chǔ)命令、通過(guò)命令行安裝和卸載軟件、編寫(xiě)簡(jiǎn)單的 shell 腳本處理文件、面對(duì)軟件商店報(bào)錯(cuò)時(shí)找到排查入口。如果還想繼續(xù)深入建議從以下幾個(gè)方向切入。掌握文本處理三劍客grep、sed、awk。這三個(gè)工具能幫你快速處理日志、提取數(shù)據(jù)、批量修改文件內(nèi)容。理解用戶(hù)和權(quán)限管理。useradd、usermod、chmod、chown是系統(tǒng)管理的基礎(chǔ)。學(xué)會(huì) systemd 服務(wù)管理。用systemctl管理服務(wù)狀態(tài)、設(shè)置開(kāi)機(jī)自啟是服務(wù)器運(yùn)維的常用技能。嘗試編寫(xiě)一個(gè)完整的小型自動(dòng)化腳本。比如每天定期備份指定目錄保留最近 7 天的備份文件并把日志寫(xiě)入文件。這樣一個(gè)腳本雖然不大但能把變量、循環(huán)、條件判斷、時(shí)間處理、文件操作全部串起來(lái)對(duì)理解 shell 編程很有幫助。在動(dòng)手過(guò)程中遇到報(bào)錯(cuò)不要急著搜索“復(fù)制粘貼”先看報(bào)錯(cuò)信息本身。終端給出的錯(cuò)誤信息一般是直接原因比如文件不存在、權(quán)限不足、依賴(lài)缺失。如果信息不夠完整可以用-v或--debug參數(shù)重試獲取更詳細(xì)的輸出。國(guó)產(chǎn)操作系統(tǒng)處于快速迭代階段不同小版本的軟件源地址、軟件包名稱(chēng)可能有細(xì)微差別。遇到問(wèn)題時(shí)先確認(rèn)版本再對(duì)照官方資料排查能少走很多彎路。希望這篇文章能幫你跨過(guò)終端和 shell 的第一道門(mén)檻在麒麟系統(tǒng)上更順暢地工作。