Skip to main content

Terminal

Terminals

也称为命令行或控制台,使我们能够在计算机上完成和自动化任务,而无需图形用户界面。终端起源于 1950 年代到 1960 年代左右,从那时起就一直是所有操作系统的重要组成部分——从台式机到隐藏在云中的服务器,再到像 Raspberry PI Zero 这样的微型计算机,甚至手机。在大多数情况下,终端、命令行意味着同一件事。

面试中命令行通常特指类Unix系统,如Linux、macOS、Ubuntu等,这些系统与生产环境保持一致。

info

Linux 内核衍生版本众多,譬如 ubuntu、debian、centos、fedora、archlinux 等。

不同版本之间存在差异,譬如 ubuntu 大版本号之外,小版本号也很重要,此外有时候版本号和代号会混用

网道 bash 教程是开源的 bash 文档,教科书式的篇章划分能帮助学习者系统的了解终端命令。

tldr是社区维护的命令行工具帮助页面合集,支持在线查询终端命令,有不同平台选择,支持不同语言显示

WSL

如果你是 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 ,推荐使用 WSL(Windows Subsystem for Linux)?

详细内容请参考WSL官方教程

提示
  • 某些版本的命令行需要使用 wsl.exe 而不是 wsl
  • wsl --unregister 会永久删除该发行版及其所有数据,无法恢复!

安装

功能描述命令模板命令示例简写
安装WSL和默认Ubuntuwsl --installwsl --install-
安装指定发行版wsl --install <DistributionName>wsl --install Ubuntu-24.04-
列出可用发行版wsl --list --onlinewsl --list --onlinewsl -l -o
列出已安装发行版wsl --list --verbosewsl --list --verbosewsl -l -v
仅列出运行中的发行版wsl --list --runningwsl --list --runningwsl -l --running
列出所有发行版wsl --list --allwsl --list --allwsl -l --all/ wsl -l

网络与状态

功能描述命令模板命令示例简写
获取Linux的IP地址wsl hostname -Iwsl hostname -I-
获取Windows的IP地址wsl ip route show | grep -i default | awk '{ print $3}'wsl ip route show | grep -i default | awk '{ print $3}'-
查看WSL版本wsl --versionwsl --versionwsl -v
检查WSL状态wsl --statuswsl --status-
获取帮助信息wsl --helpwsl --helpwsl -h

配置设置

功能描述命令模板命令示例简写
设置默认发行版wsl --set-default <DistributionName>wsl --set-default Ubuntu-24.04wsl -s Ubuntu-24.04
设置WSL版本(1或2)wsl --set-version <DistributionName> <Version>wsl --set-version Ubuntu-24.04 2-
设置默认WSL版本wsl --set-default-version <Version>wsl --set-default-version 2-
更改默认用户<DistributionName> config --default-user <Username>ubuntu config --default-user johndoe-

启动运行

功能描述命令模板命令示例简写
启动默认发行版wslwsl-
启动指定发行版wsl --distribution <DistributionName>wsl --distribution Ubuntu-24.04wsl -d Ubuntu-24.04
以指定用户启动wsl --user <Username>wsl --user rootwsl -u root
指定发行版和用户wsl -d <DistributionName> -u <Username>wsl -d Ubuntu-24.04 -u root-
在用户主目录启动wsl ~wsl ~-

导入导出

功能描述命令模板命令示例简写
导出发行版wsl --export <DistributionName> <FileName>wsl --export Ubuntu-24.04 ubuntu-backup.tar-
导出为VHD格式wsl --export <DistributionName> <FileName> --vhdwsl --export Ubuntu-24.04 ubuntu-backup.vhdx --vhd-
导入发行版wsl --import <DistributionName> <InstallLocation> <FileName>wsl --import Ubuntu-ROS2 C:\WSL_ROS2 ubuntu-backup.tar-
导入VHD格式wsl --import <DistributionName> <InstallLocation> <FileName> --vhdwsl --import Ubuntu-New C:\WSL_New backup.vhdx --vhd-
就地导入VHDwsl --import-in-place <DistributionName> <FileName>wsl --import-in-place Ubuntu-New ubuntu.vhdx-

管理维护

功能描述命令模板命令示例简写
终止指定发行版wsl --terminate <DistributionName>wsl --terminate Ubuntu-24.04wsl -t Ubuntu-24.04
关闭所有发行版wsl --shutdownwsl --shutdown-
注销并卸载发行版wsl --unregister <DistributionName>wsl --unregister Ubuntu-24.04-
更新WSLwsl --updatewsl --update-
从GitHub下载更新wsl --update --web-downloadwsl --update --web-download-

