命令行界面基础

章节介绍

命令行界面(Command Line Interface,CLI)是与 Linux 系统交互的最直接、最强大的方式。虽然图形界面提供了直观的操作方式,但命令行界面在系统管理、脚本编写、自动化操作等方面具有不可替代的优势。本教程将详细介绍 Linux 命令行界面的基础知识,包括命令行的概念、提示符的含义、命令的执行方式、命令历史、命令补全、工作目录管理、重定向和管道操作,以及命令行快捷键等内容,帮助你掌握 Linux 命令行的基本操作技巧。

核心知识点

命令行界面概述

什么是命令行界面?

  • 定义:通过文本命令与计算机系统交互的界面
  • 组成部分
    • 提示符(Prompt)
    • 命令输入区域
    • 命令执行结果显示区域
  • 优势
    • 高效:批量操作和自动化
    • 强大:访问所有系统功能
    • 灵活:可组合使用各种命令
    • 远程:通过 SSH 等协议远程操作
    • 轻量:资源占用少

常见的 Shell

  • bash:Bourne Again Shell,最常用的 Shell
  • sh:Bourne Shell,最早的 Shell
  • csh:C Shell,语法类似 C 语言
  • tcsh:增强版 C Shell
  • zsh:Z Shell,功能丰富的 Shell
  • ksh:Korn Shell,结合了 bash 和 csh 的特点

查看当前 Shell

# 查看当前使用的 Shell
echo $SHELL

# 查看系统中可用的 Shell
cat /etc/shells

命令提示符

提示符的含义

  • 默认提示符格式username@hostname:current_directory$
    • username:当前登录的用户名
    • hostname:主机名
    • current_directory:当前工作目录
    • $:普通用户提示符
    • #:root 用户提示符

自定义提示符

  • PS1 环境变量:控制主要提示符的格式
  • PS2 环境变量:控制续行提示符的格式

示例

# 查看当前 PS1 设置
echo $PS1

# 自定义提示符(临时)
export PS1="\u@\h:\w\$ "

# 常用转义序列:
# \u - 用户名
# \h - 主机名
# \w - 当前工作目录(绝对路径)
# \W - 当前工作目录(仅目录名)
# \t - 当前时间(24小时制)
# \d - 当前日期
# \$ - 普通用户显示 $,root 用户显示 #
# \[\033[01;32m\] - 设置绿色文字
# \[\033[00m\] - 重置文字颜色

# 彩色提示符示例
export PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "

永久设置提示符

# 编辑 ~/.bashrc 文件
nano ~/.bashrc

# 添加 PS1 设置
export PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "

# 使设置生效
source ~/.bashrc

命令执行

命令的基本格式

  • 格式command [options] [arguments]
    • command:命令名称
    • options:命令选项(通常以 - 或 -- 开头)
    • arguments:命令参数

示例

# 基本命令
ls

# 带选项的命令
ls -l

# 带选项和参数的命令
ls -la /home

# 长选项
ls --all --human-readable

命令的执行过程

  1. 命令解析:Shell 解析用户输入的命令
  2. 命令查找:按照 PATH 环境变量指定的路径查找命令
  3. 命令执行:执行找到的命令
  4. 结果返回:命令执行完成后返回退出状态码

退出状态码

  • 0:命令执行成功
  • 非 0:命令执行失败(不同的错误有不同的状态码)

查看退出状态码

# 执行命令
echo "Hello"

# 查看退出状态码
echo $?

# 示例:故意执行失败的命令
ls non_existent_directory

# 查看失败的退出状态码
echo $?

命令历史

查看命令历史

# 查看历史命令
history

# 查看最近 10 条历史命令
history 10

# 搜索历史命令
history | grep "ls"

使用命令历史

  • 上下箭头:浏览历史命令
  • !n:执行历史中第 n 条命令
  • **!!**:执行上一条命令
  • !string:执行最近一条以 string 开头的命令
  • **!?string?**:执行最近一条包含 string 的命令

示例

# 执行历史中第 100 条命令
!100

# 执行上一条命令
!!

# 执行最近一条以 ls 开头的命令
!ls

# 执行最近一条包含 cd 的命令
!?cd?

历史命令配置

# 查看历史命令配置
echo $HISTSIZE  # 历史命令保存数量
echo $HISTFILE  # 历史命令保存文件
echo $HISTCONTROL  # 历史命令控制选项

