Linux Bash(一)

认识与学习 BASH

1.1 硬件、内核与 Shell 的关系

① 三者层次结构:

复制代码
硬件(Hardware)
   ↑
内核(Kernel)
   ↑
Shell(命令解释器)
   ↑
用户(User)
  • 硬件:CPU、内存、硬盘、网卡等。
  • 内核(Kernel):操作系统的核心,负责管理硬件资源、文件系统、进程调度、内存管理、驱动接口等。
  • Shell:内核的"外壳",用户与系统交互的接口(命令行解释器)。
  • 用户:通过 Shell 发出命令 → Shell 解析并调用内核 → 内核操作硬件 → 返回结果给用户。

② 底层原理与过程:

复制代码
用户输入命令 → Shell 解析命令 → 调用系统调用(syscall)
→ 内核执行操作 → 返回结果到 Shell → 显示输出

③ Shell 的本质:

  • 是一种运行在用户空间的命令解释器程序
  • 提供交互模式(命令行)和批处理模式(Shell脚本)。

1.2 为什么要学习命令行模式的 Shell?

① 一致性(Consistency)

  • 图形界面在不同发行版之间差异大,但命令行在各种 Linux 系统中几乎通用。
  • 远程管理(SSH)主要依赖命令行环境。
  • 许多自动化工具(如 Ansible、Docker、K8s)底层依赖命令执行。

② Shell 脚本的威力

  • 可将重复任务自动化(系统管理、部署、备份等)。
  • 脚本语言 → 可编程接口 → 与系统资源深度结合。
  • 提升效率、可维护性、稳定性。

1.3 系统的合法 Shell 与 /etc/shells 的功能

/etc/shells 文件作用:

  • 列出系统中允许使用的合法登录 Shell。
  • 登录时,系统会检查用户设置的 Shell 是否在该文件中。
  • 部分程序(如 FTP、chsh)也会参考此文件判断 Shell 合法性。

查看内容:

复制代码
cat /etc/shells

常见输出示例:

复制代码
/bin/bash
/bin/sh
/bin/zsh
/sbin/nologin

② 不同种类的 Shell:

Shell 名称 可执行文件路径 特点
bash /bin/bash 默认、最常用,功能丰富,兼容 sh
sh /bin/sh 最早的 Shell,简单、标准化
zsh /bin/zsh 高度可定制,功能强大(自动补全、美化)
csh / tcsh /bin/csh, /bin/tcsh C语法风格,脚本不兼容 bash
dash /bin/dash 启动快,Ubuntu 默认 /bin/sh
/sbin/nologin /sbin/nologin 用于禁用登录(如系统用户)

/sbin/nologin 的功能:

  • 分配给系统服务账户禁止登录的用户

  • 若用户尝试登录,将显示一条信息并拒绝进入 Shell。

  • 示例:

    grep nologin /etc/passwd

1.4 Bash Shell 的功能

Bash(Bourne Again SHell)不仅是命令解释器,也是一种功能强大的交互式环境,支持历史记录、补全、别名、作业控制、脚本自动化等高级功能。


(1)命令历史(History)

功能: 记录用户输入的命令,方便回顾与重复执行。

常用命令与操作:

操作 功能
history 显示历史命令列表
history n 显示最近 n 条命令
!n 执行历史列表中第 n 条命令
!! 重复执行上一条命令
!keyword 执行最近以 keyword 开头的命令
Ctrl + r 向后搜索历史命令(交互式)
~/.bash_history 历史命令文件,登录时加载、退出时保存

(2)自动补全(Tab Completion)

功能: 使用 Tab 键自动补齐命令或文件路径。

  • Tab:补全命令或文件名。
  • Tab Tab:显示所有可能的补全选项。
  • Bash 通过内建补全机制 + /etc/bash_completion 实现。

示例:

复制代码
cd /et<Tab>   # 自动补全为 /etc/

(3)命令别名(Alias)

功能: 给复杂命令起短名,提高效率。

常用操作:

命令 功能
alias 查看当前定义的别名
alias ll='ls -l --color=auto' 定义别名
unalias ll 删除别名
echo "alias ll='ls -l --color=auto'" >> ~/.bashrc 永久生效

原理说明:

  • alias 是 Shell 的内部机制(解析时替换),不是环境变量。
  • 定义的别名仅在当前会话有效,需写入 ~/.bashrc 才能持久化。

(4)作业控制(Job Control)

功能: 同时管理多个进程,控制前后台运行。

命令/操作 功能
command & 将命令放入后台执行
jobs 查看当前作业列表
fg %n 将第 n 个作业调回前台
bg %n 将第 n 个作业放到后台运行
Ctrl + Z 暂停当前前台任务(转为后台"停止"状态)
kill %n 终止第 n 个作业
disown 脱离当前 shell 控制(防止退出时被终止)

示例:

复制代码
sleep 100 &
jobs
fg %1

(5)Shell 脚本(Shell Script)

功能: 批量自动执行命令的文本文件。

基本格式:

复制代码
#!/bin/bash
# 示例脚本
echo "Hello, Linux!"

执行方法:

复制代码
bash script.sh
# 或赋予可执行权限后直接执行
chmod +x script.sh
./script.sh

(6)通配符(Wildcard)

