打开麒麟系统的终端,很多人第一反应是“这不就是一个黑框框吗”。真正开始操作时才发现,安装软件、卸载软件、查看系统信息、排查网络故障,几乎所有事情都要在这个黑框框里完成。如果你以前只用Windows,刚接触麒麟系统时,终端和shell几乎是你绕不开的第一道门槛。
我的判断很明确:在麒麟系统上,终端和shell不是“高级选项”,而是基本生存技能。学会它们,你才算真正开始使用这个系统,而不只是“在用桌面图标”。
这篇文章不是把手册复述一遍,而是从实际使用场景出发,讲清楚三件事:麒麟系统下终端怎么用、shell脚本怎么入门、遇到问题怎么排查。读完以后,你至少可以独立完成软件安装、配置修改、写一个能用的shell脚本,并且知道报错之后该从哪里开始查。
1. 这篇文章真正要解决的问题
先说结论:麒麟系统用户被终端和shell卡住,通常不是“记不住命令”,而是没有建立Linux系统的操作习惯。
第一层是软件安装方式。Windows用户习惯下载exe安装包,双击安装。麒麟系统虽然也有软件商店,但更可靠、更可控的安装方式,其实是命令行包管理工具。软件商店一旦报错,命令行几乎是最好的替代方案,甚至能反过来帮商店“治病”。
第二层是权限模型。Linux从设计之初就区分普通用户和root用户。普通用户不能随意修改系统文件,必须通过sudo获取临时管理员权限。很多新手第一次安装软件就遇到Permission denied,完全不知道发生了什么。
第三层是脚本自动化。很多人觉得shell脚本是运维工程师才能碰的东西,其实它离日常工作并不远。批量重命名文件、按日期备份目录、检查服务是否存活,甚至自动清理磁盘垃圾,都可以用一小段shell脚本搞定。
本文会用真实可复制的命令,把下面这些问题逐一展开:麒麟系统怎么打开终端、怎么安装软件、怎么卸载软件、sudo权限怎么用、shell脚本怎么写、脚本获取自身目录的经典写法是什么,以及软件商店报错时如何排查。
2. 基础概念:麒麟系统、终端与shell的边界
“终端”和“shell”经常被混为一谈,包括很多写过Linux命令的人,也说不清两者的区别。这里先把概念拆开。
2.1 麒麟操作系统的技术背景
银河麒麟操作系统是目前国内Linux桌面和服务器市场占有率较高的国产操作系统之一,适配了包括x86、ARM、龙芯、飞腾等多种芯片架构。它基于Linux内核,因此在命令生态上与通用的Linux发行版高度一致。
从软件包管理器来看,银河麒麟常见版本使用与Debian/Ubuntu一致的apt体系,这意味着大多数Ubuntu下的软件安装命令、软件源配置方式、依赖处理方式,在麒麟系统上可以直接复用。这也是为什么很多教程会说“麒麟系统像Ubuntu”的原因。
但要注意,麒麟系统存在不同版本和架构。同一条命令,在不同架构下安装的软件包来源可能完全不同。用uname -m确认架构,是第一步。
2.2 终端:一个和系统对话的窗口
终端(Terminal)其实是一个图形化程序。它提供一个窗口,让你输入文本命令,并把命令的输出结果显示出来。你可以把它理解成“系统给你开的一扇对话窗口”。
银河麒麟桌面系统自带终端程序,通常右键桌面就能找到“打开终端”。终端本身不解释命令,它只负责把你的输入转交给底层解释器,再把解释器的输出返回给你。
2.3 shell:真正解释命令的“翻译官”
shell是一个命令行解释器,运行在Linux系统里,负责读取命令、解析语法、调用对应程序、返回结果。因为它在用户和操作系统内核之间,像套了一层壳,所以叫 shell。
麒麟系统默认shell一般是Bash(Bourne Again Shell),这是绝大多数Linux发行版的默认shell。Bash支持两种使用方式:交互式输入命令,以及执行脚本文件。交互式就是你打开终端一行一行敲;脚本式是把命令按逻辑写到文件里,批量执行。
一句话:终端是窗口,shell是解释器。你敲的每一行命令,最终是shell在执行。
3. 环境准备:打开终端之前的准备工作
进入正题之前,建议先花两分钟确认系统环境。这样后面操作软件源、安装软件时,能够快速判断是不是兼容问题。
3.1 查看系统版本和架构
打开终端,依次执行以下命令:
cat /etc/os-release uname -m第一条会显示系统名称、版本号等基本信息。第二条输出的是系统架构,常见结果是x86_64(Intel/AMD 64位)、aarch64(ARM 64位)、loongarch64(龙芯)等。
架构信息非常关键。一台ARM架构的麒麟设备和一台x86架构的麒麟设备,能装的软件包可能是不同的。如果你的安装源或者下载的deb包架构不匹配,安装时大概率会报错。
3.2 确认当前用户身份
输入以下命令:
whoami id普通用户的输出通常是uid=1000(用户名)。如果显示uid=0(root),说明当前是root用户,操作风险等级完全不同。日常使用建议以普通用户登录,需要管理员权限时用sudo临时提权。
3.3 终端打不开怎么办
很多用户遇到“终端打不开”的问题,这种情况下应该先想想最近是不是改了shell配置。
终端启动时,会加载当前用户的shell配置文件,比如~/.bashrc、~/.bash_profile。如果这些文件里写入了有语法错误的命令,终端可能闪退或启动报错。这时候可以尝试:
- 用文件管理器进入主目录,按
Ctrl + H显示隐藏文件。 - 找到
.bashrc,备份后把疑似新增的错误内容注释掉或删除。 - 重新打开终端测试。
如果终端程序本身被误删,可以尝试通过软件商店或系统更新界面重新安装终端相关组件。这里建议先从配置文件入手排查,因为概率更高。
4. 软件安装与卸载:终端里的包管理操作
麒麟系统用户搜索频率最高的需求,就是“怎么安装软件”和“怎么卸载软件”。在终端里,这件事主要靠apt和dpkg。
4.1 更新软件源
安装软件前,建议先更新软件包列表。软件源相当于“软件仓库的目录”,系统需要知道仓库里有哪些软件以及对应版本。
sudo apt update如果这一步报错,或者速度极慢,大概率是软件源配置问题。可以检查/etc/apt/sources.list和/etc/apt/sources.list.d/目录下的配置文件。更换软件源属于修改系统配置,操作前建议先备份原文件。
4.2 安装软件
以安装vim文本编辑器为例:
sudo apt install vim -y-y表示自动确认,省去交互过程中的“是否继续”提示。
如果你已经从网站下载了一个.deb软件包,使用dpkg安装:
sudo dpkg -i 软件包名.debdpkg安装最大的问题是不会自动拉取依赖。如果安装后提示缺少依赖,执行:
sudo apt-get install -f它会修复依赖关系。很多用户以为dpkg安装完软件就能用,其实依赖缺失才是最常见的坑。
4.3 卸载软件
sudo apt remove 软件包名 sudo apt purge 软件包名区别在于:
remove删除程序文件,保留配置文件。purge连配置文件一起删除。
清理不再需要的孤立依赖:
sudo apt autoremove这条命令会把因为安装某个软件而被带入、但现在已不再需要的依赖包清理掉。需要注意的是,执行前最好看一眼它准备删除的包列表,避免删掉其他软件还在用的共享库。
4.4 软件商店错误代码0006的排查思路
关于“麒麟软件商店错误代码0006”,网上说法很多。这个错误不能一概而论,它往往和软件商店无法正常获取软件列表有关。更稳当的排查顺序是:
- 检查网络是否正常,可以先打开浏览器访问任意网页。
- 在终端执行
sudo apt update,看软件源是否报错。 - 用
date检查系统时间,时间偏差太大会导致HTTPS证书校验失败,表面看像网络错误。 - 确认软件源配置是否有效。
如果以上都正常,软件商店仍然报错,可以考虑直接使用命令行安装目标软件。从工程效率角度看,命令行安装更透明,报错信息也更明确。
4.5 麒麟系统里的其他包格式
除了deb包,麒麟系统还能运行多种发行格式的应用。比如AppImage是免安装的便携格式,下载后给执行权限即可运行;还有部分厂商会提供tar.gz压缩包。安装这些格式不需要root权限,但需要注意可执行权限设置和依赖库是否齐全。
chmod +x 应用.AppImage ./应用.AppImage4.6 分区编辑器安装示例
有用户搜索“麒麟v10终端命令安装分区编辑器”,这里给一个通用流程。
GParted是Linux下常用的分区编辑器,终端安装命令是:
sudo apt update sudo apt install gparted -y启动:
gparted操作分区是高风险操作。强烈建议先在虚拟机或测试机器上练习,不要在保存重要数据的磁盘上直接试验。分区操作前必须备份数据,并确认操作的目标磁盘确实是你要操作的那一块,可以通过lsblk查看磁盘挂载情况。
lsblk df -h5. 终端高频操作:目录切换、换行、历史命令与sudo权限
终端的使用体验,很大程度上取决于快捷键和高频命令的熟练度。
5.1 切换目录:cd
cd是最基础也是最常用的命令。几个典型写法:
cd /etc # 切换到 /etc 目录 cd ~ # 回到当前用户主目录 cd .. # 返回上级目录 cd - # 返回上一次所在目录新手最容易犯的错误是漏掉空格。命令和参数之间必须有空格,写成cd/etc会被shell当成一个不存在的命令。
5.2 查看当前目录
pwd当你在终端里觉得“迷路”时,先执行pwd,它会把当前所在的绝对路径打印出来。
5.3 终端怎么换到上一行
“linux终端怎么换到上一行”这个搜索词,背后可能有几种场景。
第一种是输入一条很长的命令时,想换行继续输入。可以在行末加反斜杠\再回车:
sudo apt install \ vim \ curl \ gitshell会把这些行合并成一条完整的命令执行。这种写法在脚本里也很常见,可以让超长命令更易读。
第二种场景是编辑当前输入行。如果命令输错了一部分,只想去行首修改,可以按Ctrl + A;去行尾按Ctrl + E;想删除整行重新输入,按Ctrl + U;想取消当前这条命令,按Ctrl + C。
5.4 历史命令
按上方向键可以调出最近执行过的命令。输入history可以查看完整历史列表。想重新执行某一条历史命令,可以用!编号:
history !123这里的!123对应历史记录中编号为123的那条命令。
5.5 sudo:临时管理员权限
麒麟系统大多数维护操作都需要root权限。sudo是“superuser do”的缩写,作用是让授权用户以root身份临时执行某一条命令。
sudo apt update执行后会提示输入当前用户的密码。这里有三个常见误区:
- 输入密码时终端没有任何显示,这是系统故意设计的,不是键盘坏了。
- sudo密码是当前登录用户的密码,不是另一个root密码。
- sudo只对当前命令生效,执行完自动回到普通用户状态。
5.6 什么时候需要root权限
安装系统和删除系统时:
sudo apt install 软件包 sudo apt remove 软件包修改系统配置文件时:
sudo vim /etc/hosts管理服务时:
sudo systemctl restart 服务名普通用户自己主目录下的文件操作,不需要sudo。比如~/test目录下的临时脚本,直接用普通用户权限读写就可以。
5.7 切换root的注意点
如果确实需要连续执行多条root命令,可以执行:
sudo -i此时提示符会从$变成#,表示当前是root shell。用完后建议立即执行:
exit退出root状态,回到普通用户。在root shell里操作时,命令没有权限保护,误删文件、改错配置都可能立刻生效。坚持最小权限原则,能不用root就不用。
6. shell脚本入门:从第一行代码开始
6.1 shell脚本的本质
shell脚本就是把多条命令写进一个文本文件,由Bash按顺序或按逻辑执行。你平时在终端里一行一行敲的命令,实际上就是脚本的基本原料。
为什么需要脚本?因为日常工作中大量操作是重复的。比如每天登录系统后都要检查磁盘空间、查看服务状态、清理临时文件。手动敲三五行命令也许不麻烦,但连续一个月每天敲,就是很大的时间成本。写成脚本后,一条命令全部搞定,还能配合crontab定时执行。
6.2 创建并运行第一个脚本
在主目录下创建脚本文件:
mkdir -p ~/bin vim ~/bin/hello.sh按i进入编辑模式,写入:
#!/bin/bash # 文件路径:~/bin/hello.sh echo "Hello, 麒麟系统" echo "当前时间:$(date)"按Esc,输入:wq回车保存退出。
执行方式有两种。
方式一,直接用bash解释器执行,不需要可执行权限:
bash ~/bin/hello.sh方式二,赋予可执行权限后直接运行:
chmod +x ~/bin/hello.sh ~/bin/hello.sh初学者最常遇到的报错是:
Permission denied这说明文件没有执行权限,执行chmod +x 文件名即可。
另一个隐藏坑是换行符问题。如果脚本是在Windows上编辑后拷贝到麒麟系统的,文件可能带有Windows环境常见的CRLF换行符,执行时会报bad interpreter之类的错误。这时可以用dos2unix转换:
sudo apt install dos2unix -y dos2unix ~/bin/hello.sh6.3 变量与输出
shell脚本中,变量赋值不需要加$,读取时必须加:
#!/bin/bash # 文件名:variable.sh name="麒麟" echo "你好,${name}"输出你好,麒麟。
这里建议使用${name}而不是$name。在拼接字符串时,${name}能明确变量边界,避免把变量名和后续字符连在一起导致解析错误。
6.4 条件判断
if语句是最常用的控制结构。例如检查系统信息文件是否存在:
#!/bin/bash # 文件名:ifdemo.sh if [ -f /etc/os-release ]; then echo "系统信息文件存在" else echo "系统信息文件不存在" fi这里有一个初学者必踩的坑:[和后面的条件之间必须有空格,条件和]之间也要有空格。写成[-f /etc/os-release]会被shell解析成错误的表达式,脚本会报语法错误。
6.5 for循环
批量处理文件时,for循环很实用。例如循环打印1到5:
#!/bin/bash # 文件名:fordemo.sh for i in 1 2 3 4 5; do echo "第 ${i} 次" done也可以用简写:
#!/bin/bash for i in {1..5}; do echo "第 ${i} 次" done6.6 一个综合示例:按日期备份目录
把上面的知识点结合起来,写一个常用的自动备份脚本。
#!/bin/bash # 文件路径:~/bin/backup.sh # 用途:备份指定目录到 ~/backups 下,带日期后缀 SOURCE_DIR="$HOME/Documents" BACKUP_BASE="$HOME/backups" DATE_TAG="$(date +%Y%m%d_%H%M%S)" BACKUP_DIR="${BACKUP_BASE}/${DATE_TAG}" mkdir -p "${BACKUP_DIR}" cp -r "${SOURCE_DIR}" "${BACKUP_DIR}/" echo "备份完成:${BACKUP_DIR}" ls -l "${BACKUP_DIR}"执行前先赋予权限:
chmod +x ~/bin/backup.sh bash ~/bin/backup.sh这个脚本体现了一个好习惯:把目录和变量放到脚本开头集中定义,后续修改路径时不需要翻找命令细节。
6.7 脚本获取自身所在目录的经典写法
很多人搜索“linux执行shell文件命令 获取文件所在目录”,是因为脚本执行时用户不一定在脚本目录下,而脚本需要访问同目录下的配置文件或资源。
推荐写法:
#!/bin/bash # 文件路径:yourscript.sh SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" echo "脚本所在目录:${SCRIPT_DIR}"拆开解释:
${BASH_SOURCE[0]}是脚本自身的路径,不一定是绝对路径。dirname提取路径的目录部分。cd到该目录,再用pwd取绝对路径。
这个写法兼容性较好。即使你从其他目录执行该脚本,它也能正确定位到脚本自己所在的目录。
7. shell脚本中的常见坑
这一节汇总几个出现频率很高的shell坑。每个都是初学者真实踩过的。
7.1 等号两边不能有空格
# 错误 name = "麒麟" # 正确 name="麒麟"等号两侧有空格时,shell会把name当成命令,报错为command not found。
7.2 数字比较用 -eq,字符串比较用 =
数字比较不能用>和<,在[ ]中会被当成重定向符号,带来完全不可预期的结果。应该写成:
#!/bin/bash a=10 b=20 if [ "${a}" -lt "${b}" ]; then echo "a 小于 b" fi字符串比较则用=或==:
#!/bin/bash name="麒麟" if [ "${name}" = "麒麟" ]; then echo "匹配" fi7.3 变量要加双引号
变量内容如果含有空格,不加双引号时会被shell拆成多个参数。比如:
file_path="/data/my docs/report.txt" if [ -f "$file_path" ]; then echo "文件存在" fi这里$file_path必须加双引号,否则shell会把/data/my和docs/report.txt当成两个独立参数,条件判断会失败。
7.4 set -e 的误用
很多脚本开头会写set -e,意思是“任何一个命令失败就立即退出脚本”。这在部署脚本中能避免错误继续传播,但在日常脚本中却可能带来困扰。
比如你有一条命令只是尝试查询一个可能不存在的文件,但脚本因为这条命令返回非零状态直接退出,后面的处理逻辑全被跳过。如果确实需要某个失败的命令不中断脚本,可以在命令末尾加|| true:
grep "keyword" /tmp/log.txt || true7.5 忘记检查命令是否存在
在脚本里调用外部命令之前,可以用command -v检查:
if command -v curl >/dev/null 2>&1; then echo "curl 可用" else echo "curl 未安装" fi这样脚本在缺少依赖时能给出明确的提示,而不是跑到一半报command not found。
8. 常见问题与排查思路
这里把麒麟系统终端和shell的常见问题整理成一张排查表。遇到问题时,先看“可能原因”,再按“排查方式”操作,比盲目改配置要快得多。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 软件商店提示错误代码0006 | 网络不通、软件源失效、系统时间异常 | 执行sudo apt update看具体报错;用date检查时间 | 修复软件源、校准系统时间、改用命令行安装 |
apt install提示软件包未找到 | 软件源缓存过期或源中无此包 | 执行sudo apt update后再试 | 更新软件源或更换软件源 |
执行脚本报Permission denied | 脚本没有可执行权限 | 执行ls -l 脚本文件查看权限 | 执行chmod +x 脚本文件 |
| dpkg安装deb包后软件运行报缺失依赖 | 依赖未满足 | 执行sudo apt-get install -f | 自动修复依赖关系 |
| 终端输入密码无反应 | 安全设计,输入时不显示字符 | 继续输入后按回车 | 无需处理 |
cd报目录不存在 | 路径错误或目录不存在 | 用Tab键自动补全路径 | 核对完整路径 |
脚本报bad interpreter | 文件带Windows换行符或BOM | 执行file 脚本文件查看类型 | 使用dos2unix转换换行符 |
| 终端启动闪退 | shell配置文件有语法错误 | 检查~/.bashrc等配置 | 备份并修复配置内容 |
补充一个重要原则:任何涉及系统配置、软件包移除、权限变更的操作,都建议先在测试环境验证。尤其是团队使用的系统,不要直接在生产机器上执行未经测试的批量命令。修改前先备份配置文件,考虑回滚方式,是最低成本的保险。
9. 最佳实践、安全建议与后续学习方向
9.1 终端使用习惯
- 善用Tab键补全。路径、命令、文件名都能补全,既提速度又减少拼写错误。
- 多看帮助。不确定命令的用法时,先执行
man 命令名或命令名 --help。 - 先看报错再搜索。终端报错信息往往已经把原因写得很清楚,截取核心关键词去搜索,比直接搜索症状描述更有效。
9.2 shell脚本编写规范
- 脚本第一行写
#!/bin/bash,明确解释器。 - 变量命名使用有意义的单词,比如
backup_dir,避免a、b、tmp1这类无意义命名。 - 关键步骤加注释,特别是脚本依赖的外部命令和适用环境。
- 脚本中涉及路径时,尽量使用绝对路径或基于脚本目录拼接的相对路径,不要依赖执行时的工作目录。
- 在脚本开头设置变量集中管理路径、用户名等配置,方便后续修改。
9.3 安全边界
- 日常使用普通用户登录,通过sudo临时提权。
- 不要在root shell里执行来源不明的脚本,执行前先
cat查看脚本内容。 - 谨慎对待
rm -rf。删除前先确认路径,必要时把要删除的内容移动到临时回收目录,确认无误后再彻底清理。 - 生产环境执行批处理命令前,先在测试环境跑通,准备好回滚方案。
9.4 后续可以继续深入的方向
学会终端基础操作和shell脚本入门之后,建议按下面的路径继续扩展:
- 系统服务管理:用
systemctl查看、启动、停止系统服务。 - 网络排障:用
ip addr、ping、curl定位网络问题。 - 定时任务:配合crontab,让shell脚本每天自动执行。
- 日志分析:学习
grep、awk、sed三个文本处理命令,它们几乎是shell排障的核心。 - 终端复用工具:体验tmux等终端复用工具,在一个窗口里管理多个会话,尤其适合远程连接场景。
如果你能把重复操作写成脚本,把报错排查整理成固定流程,麒麟系统就不再是一个“长得像Linux的陌生环境”,而是一台真正听你指挥的工作工具。从今天开始,找一个最常见的重复操作,试着把它写成第一段shell脚本,这就是最好的入门方式。