# 配置历史命令(编辑 ~/.bashrc)
export HISTSIZE=10000  # 保存 10000 条历史命令
export HISTFILESIZE=10000  # 历史文件大小
export HISTCONTROL=ignoreboth  # 忽略重复命令和以空格开头的命令
export HISTTIMEFORMAT="%F %T "  # 显示命令执行时间

命令补全

路径补全

  • Tab 键:自动补全路径、文件名、命令名
  • 双击 Tab:显示所有可能的补全选项

示例

# 补全路径
cd /u<Tab>  # 补全为 /usr
cd /usr/l<Tab>  # 补全为 /usr/local

# 补全文件名
cat my<Tab>  # 补全为 myfile.txt

# 补全命令名
fi<Tab>  # 补全为 find

命令补全配置

  • bash-completion:提供更高级的命令补全功能

安装 bash-completion

# Ubuntu/Debian
sudo apt install bash-completion -y

# CentOS/RHEL
sudo yum install bash-completion -y

# 重新加载配置
source /etc/profile.d/bash_completion.sh

工作目录管理

查看当前工作目录

# 查看当前工作目录
pwd

# 示例输出:/home/username

切换工作目录

# 切换到指定目录
cd /path/to/directory

# 切换到用户主目录
cd ~
cd

# 切换到上一级目录
cd ..

# 切换到上一个工作目录
cd -

# 示例
cd /home
pwd  # 输出:/home

cd ..
pwd  # 输出:/

cd -
pwd  # 输出:/home

目录堆栈

# 将当前目录压入堆栈
pushd /tmp

# 查看目录堆栈
dirs

# 切换到堆栈中的下一个目录
pushd

# 弹出并切换到堆栈中的目录
popd

# 示例
pushd /home
pushd /tmp
pushd /var
dirs
popd
popd

重定向和管道

输出重定向

  • **>**:标准输出重定向(覆盖)
  • **>>**:标准输出重定向(追加)
  • **2>**:标准错误重定向
  • **2>>**:标准错误重定向(追加)
  • **&>**:标准输出和标准错误都重定向

示例

# 将命令输出重定向到文件(覆盖)
echo "Hello" > output.txt

# 查看文件内容
cat output.txt

# 将命令输出重定向到文件(追加)
echo "World" >> output.txt

# 查看文件内容
cat output.txt

# 将错误重定向到文件
ls non_existent_directory 2> error.txt

# 查看错误文件
cat error.txt

# 将标准输出和错误都重定向到文件
echo "Success" &> combined.txt
ls non_existent_directory &>> combined.txt

# 查看组合文件
cat combined.txt

输入重定向

  • **<**:标准输入重定向
  • **<<**:Here Document( heredoc )

示例

# 从文件读取输入
cat < input.txt

# Here Document 示例
cat << EOF
This is a here document.
It can span multiple lines.
EOF

# 将 here document 写入文件
cat << EOF > document.txt
Line 1
Line 2
Line 3
EOF

# 查看文件内容
cat document.txt

管道

  • **|**:将一个命令的输出作为另一个命令的输入

示例

# 查看当前目录下的文件,并按大小排序
ls -la | sort -k5 -nr

# 统计当前目录下的文件数量
ls -la | wc -l

# 查找包含特定内容的文件
grep "error" /var/log/syslog | head -10

# 组合多个命令
ps aux | grep "bash" | grep -v "grep"

# 示例:查找系统中占用内存最多的 5 个进程
ps aux | sort -k4 -nr | head -5

命令行快捷键

光标移动

  • Ctrl+A:移动到行首
  • Ctrl+E:移动到行尾
  • Ctrl+F:向前移动一个字符
  • Ctrl+B:向后移动一个字符
  • Alt+F:向前移动一个单词
  • Alt+B:向后移动一个单词

编辑操作

  • Ctrl+D:删除光标处的字符
  • Ctrl+H:删除光标前的字符(退格键)
  • Ctrl+K:删除从光标到行尾的内容
  • Ctrl+U:删除从光标到行首的内容
  • Ctrl+W:删除光标前的一个单词
  • Alt+D:删除光标后的一个单词
  • Ctrl+Y:粘贴之前删除的内容
  • Ctrl+C:取消当前命令
  • Ctrl+L:清屏

