跳转到内容

Linux 系统及其操作

本章面向没有 Linux 使用经验的新成员。先完成 Ubuntu 22.04 安装,再逐步掌握终端、文件系统与权限等基础操作。

安装教程:Ubuntu 22.04 双系统安装(CSDN)

提示:请慎重操作。 安装会修改硬盘分区,操作前记得备份重要数据。不同电脑的 BIOS 进入方式和界面可能不同,以开机画面的提示为准。

终端是 Linux 最常用的操作入口。 与 Windows 的图形界面不同,终端通过输入命令让系统执行任务;学习开发和连接服务器时,很多操作都依赖终端。

  • 使用快捷键 Ctrl + Alt + T
  • 或在应用程序列表中搜索 Terminal

打开后你会看到一个终端窗口:

终端窗口示例
Ubuntu 中的终端窗口

其中 user 是当前用户名,ubuntu 是主机名,~ 表示当前位于家目录,$ 表示当前是普通用户。如果提示符末尾是 #,表示当前是 root 用户,操作时需要更谨慎。

例如,上图中我的终端提示符是:

linkchen@linkchen-Legion-R7000P-APH8:~$

其中:

  • linkchen 是当前用户名
  • linkchen-Legion-R7000P-APH8 是主机名
  • ~ 表示当前位于家目录
  • $ 表示当前是普通用户

命令是你在终端里输入的一行文字,用来告诉系统“做什么”。终端收到命令后,由 shell(负责解释命令的程序)解析并执行,执行结果会显示在终端里。

一条命令通常由三部分组成:

命令 [选项] [参数]
  • 命令:要执行的操作名称,例如 ls 表示列出文件。
  • 选项:以 - 开头的附加设置,用来改变命令行为,例如 ls -l 中的 -l 表示显示详细信息。
  • 参数:命令操作的对象,例如 ls /home 中的 /home 表示要列出的目录。

输入完命令后按回车键执行。命令、选项和参数之间用空格分隔;如果文件名包含空格,需要用引号括起来,例如 cd "My Documents"

例如:

ls -lh /home/linkchen

其中 ls 是命令,-lh 是选项(-l 显示详细信息,-h 用易读单位显示大小),/home/linkchen 是参数,表示要查看的目录。

下图就是在终端中运行这条命令的实际效果:

运行 ls -lh 的实际效果
ls -lh /home/linkchen 的执行结果

先不用记住所有命令,重要的是理解“命令 = 让系统做某件事 + 附加设置 + 操作对象”这个结构,后面遇到新命令时自然就能看懂。

命令作用示例
pwd显示当前所在目录pwd
ls列出目录内容ls -lh
cd切换目录cd ~/Documents
mkdir创建目录mkdir test
touch创建空文件touch hello.txt
cp复制文件或目录cp hello.txt backup.txt
mv移动或重命名mv hello.txt notes.txt
rm删除文件或目录rm notes.txt
cat查看文件内容cat hello.txt
clear清空终端屏幕clear

使用注意:

  • rm 删除的文件不会进入回收站,删除前要确认路径,尤其不要随意对重要目录使用。
  • 输入命令时按 Tab 可以自动补全文件名,按两次 Tab 会列出候选内容。

提示: 建议手敲练习上述命令,不要直接复制粘贴,以熟悉操作。

Linux 把硬盘上的数据组织成一棵“目录树”,从根目录 / 开始,一层层向下展开。文件和目录都有明确的路径,理解路径是使用 Linux 的基础。

  • Linux 中所有内容都以文件形式组织:普通文档是文件,目录是存放文件的“文件夹”,设备、配置等也以文件形式暴露出来。
  • 目录树只有一个根:/。所有目录和文件都挂在 / 下面。
  • 你的家目录通常是 /home/你的用户名,简写为 ~
路径作用说明
/根目录,整棵目录树的起点不要随意在里面创建文件
/home存放各用户的家目录普通用户的数据一般都在这里
/home/用户名~当前用户的家目录练习文件放在这里最安全
/etc系统与软件的配置文件一般需要 root 权限才能修改
/usr安装的软件、库和文档由系统自动管理,一般不需要手动改
/var经常变化的数据,例如日志需要查日志时可以到这里找
/tmp临时文件目录重启后可能被清空,不要放重要文件
/opt存放第三方软件手动安装的额外软件常放在这里
/bin/usr/bin存放常用命令程序lscat 等命令就在这里

新手阶段只需要记住:自己写的东西放在家目录,系统文件不要乱动。

下图是在文件管理器中打开的根目录 /,可以看到 Linux 常见的顶层目录:

Linux 根目录下的常见目录
Linux 根目录 / 的内容
  • 绝对路径:从 / 开始写,例如 /home/linkchen/Documents
  • 相对路径:从当前目录开始写,例如 Documents 表示当前目录下的 Documents。
  • . 表示当前目录,.. 表示上一级目录,~ 表示家目录。

例如:

Terminal window
cd /etc # 绝对路径,直接进入 /etc
cd .. # 回到上一级目录
cd ~ # 回到家目录
cd Documents # 相对路径,进入当前目录下的 Documents
命令作用
pwd显示当前所在目录的绝对路径
ls列出当前目录内容
ls -l显示详细信息(权限、大小、修改时间等)
ls -a显示包括隐藏文件在内的所有内容
ls -lh用易读单位显示文件大小
cd 路径切换到指定目录

. 开头的文件是隐藏文件,例如 .bashrc,需要用 ls -a 才能看到。

下图是在终端中运行 pwdls -a 的实际效果:

pwd 与 ls -a 示例
pwd 与 ls -a 的执行结果
命令作用示例
mkdir 目录名创建目录mkdir notes
mkdir -p 路径一次创建多级目录mkdir -p projects/robot
cp -r 源 目标复制目录(-r 表示递归复制)cp -r notes notes-backup
mv 源 目标移动或重命名mv notes notes2
rmdir 目录名删除空目录rmdir old
rm -r 目录名删除目录及其全部内容rm -r old

注意:rm -r 会连同目录里的所有内容一起删除,而且不会进入回收站,使用前先确认路径。

Linux 是多用户系统,文件和程序都有“属于谁、谁能读、谁能写、谁能执行”的权限。理解用户和权限,是安全使用 Linux 的基础。

  • Linux 上可以有多个用户,每个用户有独立的用户名、密码和家目录(/home/用户名)。
  • root 是系统管理员用户,拥有最高权限;普通用户不能随意修改系统文件。

ls -l 查看文件详细信息,输出开头类似:

-rw-r--r-- 1 linkchen linkchen 1234 Aug 9 18:00 notes.txt
drwxr-xr-x 2 linkchen linkchen 4096 Aug 9 18:00 folder

第一列的含义:

  • 第 1 个字符表示类型:- 表示普通文件,d 表示目录。
  • 后面 9 个字符分成三组,分别表示“所有者(user)”“所属组(group)”“其他用户(others)”的权限。
  • r 表示读,w 表示写,x 表示执行;- 表示没有对应权限。

例如 -rw-r--r--:所有者可读可写,组和其他用户只能读;drwxr-xr-x 是目录,所有者可读可写可进入,组和其他用户可读可进入但不能写。

下图是在终端中查看一个测试目录权限的实际效果:

ls -l 查看权限示例
ls -l 查看文件权限

chmod 用来修改文件或目录的权限。常用写法:

写法含义示例
chmod +x 文件给所有用户增加执行权限chmod +x run.sh
chmod u+w 文件只给所有者增加写权限chmod u+w notes.txt
chmod 755 文件用数字设置权限chmod 755 script.sh

数字写法中 r=4w=2x=1,三个数字分别对应所有者、组和其他用户。755 表示所有者拥有读、写、执行权限(4+2+1),组和其他用户拥有读、执行权限(4+1)。

下图是使用 chmod 修改权限前后的对比:

chmod 修改权限示例
chmod 修改权限前后对比

提示: 权限修改会影响其他人能否访问文件,修改前先确认文件路径和需要的权限。

普通用户执行系统级命令时,可以在命令前加 sudo,临时以管理员身份运行:

Terminal window
sudo apt update
  • sudo 会先要求输入当前用户的密码,验证通过后执行。
  • 只有被加入 sudo 组的用户才可以使用 sudo
  • sudo 只对当前这一条命令生效,不会把整个终端变成管理员。
  • 日常操作尽量使用普通用户,只在需要时使用 sudo,避免误操作影响系统。
命令作用
ls -l查看文件权限和详细信息
chmod修改文件或目录权限
sudo 命令以管理员权限执行单条命令

提示: 遇到 “Permission denied” 时,先确认是不是权限或 sudo 的问题,不要急着切换到 root 用户。

apt 是 Ubuntu 中管理软件包的工具,负责从软件源下载、安装、更新和卸载软件,并自动处理依赖关系。

安装软件前先刷新软件源索引:

Terminal window
sudo apt update

apt update 只是更新软件列表,不会安装软件。之后可以升级系统中已安装的软件:

Terminal window
sudo apt upgrade

Ubuntu 软件仓库里的软件可以直接用包名安装:

Terminal window
sudo apt install 软件包名

例如安装 Git:

Terminal window
sudo apt install git

查找软件包可以用:

Terminal window
apt search 关键词

卸载软件:

Terminal window
sudo apt remove 软件包名

从官网下载的 .deb 安装包也可以用 apt 安装。先进入下载目录,再执行:

Terminal window
cd ~/下载
sudo apt install ./软件名.deb

需要注意:

  • 路径前要写 ./,apt 才会把文件当作本地安装包,而不是软件源里的包名。
  • apt 会自动处理这个包依赖的其他软件;如果安装后提示依赖问题,可以用 sudo apt --fix-broken install 修复。
  • 下载前确认软件提供的是适合自己系统的版本:普通 Intel/AMD 电脑选 x86_64 版本,ARM 设备选对应的 arm64 版本。
  • 只安装来自可信来源的 .deb 文件,不要随意安装来源不明的软件。