磁盘管理

功能描述命令模板命令示例简写
挂载磁盘wsl --mount <DiskPath>wsl --mount \\.\PHYSICALDRIVE1-
挂载VHDwsl --mount <DiskPath> --vhdwsl --mount C:\disk.vhdx --vhd-
挂载指定分区wsl --mount <DiskPath> --partition <PartitionNumber>wsl --mount \\.\PHYSICALDRIVE1 --partition 1-
挂载指定文件系统wsl --mount <DiskPath> --type <Filesystem>wsl --mount \\.\PHYSICALDRIVE1 --type ext4wsl --mount <DiskPath> -t <Filesystem>
卸载磁盘wsl --unmount <DiskPath>wsl --unmount \\.\PHYSICALDRIVE1-
卸载所有磁盘wsl --unmountwsl --unmount-

有趣的命令行体验

终端娱乐命令

命令名称安装命令使用方法功能说明
hollywoodsudo apt-get install hollywoodhollywood让终端像好莱坞大片一样显示各种电脑参数
cowsaysudo apt-get install cowsaycowsay "消息内容"让一头牛说话,显示指定消息
fortunesudo apt-get install fortunesfortune显示随机名言、谚语或幽默语句,注意命令内加s
lolcatsudo apt-get install lolcat命令 | lolcat将文本输出为彩虹颜色

命令组合示例:fortune | cowsay | lolcat

  • sudo:以超级用户身份执行命令( su 表示 super user(超级用户) do 表示 执行)

如果不希望每次都输入sudo,可以切换到有权限的用户。

  • su 用户名表示切换到该用户,如果不填用户名sudo su 则默认切换到root

  • 管道符 | 将前一个命令的输出作为后一个命令的输入 ,示例 command1 | command2 |

Makefile

Makefile 本质是自动化脚本,把常用的项目编译、测试、部署等重复性命令写进去,省得每次手动输入。熟练使用后能大幅提升开发效率。

创建名为 Makefile 的文件(无扩展名):

# 基本示例
# 目标: 依赖(可选)
# 命令(必须用Tab缩进,不能用空格)

hello:
echo "Hello World"

# 多个命令用分号或换行
clean:
echo "clean1"
echo "clean2"
echo "clean3";echo "clean4"

# all 依赖 build 和 test
# make all 等价于
# 先 make build
# 再 make test
# 最后执行命令 echo "all"
all: hello clean
echo "all"

# 使用变量
PYTHON = python3.12
# 声名伪目标(如果当前文件夹中没有与目标同名的文件、文件夹,那么可以不用声明伪目标)
.PHONY: build clean
build:
$(PYTHON) -v

使用:make hellomake cleanmake allmake build

make后面的参数会优先被解读为是:执行指定文件、切换目录。

如果我们工作空间中有名为:build的文件、文件夹,同时希望make build指向的不是文件。而是当前的Makefile中的build目标。

那么可以通过 .PHONY: 目标名1 目标名2来声名:请优先当前Makefile中的目标名1目标名2

make 命令常用参数

以下命令可以混合使用。

参数作用示例说明
make执行默认目标make执行 Makefile 第一个目标
make 目标名执行指定目标make hello执行 hello 目标
make -f 文件名指定 Makefilemake -f Makefile使用自定义文件名
make -C 目录切换目录后再执行make -C ./src进入 src 目录后执行
make -n模拟执行(dry run)make -n build只显示会执行的命令,不真实执行
make -s静默模式make -s clean不显示执行的命令
make -j N并行执行make -j 4用 4 个并行任务加速编译
make -B强制重新构建make -B忽略时间戳,全部重新执行
make -k遇错继续make -k test某个目标失败后继续执行其他目标
make VAR=value传递变量make PORT=8080 run覆盖 Makefile 中的变量

基本语法

命令格式

组成部分格式示例说明
基本格式command [ arg1 ... [ argN ]]ls -lcommand是命令,后面跟参数
短参数-参数ls -l便于手动输入
长参数--参数名ls --list用在脚本中,可读性更好
多行命令命令 \ 续行内容echo foo \ bar使用反斜杠连接多行

命令分隔与组合

符号功能示例说明
;命令分隔符clear; ls顺序执行多个命令,不管前一个是否成功
&&逻辑与Command1 && Command2第一个命令成功后才执行第二个
||逻辑或Command1 || Command2第一个命令失败后才执行第二个

空格处理规则

情况处理方式示例说明
参数分隔用空格或Tab分隔echo foo barfoo和bar被认为是两个参数
多余空格自动忽略echo foo bar多个空格会被忽略为一个
路径含空格使用引号保护"C:\Program Files"防止路径被错误分割