历史命令导航

  • Ctrl+R:反向搜索历史命令
  • Ctrl+G:退出搜索模式
  • :上一条历史命令
  • :下一条历史命令

作业控制

  • Ctrl+Z:暂停当前命令
  • fg:将后台作业带到前台
  • bg:将前台作业放到后台
  • jobs:查看后台作业

实操案例

案例1:命令行环境定制

目标:定制命令行提示符和环境

步骤

  1. 编辑 ~/.bashrc 文件

    nano ~/.bashrc
  2. 添加以下配置

    # 自定义提示符
    export PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "
    
    # 命令历史配置
    export HISTSIZE=10000

export HISTFILESIZE=10000
export HISTCONTROL=ignoreboth
export HISTTIMEFORMAT="%F %T "

常用别名

alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias update='sudo apt update && sudo apt upgrade'
alias ..='cd ..'
alias ...='cd ../..'

环境变量

export PATH="$HOME/bin:$HOME/.local/bin:$PATH"
export EDITOR="nano"
export VISUAL="nano"


3. **使配置生效**:
```bash
source ~/.bashrc
  1. 验证配置
    # 测试提示符是否变化
    # 测试别名
    ll
    ..
    # 测试历史命令
    history | head -5

案例2:文件和目录操作

目标:使用命令行进行文件和目录操作

步骤

  1. 创建目录结构

    mkdir -p project/{src,docs,tests}
  2. 查看目录结构

    ls -la project/
    find project -type d | sort
  3. 创建测试文件

    echo "Hello World" > project/src/main.txt
    echo "Documentation" > project/docs/README.md
    echo "Test file" > project/tests/test.txt
  4. 查看文件内容

    cat project/src/main.txt
    ls -la project/
  5. 复制文件

    cp project/src/main.txt project/src/main_backup.txt
    ls -la project/src/
  6. 移动文件

    mv project/tests/test.txt project/tests/test.sh
    ls -la project/tests/
  7. 删除文件

    rm project/src/main_backup.txt
    ls -la project/src/
  8. 使用管道和重定向

    # 查找所有 .txt 文件,并统计数量
    find project -name "*.txt" | wc -l
    
    # 将文件列表写入文件
    find project -type f | sort > file_list.txt
    
    # 查看文件内容
    cat file_list.txt

案例3:系统信息查看

目标:使用命令行查看系统信息

步骤

  1. 查看系统基本信息

    # 系统信息
    uname -a
    
    # 内核版本
    uname -r
    
    # 操作系统信息
    cat /etc/os-release
  2. 查看硬件信息

    # CPU 信息
    lscpu
    
    # 内存信息
    free -h
    
    # 磁盘信息
    df -h
    
    # 挂载信息
    mount
  3. 查看网络信息

    # IP 地址
    ip addr
    
    # 网络接口
    ifconfig
    
    # 路由表
    route -n
    
    # 网络连接
    netstat -tulpn
  4. 查看进程信息

    # 系统负载
    uptime
    
    # 进程列表
    ps aux | head -10
    
    # 占用 CPU 最多的进程
    ps aux | sort -k3 -nr | head -5
    
    # 占用内存最多的进程
    ps aux | sort -k4 -nr | head -5

常见问题与解决方案

问题1:命令找不到

解决方案

  • 检查命令拼写:确保命令拼写正确
  • 检查 PATH 环境变量
    echo $PATH
  • 检查命令是否安装
    # Ubuntu/Debian

sudo apt install command

CentOS/RHEL

sudo yum install command

- **使用绝对路径执行命令**:
```bash
/usr/bin/command

问题2:权限不足

解决方案

  • 使用 sudo 命令
    sudo command
  • 切换到 root 用户
    su -
    # 输入 root 密码
  • 修改文件权限
    chmod +x file.sh

问题3:命令执行卡住

解决方案

  • 取消当前命令:按下 Ctrl+C
  • 暂停当前命令:按下 Ctrl+Z,然后使用 bg 命令将其放到后台
  • 检查命令是否在运行:使用 ps 命令查看
  • 终止卡住的进程
    kill PID
    # 或强制终止
    kill -9 PID

问题4:历史命令不保存