提示: sudo dpkg -i 软件名.deb 也可以安装,但它不会自动处理依赖;新手优先使用 sudo apt install ./软件名.deb

命令作用
sudo apt update刷新软件源索引
sudo apt upgrade升级已安装的软件
sudo apt install 包名安装软件
sudo apt remove 包名卸载软件
sudo apt install ./软件名.deb安装本地 .deb 文件并处理依赖

前面介绍的命令都是一条一条输入、一条一条执行。Bash 脚本(Bash Script)就是把一组命令按顺序写进一个文件,由 Bash 一次执行。写脚本的目的是把“固定的操作步骤”保存下来,以后不用重复输入,也方便分享给其他人。

脚本本身是一个普通文本文件,通常以 .sh 结尾。文件开头写:

#!/bin/bash

这一行叫 shebang,告诉系统这个文件要用 /bin/bash 来执行。以 # 开头的行是注释,不会被执行:

#!/bin/bash
# 输出一条欢迎信息
echo "Hello, quadruped!"

echo 会在终端里输出文字。创建脚本时可以直接用 nano hello.sh 打开编辑器,把上面的内容写进去保存。

执行脚本有两种方式:

Terminal window
bash hello.sh

或者先加上执行权限再运行:

Terminal window
chmod +x hello.sh
./hello.sh

./ 表示“当前目录下的文件”。第二种方式要求文件拥有执行权限,上一节学的 chmod +x 在这里就派上用场了。

脚本里可以定义变量保存数据:

#!/bin/bash
ROBOT_NAME="wolf"
echo "Hello, $ROBOT_NAME!"

注意:等号两边不能有空格,ROBOT_NAME = "wolf" 会被解析成一条命令而不是变量赋值。引用变量时在变量名前加 $,写成 $ROBOT_NAME

脚本还可以接收运行时传入的参数:

#!/bin/bash
echo "脚本名:$0"
echo "第 1 个参数:$1"
echo "第 2 个参数:$2"
echo "所有参数:$@"

执行 ./robot.sh front leg 时,$0 是脚本名,$1front$2leg。给脚本传参,可以让同一个脚本处理不同的任务,而不是每换一个目标就复制一份脚本。

在四足组的日常开发中,脚本常用来把安装依赖、编译、运行等固定步骤保存下来,也用来检查设备、批量处理日志或启动多个程序,避免每次重复输入一长串命令。

脚本里定义的变量只在该脚本运行时存在。环境变量则是系统范围内保存的一组“键值对”,终端和程序都可以读取:

Terminal window
echo $PATH

PATH 是其中最重要的一个:它保存了一串目录,shell 输入命令时会按顺序在这些目录里查找对应的程序。执行后会看到类似输出:

/home/linkchen/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:...

以后想让自己写的脚本或工具直接以命令形式使用,可以把对应目录加进 PATH:

Terminal window
export PATH="$HOME/bin:$PATH"

$HOME 是家目录。这样设置只在当前终端有效;想每次打开终端都自动生效,就需要写进 .bashrc

.bashrc 是位于家目录的一个隐藏文件,打开新终端时,Bash 会自动读取并执行它。可以把“每次打开终端都想自动生效的设置”放进去,例如给常用命令起别名、添加 PATH、设置环境变量。

常见用法:

内容示例作用
命令别名alias ll='ls -lh'之后输入 ll 就等于输入 ls -lh
添加搜索路径export PATH="$HOME/bin:$PATH"让自定义工具可以直接作为命令使用
环境变量export ROS_DOMAIN_ID=1设置 ROS 2 的通信域,避免多台机器相互干扰
自定义提示符export PS1='[\u@\h \W]\$ '修改终端提示符的显示样式

其中 ROS 相关的设置会在之后学习 ROS 2 时经常遇到。

查看和编辑 .bashrc

Terminal window
cat ~/.bashrc # 查看内容
nano ~/.bashrc # 用 nano 编辑

修改后不会立刻生效,需要让 Bash 重新读取一次:

Terminal window
source ~/.bashrc

或者直接关闭终端再重新打开。

  • Bash 脚本:自己写的、手动执行的命令文件,例如 ./hello.sh,什么时候运行由你决定。
  • .bashrc:Bash 每次打开新终端时自动执行的“启动脚本”,用来配置环境,不需要手动运行。

两者本质都是命令文件,区别在于“谁在什么时候执行它”。以后看到“把它写进 .bashrc”这句话,意思是让这条设置每次打开终端都自动生效。

命令作用
bash 脚本.sh用 Bash 执行脚本
chmod +x 脚本.sh给脚本添加执行权限
./脚本.sh执行当前目录下的脚本
echo $PATH查看 PATH 环境变量
export 变量=值设置环境变量(仅当前终端生效)
cat ~/.bashrc查看 .bashrc 内容
source ~/.bashrc重新加载 .bashrc

提示: 修改 .bashrc 前可以先备份(cp ~/.bashrc ~/.bashrc.bak),写错时方便恢复。.bashrc 只对当前用户生效,并且只在交互式终端启动时读取,不会在每次运行脚本时重新执行。