type命令

用法命令示例输出说明
基本用法type 命令名echo is a shell builtin判断命令类型
查看所有定义type -a 命令名显示所有可能的定义一个命令可能有多种实现
返回类型type -t 命令名filebuiltinalias返回命令的具体类型

命令类型说明

类型英文说明示例
别名alias用户自定义的命令别名ll 通常是 ls -l 的别名
关键词keywordShell的保留关键字ifforwhile
函数function用户定义的Shell函数自定义函数
内置命令builtinShell内置的命令echocdpwd
外部文件file独立的可执行文件/bin/ls/usr/bin/grep

快捷键

常用快捷键

快捷键功能使用场景
Ctrl + L清除屏幕并将当前行移到页面顶部清理屏幕内容
Ctrl + C中止当前正在执行的命令停止运行中的程序
Shift + PageUp向上滚动查看历史输出
Shift + PageDown向下滚动查看历史输出
Ctrl + U从光标位置删除到行首快速删除命令开头部分
Ctrl + K从光标位置删除到行尾快速删除命令结尾部分
Ctrl + W删除光标位置前一个单词删除单个单词
Ctrl + D关闭 Shell 会话退出终端
浏览已执行命令的历史记录重复使用历史命令

自动补全功能

操作按键功能示例
命令补全Tab自动补全命令名输入 tou + Tab → touch
路径补全Tab自动补全文件路径输入部分路径 + Tab
显示选项Tab + Tab显示所有可能的补全选项当有多个匹配项时

文件增删改查

基本文件操作

操作类型命令示例说明
显示当前路径pwdpwd显示当前工作目录的完整路径
复制文件cp old.txt new.txtcp readme.txt backup.txt复制文件

CP命令参数详解

参数功能使用场景
-a将文件的特性一起复制完整复制文件属性
-p连同文件的属性一起复制,而非使用默认方式,与-a相似常用于备份
-i若目标文件已经存在时,在覆盖时会先询问操作的进行防止意外覆盖重要文件
-r递归持续复制用于目录的复制行为
-u目标文件与源文件有差异时才会复制增量备份

文件编辑

操作按键/命令说明
打开文件编辑vim 文件路径使用vim编辑器打开文件
进入编辑模式a在当前光标位置进入插入模式
退出编辑模式Esc回到命令模式
保存并退出:wq! + Enter强制保存并退出vim

文件权限详解

权限基础概念

Linux文件权限使用三位数字表示,每位数字代表不同用户组的权限:

  • 第一位:文件所有者(owner)的权限
  • 第二位:同组用户(group)的权限
  • 第三位:其他用户(others)的权限

权限数字含义

数字二进制权限组合说明
0000---无任何权限
1001--x仅执行权限
2010-w-仅写入权限
3011-wx写入+执行权限
4100r--仅读取权限
5101r-x读取+执行权限
6110rw-读取+写入权限
7111rwx读取+写入+执行权限(完全权限)

常用权限组合示例

权限码权限分布适用场景说明
644rw-r--r--普通文件所有者可读写,其他人只读
755rwxr-xr-x可执行文件/目录所有者完全权限,其他人可读可执行
777rwxrwxrwx临时文件所有人完全权限(不安全,少用)
600rw-------私密文件仅所有者可读写,其他人无权限
700rwx------私密目录仅所有者有完全权限
664rw-rw-r--共享文档所有者和组可读写,其他人只读

权限修改命令详解

命令格式示例说明
chmod 数字 文件chmod 644 file.txt使用数字设置权限
chmod u+rwx 文件chmod u+rwx script.sh给所有者添加读写执行权限
chmod g-w 文件chmod g-w file.txt移除组用户的写权限
chmod o=r 文件chmod o=r file.txt设置其他用户只有读权限
chmod -R 755 目录chmod -R 755 /var/www递归设置目录及其内容权限

符号说明

符号含义使用示例
uuser(所有者)chmod u+x file
ggroup(组)chmod g+w file
oothers(其他人)chmod o-r file
aall(所有人)chmod a+x file
+添加权限chmod +x file
-移除权限chmod -w file
=设置权限chmod u=rwx file

查看文件权限

命令示例输出说明
ls -l 文件名-rw-r--r-- 1 user group 1024 Dec 15 10:30 file.txt查看单个文件权限
ls -la列出所有文件(包括隐藏文件)的详细权限信息查看目录下所有文件权限
stat 文件名显示文件的详细状态信息,包括权限的八进制表示获取更详细的权限信息