解决方案

  • 检查 HISTFILE 环境变量
    echo $HISTFILE
  • 检查文件权限
    ls -la ~/.bash_history
  • 手动保存历史命令
    history -w
  • 检查 HISTCONTROL 设置
    echo $HISTCONTROL

问题5:命令补全不工作

解决方案

  • 检查 bash-completion 是否安装
    # Ubuntu/Debian

sudo apt install bash-completion -y

CentOS/RHEL

sudo yum install bash-completion -y

- **重新加载 bash-completion**:
```bash
source /etc/profile.d/bash_completion.sh
  • 检查是否使用 Tab 键:确保使用 Tab 键进行补全
  • 检查是否有可补全的内容:确保路径或命令存在

总结与最佳实践

核心概念回顾

  1. 命令行界面:通过文本命令与系统交互的界面
  2. 命令格式:command [options] [arguments]
  3. 命令执行:Shell 解析、查找、执行命令并返回状态码
  4. 命令历史:记录和重用之前执行的命令
  5. 命令补全:使用 Tab 键自动补全命令、路径和文件名
  6. 工作目录:当前所在的目录,使用 pwd 查看,cd 切换
  7. 重定向:将命令的输入或输出重定向到文件
  8. 管道:将一个命令的输出作为另一个命令的输入
  9. 快捷键:提高命令行操作效率的键盘快捷键

命令行最佳实践

  1. 命令组织

    • 使用空格分隔命令、选项和参数
    • 长命令使用换行符(\)分割成多行
    • 使用注释(#)说明复杂命令
  2. 命令执行

    • 先在测试环境中执行复杂命令
    • 使用 echo 命令预览命令执行结果
    • 备份重要文件后再执行修改操作
  3. 命令历史

    • 使用上下箭头快速访问历史命令
    • 使用 Ctrl+R 搜索历史命令
    • 定期清理不需要的历史命令
  4. 命令补全

    • 经常使用 Tab 键进行命令和路径补全
    • 安装 bash-completion 以获得更高级的补全功能
    • 双击 Tab 查看所有可能的补全选项
  5. 工作目录

    • 使用相对路径和绝对路径的组合
    • 使用 pushd 和 popd 管理目录导航
    • 定期清理不需要的目录
  6. 重定向和管道

    • 使用重定向保存命令输出
    • 使用管道组合多个命令
    • 注意重定向的覆盖和追加模式
  7. 快捷键使用

    • 熟练使用常用快捷键
    • 自定义快捷键提高效率
    • 练习盲打减少键盘查看

效率提升技巧

  1. 使用别名:为常用命令创建别名
  2. 使用函数:为复杂操作创建自定义函数
  3. 使用脚本:将重复操作编写为脚本
  4. 使用通配符:*、?、[] 等通配符简化文件操作
  5. 使用命令分组:使用 () 和 {} 分组命令
  6. 使用后台执行:使用 & 和 nohup 在后台执行命令
  7. 使用会话管理:使用 screen 或 tmux 管理多个会话

安全提示

  1. 命令执行

    • 不执行来源不明的命令
    • 不使用 root 用户执行普通操作
    • 注意命令中的特殊字符
  2. 文件操作

    • 谨慎使用 rm 命令,特别是 rm -rf
    • 备份重要文件后再执行修改操作
    • 注意文件权限设置
  3. 环境变量

    • 不将密码等敏感信息存储在环境变量中
    • 定期检查环境变量设置
  4. 命令历史

    • 不在命令行中输入密码等敏感信息
    • 清理包含敏感信息的历史命令

后续学习路径

  1. 高级命令行技巧

    • Shell 脚本编程
    • 正则表达式
    • 高级文本处理命令
  2. 系统管理

    • 用户和权限管理
    • 进程管理
    • 服务管理
  3. 网络操作

    • 网络配置
    • 远程管理
    • 网络故障排查
  4. 文件系统

    • 文件系统管理
    • 磁盘管理
    • 存储配置

通过本教程的学习,你应该已经掌握了 Linux 命令行界面的基础知识。命令行是 Linux 系统的核心,熟练掌握命令行操作对于高效使用 Linux 系统至关重要。随着你对命令行的深入了解,你将能够更高效地完成各种系统管理和开发任务,充分发挥 Linux 系统的强大功能。

« 上一篇 Linux 系统登录与退出 下一篇 » 命令格式与帮助系统