通配符用于匹配文件名(而非正则表达式)。

通配符 含义 示例
* 匹配任意长度字符(含空) ls *.txt 匹配所有 .txt 文件
? 匹配任意单个字符 ls file?.txt 匹配 file1.txt、fileA.txt
[abc] 匹配方括号内任一字符 ls [ab]* 匹配以 a 或 b 开头的文件
[a-z] 匹配字符范围 ls [0-9]* 匹配以数字开头的文件
[!abc] 匹配不包含这些字符的文件 ls [!a]* 匹配不以 a 开头的文件

1.5 查询命令是否为 Bash Shell 内置命令:type

功能: 判断一个命令的来源,是内建命令外部程序别名 、还是函数

示例:

复制代码
type cd
# cd is a shell builtin

type ls
# ls is /bin/ls

type alias
# alias is a shell builtin

type -a echo
# echo is a shell builtin
# echo is /usr/bin/echo
Bash 中命令的四种来源

在终端输入一个命令(例如 lscdaliasmyfunc),Bash 会依次检查这个命令属于哪一类,并按照优先级来执行。


内建命令(Builtin Command)
  • Bash 自身实现 的命令,不依赖外部可执行文件。
  • 执行速度快,因为不需要新建进程(直接在 Shell 内部运行)。

示例:

复制代码
cd
alias
echo
pwd
history
type
set
export

type cd
# 输出:cd is a shell builtin
  • 运行效率高;
  • 通常与 Shell 环境紧密相关(如修改变量、切换目录等外部命令无法实现的操作)。

外部程序(External Command)
  • 系统中独立存在的可执行文件(通常在 /bin/usr/bin 等路径下)。
  • 执行时 Bash 会创建新的进程(调用 fork + exec)。

示例:

复制代码
ls
cat
grep
ping
vim

type ls
# 输出:ls is /bin/ls
  • 独立于 Bash;
  • 可以被其他 Shell 或程序调用;
  • 位置由环境变量 $PATH 决定(Bash 会在 PATH 路径中依次查找)。

别名(Alias)
  • 命令的文字替换规则;

  • Bash 在解析命令时,会先检查是否为别名

  • 如果匹配,就用定义的内容替换成完整命令。

    alias ll='ls -l --color=auto'
    type ll

    输出:ll is aliased to ls -l --color=auto

  • 仅在当前 shell 有效;

  • 不创建进程;

  • 属于 语法层面替换,在命令解析阶段完成;

  • 可写入 ~/.bashrc 实现永久生效。


函数(Function)
  • 由用户或脚本定义的命令集合;
  • 在当前 Shell 进程中执行;
  • 可接收参数 $1$2 等;
  • 功能类似脚本,但无需创建外部进程。

示例:

复制代码
myfunc() {
    echo "Hello from myfunc!"
}

type myfunc
# 输出:myfunc is a function
# myfunc () { echo "Hello from myfunc!"; }
  • 比外部脚本运行快;
  • 在当前 shell 中生效;
  • 可通过 declare -f 查看所有函数。

1.6 命令执行与快速编辑操作

(1)命令换行输入
  • 使用反斜杠 \ 表示续行(命令未结束):

    echo "This is a
    long command"

  • 也可直接按 Enter,Bash 会在命令不完整时自动换行继续输入(例如多引号、括号未闭合)。


(2)光标移动快捷键(命令行编辑)

Bash 使用 Readline 库 支持 Emacs 风格快捷键(默认模式)。

快捷键 功能
Ctrl + A 移动到行首(A → Ahead)
Ctrl + E 移动到行尾(E → End)
Ctrl + U 删除光标前的所有内容
Ctrl + K 删除光标后的所有内容
Ctrl + W 删除前一个单词
Alt + B 向后移动一个单词(Back)
Alt + F 向前移动一个单词(Forward)
Ctrl + L 清屏(等同于 clear
Ctrl + R 搜索历史命令
Ctrl + C 中断当前命令
Ctrl + D 退出当前 shell(EOF)

相关推荐
硬核子牙2 小时前
调试器是怎么让代码停下来的
linux
我狸才不是赔钱货2 小时前
DevOps:打破开发与运维之间的高墙
运维·vscode·docker·devops
疯癫的老码农3 小时前
【Linux环境下安装】SpringBoot应用环境安装(五)-milvus安装
linux·spring boot·milvus
我狸才不是赔钱货3 小时前
揭开命令行的面纱:终端、CLI、Shell的终极辨析
vscode·ssh·bash
孤廖3 小时前
C++ 模板再升级:非类型参数、特化技巧(含全特化与偏特化)、分离编译破解
linux·服务器·开发语言·c++·人工智能·后端·深度学习
油条不卖3 小时前
本地window10同步ubuntu上conda指定环境,并在C#项目中通过Python.NET调用自定义python接口
linux·ubuntu·conda
文火冰糖的硅基工坊3 小时前
[人工智能-大模型-9]:大模型十大应用场景和对应的代表性的产品?
服务器·人工智能·大模型
GeekAGI3 小时前
ansible-playbook -e 传递变量
运维
chenzfp3 小时前
【运维】鲲鹏麒麟V10 操作系统aarch64自制OpenSSH 9.8p1 rpm包 ssh漏洞修复
运维·ssh