权限输出解读示例

ls -l 输出 -rw-r--r-- 1 user group 1024 Dec 15 10:30 file.txt 为例:

部分含义解释
-文件类型-表示普通文件,d表示目录,l表示链接
rw-所有者权限可读可写,不可执行
r--组权限仅可读
r--其他人权限仅可读
user文件所有者用户名
group文件所属组组名

安全建议

权限设置安全级别建议使用场景
644安全普通文档、配置文件
755安全脚本、程序、目录
600/700高安全密钥文件、私人目录
666/777不安全仅在临时测试时使用,生产环境禁用
权限安全提醒
  • 避免使用777权限:所有用户都有完全权限,存在安全隐患
  • 私密文件使用600权限:如SSH密钥、密码文件等
  • 脚本文件使用755权限:确保可以执行,但不给其他用户写权限
  • 定期检查关键文件权限:确保系统安全

系统信息

功能命令说明常用参数
查看进程top实时显示系统进程和资源使用情况交互式界面,q退出
安装软件包dpkg -i 包名安装deb格式的软件包dpkg -i code_1.83.0-1696349969_arm64.deb
更新软件源apt-get update更新软件包列表通常在安装新软件前执行
查看磁盘空间df -h显示文件系统磁盘空间使用情况-h 以人类可读格式显示
系统运行时间uptime显示系统运行时长及平均负载显示当前时间、运行时长、用户数、负载
系统重启sudo reboot重新启动系统需要管理员权限

环境变量

环境变量就像"电子便利贴",电脑可以在上面记录一些重要信息(比如你的名字、文件路径等),任何程序都可以查看这些便利贴。

不同系统环境变量操作对比

特性Windows (PowerShell)Linux/Mac (Bash)说明
进程可见(临时)变量$env:VAR = "值"export VAR="值"其他程序可以通过os.getenv等方法访问
仅Shell可见(临时)变量$VAR = "值"VAR="值"其他程序看不到,关闭窗口后消失
纯数字设置$env:AGE = 30export AGE=30数字也以字符串形式存储
永久生效方法系统属性 → 环境变量写入 ~/.bashrc~/.zshrc重启后仍然生效
值含空格时必须加引号必须加引号避免空格引发歧义
特殊字符处理需引号保护需引号保护保护特殊字符不被解释
本质数据类型始终是字符串始终是字符串环境变量本质都是字符串

PowerShell特殊示例

# 启动两个微信登录界面(Windows路径含空格示例)
start C:\"Program Files (x86)"\Tencent\WeChat\WeChat.exe
start C:\"Program Files (x86)"\Tencent\WeChat\WeChat.exe

端口管理

操作类型命令示例说明
查看端口占用netstat -tunlp | grep 端口号netstat -tunlp | grep 8080查看指定端口占用情况
查看端口占用lsof -i:端口号lsof -i:8080另一种查看端口占用的方法
杀掉端口进程kill -9 $(lsof -i tcp:端口号 -t)kill -9 $(lsof -i tcp:6022 -t)强制终止占用指定端口的进程
后台运行程序nohup 命令 &nohup python3 fast_api.py &程序在后台持续运行,不受终端关闭影响

远程连接

SSH连接

操作步骤命令/操作说明
SSH登录ssh linaro@192.168.3.55默认账户和密码都是 linaro

文件传输

  • 如果你想在本机和设备间文件传输,可以使用scp命令,在你的电脑上重新打开一个终端,输入对应的指令即可。
传输方向命令格式示例说明
本地→远程scp /path/to/local/file username@remote_host:/path/to/remote/directoryscp "Z:\test99.py" linaro@192.168.3.55:~/Downloads将本地文件复制到远程主机
远程→本地scp username@remote_host:/path/to/remote/file /path/to/local/directoryscp linaro@192.168.3.55:~/test.py ./将远程文件复制到本地
目录传输scp -r /path/to/local/directory username@remote_host:/path/to/remote/directoryscp -r ./myproject linaro@192.168.3.55:~/递归复制整个目录

特殊符号说明

符号含义示例
~用户主目录~/Downloads 表示用户主目录下的Downloads文件夹
-r递归选项用于复制目录及其内容

变量设置

export A="1 2 3"

warning

终端的命令通过空格和反斜杠来区分参数或者换行,示例中的引号并不是字符串的引号,而是为了避免空格和反斜杠引发歧义。环境变量本质都是字符串,建议新手始终使用引号包裹环境变量。

不光是环境变量,其他命令的变量也遵循这个引号使用规则。正确理解和使用这些规则对于避免命令执行错误非常重要。