开源之家
  • 首页
  • 精品培训视频
  • 计算机电子书
  • 软件工具
  • 知识库
    • Linux入门教程
    • Shell脚本学习指南
    • Nginx入门教程
    • Docker 入门实战
    • Kubernetes(k8s)手册
    • 快乐的Linux命令行
  • Linux命令手册
登录

Linux入门教程

01 Linux简介
  • 1.0 Linux学习路线
  • 1.1 操作系统概述
  • 1.2 Linux是什么,有哪些特点?
  • 1.3 Linux和UNIX的关系及区别(详解版)
  • 1.4 类UNIX系统是什么鬼?
  • 1.5 Linux中大量使用脚本语言,而不是C语言!
  • 1.6 为什么要学Linux,它比Windows好在哪里?
  • 1.7 Linux系统的优缺点
  • 1.8 常见Linux发行版本有哪些?
  • 1.9 初学者应选择哪个Linux发行版?
  • 1.10 Linux桌面系统大比拼|附带优缺点
  • 1.11 Linux的主要应用领域有哪些?
  • 1.12 Linux已经霸占了服务器领域!
  • 1.13 开源软件是什么?有哪些?
  • 1.14 开源协议是什么?有哪些?如何选择?
  • 1.15 开源就等于免费吗?用事实来说话
  • 1.16 Linux该如何学习(新手入门必看)
  • 1.17 想学好Linux,这些习惯必须养成(初学者必读)
02 Linux安装
  • 2.1 安装Linux系统对硬件有什么要求?
  • 2.2 虚拟机是什么
  • 2.3 为什么建议使用虚拟机来安装Linux?
  • 2.4 小白必看:零基础安装Linux系统(超级详细)
  • 2.5 使用U盘安装Linux系统
  • 2.6 使用dd命令安装Linux系统
  • 2.7 使用LiveCD从光盘直接运行Linux,无需安装
  • 2.8 忘记root账户密码怎么办?
  • 2.9 使用系统光盘修复Linux系统
  • 2.10 破解密码这么简单,Linux是安全的操作系统吗?
  • 2.11 Linux四种远程管理协议
  • 2.12 Linux两种远程管理工具(PuTTY和SecureCRT)
  • 2.13 新手必读的Linux使用注意事项
  • 2.14 Linux文件目录结构一览表
  • 2.15 Linux中一切皆文件[包含优缺点]
  • 2.16 Linux挂载详解
  • 2.17 新手必看的Linux服务器管理和维护注意事项
03 Linux文件和目录管理
  • 3.1 Linux文件系统的层次结构
  • 3.2 Linux文件系统到底有什么用处?
  • 3.3 Linux绝对路径和相对路径详解
  • 3.4 Linux文件(目录)命名规则
  • 3.5 Linux命令行下如何识别文件类型?
  • 3.6 Linux命令基本格式
  • 3.7 Linux切换目录(cd命令)
  • 3.8 Linux显示当前工作路径(pwd命令)
  • 3.9 Linux查看目录中的文件(ls命令)
  • 3.10 Linux创建目录(mkdir命令)
  • 3.11 Linux删除空目录(rmdir命令)
  • 3.12 Linux创建文件及修改文件时间戳(touch命令)
  • 3.13 Linux建立软硬链接文件(ln命令)
  • 3.14 深度剖析Linux硬链接和软链接,直击它们的本质!
  • 3.15 Linux复制文件和目录(cp命令)
  • 3.16 Linux删除文件或目录(rm命令)
  • 3.17 Linux移动或重命名文件和目录(mv命令)
  • 3.18 Linux懒人神器:命令自动补全功能!
  • 3.19 Linux命令的执行过程是怎样的?(新手必读)
  • 3.20 什么是环境变量,Linux环境变量有哪些?
  • 3.21 Linux PATH环境变量及作用(初学者必读)
04 Linux打包和压缩详解
  • 4.1 打包和压缩的概念和区别
  • 4.2 Linux tar打包命令详解
  • 4.3 Linux压缩文件或目录为.zip格式(zip命令)
  • 4.4 Linux解压.zip格式的文件(unzip命令)
  • 4.5 Linux压缩文件或目录中文件为.gz格式(gzip命令)
  • 4.6 Linux解压.gz格式的文件(gunzip命令)
  • 4.7 Linux压缩文件或目录中文件为.bz2格式(bzip2命令)
  • 4.8 Linux解压.bz2格式的文件(bunzip2命令)
05 Vim文本编辑器
  • 5.1 Vim及其安装
  • 5.2 Vi和Vim之间到底有什么关系?
  • 5.3 Linux Vim三种工作模式
  • 5.4 Linux Vim基本操作
  • 5.5 Vim移动光标命令汇总
  • 5.6 Linux Vim撤销和恢复撤销快捷键
  • 5.7 Linux Vim可视化模式
  • 5.8 Vim多窗口编辑模式
  • 5.9 Linux Vim批量注释和自定义注释
  • 5.10 Vim显示行号
  • 5.11 Vim配置文件(.vimrc)详解
06 Linux文本处理
  • 6.1 Linux连接合并文件内容(cat命令)
  • 6.2 Linux分屏显示文件内容(more命令)
  • 6.3 Linux显示文件开头内容(head命令)
  • 6.4 Linux查看文件内容(less命令)
  • 6.5 Linux显示文件结尾内容(tail命令)
  • 6.6 Linux重定向(输入输出重定向)
  • 6.7 Linux grep(Linux三剑客之一)
  • 6.8 Linux sed(Linux三剑客之一)
  • 6.9 Linux sed命令的高级玩法
  • 6.10 Linux awk(Linux三剑客之一)
  • 6.11 Linux awk命令的高级玩法
07 Linux系统软件安装
  • 7.1 Linux软件包
  • 7.2 Linux RPM包统一命名规则
  • 7.3 Linux RPM包安装、卸载和升级
  • 7.4 Linux rpm命令查询软件包
  • 7.5 Linux RPM包验证和数字证书
  • 7.6 Linux提取RPM包
  • 7.7 Linux SRPM源码包安装
  • 7.8 Linux重建RPM数据库(修复损坏的RPM数据库)
  • 7.9 RPM包的依赖性及其解决方案
  • 7.10 Linux yum源及配置
  • 7.11 Linux yum命令
  • 7.12 Linux yum管理软件组
  • 7.13 Linux源码包安装和卸载
  • 7.14 Linux源码包升级
  • 7.15 RPM包和源码包,究竟应该选择哪种安装方式?
  • 7.16 Linux函数库(静态函数库和动态函数库)及其安装过程
  • 7.17 Linux脚本程序包及安装方法详解(以webmin为例)
08 Linux用户和用户组管理
  • 8.1 Linux用户和用户组
  • 8.2 Linux UID和GID
  • 8.3 Linux /etc/passwd
  • 8.4 Linux /etc/shadow
  • 8.5 Linux /etc/group
  • 8.6 Linux /etc/gshadow
  • 8.7 Linux初始组和附加组
  • 8.8 Linux /etc/login.defs
  • 8.9 Linux系统添加新用户(useradd命令)
  • 8.10 Linux修改系统用户密码(passwd命令)
  • 8.11 Linux修改系统用户信息(usermod命令)
  • 8.12 Linux强制系统用户登陆时修改密码(chage命令)
  • 8.13 Linux删除系统用户(userdel命令)
  • 8.14 Linux查看用户的UID和GID(id命令)
  • 8.15 Linux临时切换用户身份(su命令)
  • 8.16 Linux whoami和who am i命令
  • 8.17 Linux添加用户组(groupadd命令)
  • 8.18 Linux修改用户组(groupmod命令)
  • 8.19 Linux删除用户组(groupdel命令)
  • 8.20 Linux将系统用户加入或移除群组(gpasswd命令)
  • 8.21 Linux切换用户的有效群组(newgrp命令)
09 Linux权限管理
  • 9.1 Linux权限管理的重要性
  • 9.2 Linux修改文件和目录的所属组(chgrp命令)
  • 9.3 Linux修改文件和目录的所有者和所属组(chown命令)
  • 9.4 Linux文件权限到底是如何设定的?
  • 9.5 Linux读写执行权限(-r、-w、-x)的真正含义是什么?
  • 9.6 Linux修改文件或目录权限(chmod命令)
  • 9.7 Linux默认权限的设定和修改(umask)
  • 9.8 Linux ACL访问控制权限
  • 9.9 Linux ACL权限设置(setfacl和getfacl)
  • 9.10 Linux mask有效权限有什么用,如何修改?
  • 9.11 Linux SetUID(SUID)特殊权限
  • 9.12 不要轻易设置SetUID(SUID)权限,否则会带来重大安全隐患!
  • 9.13 Linux SetGID(SGID)特殊权限
  • 9.14 Linux Stick BIT(SBIT)特殊权限
  • 9.15 Linux文件特殊权限(SUID、SGID和SBIT)的设置
  • 9.16 Linux修改文件或目录的隐藏属性(chattr命令)
  • 9.17 Linux查看文件或目录的隐藏属性(lsattr命令)
  • 9.18 Linux sudo命令(包含和su命令的对比)
  • 9.19 Linux权限对指令执行的影响
10 Linux文件系统管理
  • 10.1 硬盘结构(机械硬盘和固态硬盘)详解
  • 10.2 Linux文件系统详解
  • 10.3 Linux系统是如何识别硬盘设备和硬盘分区的?
  • 10.4 Linux df用法详解:查看文件系统硬盘使用情况
  • 10.5 Linux du命令:统计目录或文件所占磁盘空间大小
  • 10.6 Linux mount命令详解:挂载Linux系统外的文件
  • 10.7 Linux挂载光盘(使用mount命令)
  • 10.8 Linux挂载U盘(使用mount命令)
  • 10.9 Linux开机自动挂载硬件设备(配置/etc/fatab文件)
  • 10.10 修改/etc/fstab文件出错导致Linux不能启动,该怎么办?
  • 10.11 Linux umount命令:卸载文件系统
  • 10.12 Linux fsck命令:检测和修复文件系统
  • 10.13 Linux dumpe2fs命令:查看文件系统信息
  • 10.14 Linux fdisk命令详解:给硬盘分区
  • 10.15 Linux fdisk创建分区(主分区、扩展分区和逻辑分区)过程详解
  • 10.16 Linux parted命令用法详解:创建分区
  • 10.17 Linux mkfs命令详解格式化分区(为分区写入文件系统)
  • 10.18 Linux mke2fs命令格式化硬盘(给硬盘写入文件系统)
  • 10.19 Linux虚拟内存和物理内存
  • 10.20 Linux swap分区及作用详解
11 Linux高级文件系统管理
  • 11.1 磁盘配额是什么
  • 11.2 磁盘配额启动前的准备工作
  • 11.3 Linux扫描文件系统并建立磁盘配额记录文件(quotacheck命令)
  • 11.4 Linux开启磁盘配额限制(quotaon命令)
  • 11.5 Linux关闭磁盘配额限制(quotaoff命令)
  • 11.6 Linux修改用户(群组)的磁盘配额(edquota命令)
  • 11.7 Linux非交互式设置磁盘配额(setquota命令)
  • 11.8 Linux查询已建立好的磁盘配额(quota和repquota命令)
  • 11.9 Linux磁盘配额测试过程完全攻略
  • 11.10 Linux LVM逻辑卷管理机制
  • 11.11 Linux PV物理卷
  • 11.12 Linux VG卷组
  • 11.13 Linux LV逻辑卷
  • 11.14 Linux LVM(逻辑卷管理)的删除
  • 11.15 Linux RAID(磁盘阵列)完全攻略
  • 11.16 使用图形界面来配置RAID
  • 11.17 使用mdadm命令来配置RAID
12 Linux系统管理
  • 12.1 Linux进程管理
  • 12.2 Linux进程启动的方式有几种?
  • 12.3 Linux如何查看正在运行的进程(ps命令)
  • 12.4 Linux实时监听进程运行状态(top命令)
  • 12.5 Linux查看进程树(pstree命令)
  • 12.6 Linux列出进程调用或打开的文件信息(lsof命令)
  • 12.7 Linux进程优先级
  • 12.8 Linux调整进程的优先级(nice和renice命令)
  • 12.9 Linux常用信号(进程间通信)
  • 12.10 Linux终止进程(kill命令)
  • 10.11 Linux umount命令:卸载文件系统
  • 10.12 Linux fsck命令:检测和修复文件系统
  • 10.13 Linux dumpe2fs命令:查看文件系统信息
  • 10.14 Linux fdisk命令详解:给硬盘分区
  • 10.15 Linux fdisk创建分区(主分区、扩展分区和逻辑分区)过程详解
  • 10.16 Linux parted命令用法详解:创建分区
  • 10.17 Linux mkfs命令详解格式化分区(为分区写入文件系统)
  • 10.18 Linux mke2fs命令格式化硬盘(给硬盘写入文件系统)
  • 10.19 Linux虚拟内存和物理内存
  • 10.20 Linux swap分区及作用详解
13 Linux数据备份与恢复
  • 13.1 Linux备份的重要性
  • 13.2 Linux中的哪些数据需要备份?
  • 13.3 Linux数据备份介质的选择
  • 13.4 Linux备份策略
  • 13.5 Linux tar命令备份数据
  • 13.6 Linux dump
  • 13.7 Linux restore
  • 13.8 Linux dd
  • 13.9 Linux rsync命令:支持本地备份和远程备份
14 Linux系统服务管理
  • 14.1 Linux系统服务
  • 14.2 Linux端口
  • 14.3 Linux独立服务管理
  • 14.4 Linux基于xinetd服务的管理
  • 14.5 Linux源码包服务管理
  • 14.6 Linux常见服务类别及功能
  • 14.7 影响Linux系统性能的因素有哪些?
  • 14.8 Linux分析系统性能(sar命令)
  • 14.9 Linux如何查看CPU运行状态?
  • 14.10 Linux如何查看内存的使用情况?
  • 14.11 Linux如何查看硬盘的读写性能?
15 Linux系统日志管理
  • 15.1 Linux rsyslogd服务
  • 15.2 Linux日志文件及功能
  • 15.3 Linux日志文件的格式分析
  • 15.4 rsyslogd配置文件格式及其内容
  • 15.5 Linux日志服务器设置
  • 15.6 Linux日志轮替(日志转储)
  • 15.7 Linux logrotate命令
  • 15.8 Linux日志分析工具
16 Linux系统启动管理
  • 16.1 Linux系统启动流程
  • 16.2 BIOS开机自检
  • 16.3 主引导目录(MBR)结构及作用
  • 16.4 Linux内核(内核模块)的加载
  • 16.5 Linux /sbin/init
  • 16.6 Linux /etc/inittab
  • 16.7 Linux /etc/rc.d/rc.local配置文件
  • 16.8 Linux启动引导程序加载内核
  • 16.9 Linux /boot/grub/目录
  • 16.10 Linux GRUB磁盘分区表示法
  • 16.11 Linux GRUB配置文件
  • 16.12 Linux多系统并存的GRUB配置文件
  • 16.13 Linux GRUB手动安装
  • 16.14 Linux GRUB加密
  • 16.15 Linux字符界面调整分辨率
  • 16.16 Linux内核模块管理
  • 16.17 Linux NTFS文件系统安装
17 LAMP环境搭建和LNMP环境搭建
  • 17.1 Linux LAMP环境搭建的前期准备
  • 17.2 Linux libxml2安装
  • 17.3 Linux libmcrypt安装
  • 17.4 Linux mhash和mcrypt安装
  • 17.5 Linux zlib和libpng安装
  • 17.6 Linux jpeg6安装
  • 17.7 Linux freetype安装
  • 17.8 Linux gd库安装
  • 17.9 Linux Apache安装
  • 17.10 Linux ncurses安装
  • 17.11 Linux MySQL安装
  • 17.12 Linux PHP安装
  • 17.13 Linux memcache安装和配置
  • 17.14 Linux phpmyadmin安装及配置
  • 17.15 LNMP安装的前期准备
  • 17.16 LNMP一键安装
  • 17.17 LNMP安装php扩展模块
18 SELinux管理
  • 18.1 SELinux是什么
  • 18.2 SELinux的主要作用
  • 18.3 SELinux 的3种工作模式
  • 18.4 SELinux配置文件(/etc/selinux/config)
  • 18.5 SELinux工作模式设置
  • 18.6 SELinux安全上下文查看
  • 18.7 SELinux安全上下文的修改和设置
  • 18.8 SELinux默认安全上下文的查询和修改
  • 18.9 SELinux auditd日志系统的安装与启动
  • 18.10 SELinux auditd日志使用方法
  • 18.11 SELinux的3种策略类型
  • 18.12 SELinux策略规则查看的方法
  • 18.13 SELinux策略规则的开启和关闭

Shell脚本学习指南

01 Shell基础
  • 1.1 Shell是什么
  • 1.2 Shell是运维人员必须掌握的技能
  • 1.3 常用的Shell有哪些?
  • 1.4 进入Shell的两种方式
  • 1.5 Shell命令的基本格式
  • 1.6 Shell命令的本质到底是什么?如何自己实现一个命令?
  • 1.7 Shell命令的选项和参数在本质上是什么
  • 1.8 Shell命令提示符
  • 1.9 修改命令提示符
  • 1.10 第一个Shell脚本
  • 1.11 执行Shell脚本
  • 1.12 Shell四种运行方式
  • 1.13 Shell配置文件的加载
  • 1.14 如何编写自己的Shell配置文件?
02 Shell编程
  • 2.1 Shell变量
  • 2.2 Linux中的文件描述符到底是什么?
  • 2.3 Shell命令替换
  • 2.4 Shell位置参数
  • 2.5 Shell特殊变量
  • 2.6 Shell $*和$@之间的区别
  • 2.7 Shell $?
  • 2.8 Shell字符串详解
  • 2.9 Shell字符串拼接
  • 2.10 Shell字符串截取
  • 2.11 Shell数组
  • 2.12 Shell获取数组长度
  • 2.13 Shell数组拼接
  • 2.14 Shell删除数组元素
  • 2.15 Shell关联数组
  • 2.16 Shell内建命令
  • 2.17 Shell alias命令
  • 2.18 Shell echo命令
  • 2.19 Shell read命令
  • 2.20 Shell exit命令
  • 2.21 Shell declare和typeset命令
  • 2.22 Shell数学计算
  • 2.23 Shell (())
  • 2.24 Shell let命令
  • 2.25 Shell $[]
  • 2.26 Shell expr命令
  • 2.27 Linux bc命令
  • 2.28 Shell declare -i
  • 2.29 Shell if else
  • 2.30 Shell退出状态
  • 2.31 Shell test命令
  • 2.32 Shell [[]]
  • 2.33 Shell case in
  • 2.34 Shell while
  • 2.35 Shell until
  • 2.36 Shell for
  • 2.37 Shell select in
  • 2.38 Shell break和continue
  • 2.39 Shell函数
  • 2.40 Shell函数参数
  • 2.41 Shell函数返回值精讲
03 Shell高级教程
  • 3.1 Shell重定向
  • 3.2 Linux中的文件描述符到底是什么?
  • 3.3 结合文件描述符谈重定向,彻底理解重定向的本质!
  • 3.4 使用exec命令操作文件描述符
  • 3.5 使用exec命令操作文件描述符
  • 3.6 Shell Here Document
  • 3.7 Shell Here String
  • 3.8 Shell组命令
  • 3.9 Shell进程替换
  • 3.10 Linux管道
  • 3.11 Shell过滤器
  • 3.12 子Shell和子进程到底有什么区别?
  • 3.13 如何检测子Shell和子进程?
  • 3.14 Linux中的信号是什么
  • 3.15 Bash Shell中的信号
  • 3.16 Linux进程简明教程
  • 3.17 使用什么命令查看进程
  • 3.18 Shell向进程发送信号
  • 3.19 使用trap命令获取信号
  • 3.20 trap命令捕获信号实例演示
  • 3.21 移除(重置)信号捕获
  • 3.22 关于进程、信号和捕获的总结
  • 3.23 Shell模块化
04 Bash Shell快捷键
  • 4.1 Bash Shell快捷键大全
  • 4.2 Bash Shell命令自动补全功能
  • 4.3 Bash Shell历史命令

Nginx入门教程

01 Nginx基础
  • 1.1 前言
  • 1.2 Nginx 简介
  • 1.3 Nginx 源码架构分析
  • 1.4 Nginx 编译安装
  • 1.5 Tengine 编译安装
  • 1.6 OpenResty 编译安装
  • 1.7 Nginx 配置简述
  • 1.8 Nginx Docker 容器化配置
02 Nginx核心配置
  • 2.1 Nginx 核心配置指令
  • 2.2 Nginx 配置文件
  • 2.3 Nginx 进程配置指令
  • 2.4 Nginx 端口监听
  • 2.5 Nginx 主机名
  • 2.6 Nginx 处理HTTP请求
  • 2.7 Nginx 路由匹配规则
  • 2.8 Nginx 重定向配置
  • 2.9 Nginx 根目录配置
  • 2.10 Nginx 访问路径别名
  • 2.11 Nginx 文件判断
  • 2.12 Nginx 零复制
  • 2.13 Nginx 日志记录配置
03 Nginx HTTP模块
  • 3.1 Nginx 镜像模块
  • 3.2 Nginx 请求头控制模块
  • 3.3 Nginx IP访问控制模块
  • 3.4 Nginx 用户cookie模块
  • 3.5 Nginx 并发连接数限制模块
  • 3.6 Nginx 首页处理模块
  • 3.7 Nginx 请求频率限制模块
  • 3.8 Nginx 页面缓存时间配置
  • 3.9 Nginx gzip压缩及相关配置
04 Nginx Web服务
  • 4.1 Nginx 静态资源服务器搭建
  • 4.2 Nginx 文件下载服务器搭建
  • 4.3 Nginx 伪动态SSI服务器
  • 4.4 Nginx HTTPS服务器搭建
  • 4.5 Nginx FastCGI模块配置简述
  • 4.6 Nginx PHP服务器环境搭建
  • 4.7 Nginx 基于FastCGI负载均衡
  • 4.8 Nginx CGI网关接口
  • 4.9 Nginx uWSGI模块配置
  • 4.10 Nginx Python项目部署
  • 4.11 Nginx 伪流媒体服务器搭建
  • 4.12 Nginx HTTP2模块配置简述
  • 4.13 Nginx WebDAV模块配置简述
05 Nginx 代理服务器
  • 5.1 Nginx HTTP代理服务器
  • 5.2 Nginx stream模块简述
  • 5.3 Nginx TCPUDP代理简述
  • 5.4 Nginx 基于SSL的TCP代理服务器
  • 5.5 Nginx gRPC代理服务器
06 Nginx 缓存
  • 6.1 Nginx Web缓存配置
  • 6.2 Nginx 代理缓存配置
  • 6.3 Nginx Memcached 缓存模块
  • 6.4 Nginx 反向代理缓存服务器配置
  • 6.5 Nginx 客户端缓存控制
07 Nginx 负载均衡
  • 7.6 Nginx TCPUDP负载均衡
  • 7.5 Nginx upstream动态更新
  • 7.4 Nginx upstream容错机制
  • 7.3 Nginx 长连接负载均衡
  • 7.2 Nginx 负载均衡策略
  • 7.1 Nginx 负载均衡模块
08 Nginx 日志管理监控
  • 8.1 Nginx 日志分析简述
  • 8.2 Nginx 访问日志配置
  • 8.3 Nginx 错误日志配置
  • 8.4 Nginx 日志归档配置
  • 8.5 Nginx 日志分析工具 ELK
  • 8.6 Nginx 监控工具 Prometheus
09 Nginx 集群
  • 9.1 LVS简介
  • 9.2 Keepalived 配置简述
  • 9.3 Nginx 集群负载搭建
  • 9.4 Nginx 集群配置管理规划
  • 9.5 Nginx 配置归档工具GitLab
  • 9.6 Nginx 配置修改工具Ansible
  • 9.7 Jenkins 安装与配置简述
  • 9.8 Nginx 集群配置管理实例
10 Nginx 在 k8s 的应用
  • 10.1 Kubernetes(k8s)系统简述
  • 10.2 Kubernetes(k8s)集群部署
  • 10.3 Kubernetes(k8s)网络通信
  • 10.4 Nginx Ingress 简介
  • 10.5 Nginx Ingress 安装部署
  • 10.6 Nginx Ingress 配置映射
  • 10.7 Nginx Ingress 注解

Docker 入门实战

01 Docker基础
  • 1.1 前言
  • 1.2 Docker 架构
02 Docker安装
  • 2.1 CentOS Docker 安装
  • 2.2 Ubuntu Docker 安装
  • 2.3 Debian Docker 安装
  • 2.4 Windows Docker 安装
  • 2.5 MacOS Docker 安装
  • 2.6 Docker 镜像加速
03 Docker 使用
  • 3.1 Docker Hello World
  • 3.2 Docker 容器使用
  • 3.3 Docker 镜像使用
  • 3.4 Docker 容器连接
  • 3.5 Docker 仓库管理
  • 3.6 Docker Dockerfile
  • 07 Docker Compose
  • 08 Docker Machine
  • 09 Swarm 集群管理
04 Docker 实例
  • 4.1 Docker 安装 Ubuntu
  • 4.2 Docker 安装 CentOS
  • 4.3 Docker 安装 Nginx
  • 4.4 Docker 安装 Node.js
  • 4.5 Docker 安装 PHP
  • 4.6 Docker 安装 MySQL
  • 4.7 Docker 安装 Tomcat
  • 4.8 Docker 安装 Python
  • 4.9 Docker 安装 Redis
  • 4.10 Docker 安装 MongoDB
  • 4.11 Docker 安装 Apache
05 Docker 参考手册
  • 5.1 Docker 常用命令
  • 5.2 Docker 备忘单

Kubernetes(k8s)手册

01 kubernetes 概述
  • 01 kubernetes 简介
  • 02 Kubernetes 组件
  • 03 Kubernetes API
02 Kubernetes 安装
  • 01 Kubernetes Linux安装

快乐的Linux命令行

  • 第1章:引言
  • 第2章:什么是 shell
  • 第3章:文件系统中跳转
  • 第4章:探究操作系统
  • 第5章:操作文件和目录
  • 第6章:使用命令
  • 第7章:重定向
  • 第8章:从Shell眼中看世界
  • 第9章:键盘高级操作技巧
  • 第10章:权限
  • 第11章:进程
  • 第12章:Shell环境
  • 第13章:vi简介
  • 第14章:自定制Shell提示符
  • 第15章:软件包管理
  • 第16章:存储媒介
  • 第17章:网络系统
  • 第18章:查找文件
  • 第19章:归档和备份
  • 第20章:正则表达式
  • 第21章:文本处理
  • 第22章:格式化输出
  • 第23章:打印
  • 第24章:编译程序
  • 第25章:编写第一个Shell脚本
  • 第26章:启动一个项目
  • 第27章 : 自顶向下设计
  • 第28章 : 流程控制:if 分支结构
  • 第29章 : 读取键盘输入
  • 第30章 : 流程控制:while/until 循环
  • 第31章 : 疑难排解
  • 第32章 : 流程控制:case 分支
  • 第33章 : 位置参数
  • 第34章 : 流程控制:for 循环
  • 第35章 : 字符串和数字
  • 第36章 : 数组
  • 第37章 : 奇珍异宝

第13章:vi简介

文章目录
  • 13.1 为什么我们应该学习 vi
  • 13.2 一点儿背景介绍
  • 13.3 启动和退出 vi
  • 13.4 编辑模式
    • 13.4.1 插入模式
    • 13.4.2 保存我们的工作
  • 13.5 移动光标
  • 13.6 基本编辑
    • 13.6.1 追加文本
    • 13.6.2 打开一行
    • 13.6.3 删除文本
    • 13.6.4 剪切,复制和粘贴文本
    • 13.6.5 连接行
  • 13.7 查找和替换
    • 13.7.1 查找一行
    • 13.7.2 查找整个文件
    • 13.7.3 全局查找和替代
  • 13.8 编辑多个文件
    • 13.8.1 文件之间切换
    • 13.8.2 打开另一个文件并编辑
    • 13.8.3 跨文件复制黏贴
    • 13.8.4 插入整个文件到另一个文件
  • 13.9 保存工作

第13章:vi简介

有一个古老的笑话,说是一个在纽约的游客向行人打听这座城市中著名古典音乐场馆的方向:

游客: 请问一下,我怎样去卡内基音乐大厅?

行人: 练习,练习,练习!

学习 Linux 命令行,就像要成为一名造诣很深的钢琴家一样,它不是我们一下午就能学会的技能。这需要经历多年的勤苦练习。在这一章中,我们将介绍 vi(发音“vee eye”)文本编辑器,它是 Unix 传统中核心程序之一。vi 因它难用的用户界面而有点声名狼藉,但是一位大师操作它的过程也的确非常具有艺术性。虽然我们在这里不能成为 vi 大师,但是当我们学完这一章后,
我们会知道怎样在 vi 中完成日常任务。

13.1 为什么我们应该学习 vi

在现在这个图形化编辑器和易于使用的基于文本编辑器的时代,为什么我们还应该学习 vi 呢?下面有三个充分的理由:

  • vi 很多系统都预装。如果我们的系统没有图形界面,比方说一台远端服务器或者是一个 X 配置损坏了的本地系统,那么 vi 就成了我们的救星。虽然 nano 逐渐流行起来,但是它还没有普及。POSIX,这套 Unix 系统中程序兼容的标准,就要求系统要预装 vi。

  • vi 轻量级且执行快。对于许多任务来说,启动 vi 比起在菜单中找到一个图形化文本编辑器,再等待其数倍兆字节的数据加载而言,要容易的多。另外,vi 是为了加快输入速度而设计的。我们将会看到,当一名熟练的 vi 用户在编辑文件时,他或她的手从不需要移开键盘。

  • 我们不希望其他 Linux 和 Unix 用户把我们看作胆小鬼。

好吧,可能只有两个充分的理由。

13.2 一点儿背景介绍

第一版 vi 是在1976由 Bill Joy 写成的,当时他是加州大学伯克利分校的学生,后来他共同创建了 Sun 微系统公司。vi 这个名字来源于单词“visual”,因为它打算在带有可移动光标的视频终端上编辑文本。在发明可视化编辑器之前,人们使用的是一次只能操作一行文本的行编辑器。为了编辑,用户需要告诉行编辑器到哪一行并且说明做什么修改,比方说添加或删除文本。视频终端(而不是基于打印机的终端,像电传打印机)的出现,使可视化编辑成为可能。vi 实际上整合了一个强大的行编辑器 ———— ex ,所以我们在使用 vi 时也能运行行编辑命令。

大多数 Linux 发行版不包含真正的 vi;而是自带一款高级替代版本,叫做 vim(它是“vi improved”的简写)由 Bram Moolenaar 开发的。vim 相对于传统的 Unix vi 来说,取得了实质性进步。通常,vim 在 Linux 系统中是“vi”的符号链接(或别名)。后面的内容我们专注 vim ,但我们会把 vim 简称 vi 。

13.3 启动和退出 vi

要想启动 vi,只要简单地输入以下命令:

[me@linuxbox ~]$ vi

一个像这样的屏幕应该出现:

VIM - Vi Improved
....

首先要学的是怎样退出 vi。要退出 vi,输入下面的命令(注意冒号是命令的一部分):

:q

shell 提示符应该重新出现。如果由于某种原因,vi 不能退出(通常因为我们对文件做了修改,却没有保存文件)。通过给命令加上叹号,我们可以告诉 vi 我们真要退出 vi。(注意感叹号是命令的一部分)

:q!

小贴示:如果你在 vi 中“迷失”了,试着按下 Esc 键两次来回到普通模式。

兼容模式

在上面的截屏中(来自于 Ubuntu 8.04),我们看到一行文字 “运行于 Vi 兼容模式。” 这意味着 vim 将以近似于 vi 的普通的模式运行,而不是以 vim 的高级的模式运行。出于本章的教学目的,我们将使用 vim 和它的的高级模式。要这样使用vim,可以通过如下方法:

用 vim 来代替 vi。

如果命令生效,考虑在你的.bashrc 文件中添加 alias vi='vim'。

或者,使用以下命令在你的 vim 配置文件中添加一行:

echo "set nocp" >> ~/.vimrc

不同 Linux 发行版自带的 vim 软件包各不相同。一些发行版预装了 vim 的最简版,其只支持很有限的 vim 特性。在随后练习里,你可能发现你的 vim 缺失一些特性。若是如此,请安装 vim 的完整版。

13.4 编辑模式

再次启动 vi,这次传递给 vi 一个不存在的文件名。这也是用 vi 创建新文件的方法。

[me@linuxbox ~]$ rm -f foo.txt
[me@linuxbox ~]$ vi foo.txt

如果一切正常,我们应该获得一个像这样的屏幕:

....
"foo.txt" [New File]

每行开头的波浪号("~")表示那一行没有文本。这里我们有一个空文件。先别进行输入!

关于 vi ,第二重要的事是知晓vi 是一个模式编辑器。(第一件事是如何退出 vi )vi 启动后会直接进入命令模式。这种模式下,几乎每个按键都是一个命令,所以如果我们直接输入文本,vi 会发疯,弄得一团糟。

13.4.1 插入模式

为了在文件中添加文本,我们需要先进入插入模式。按下"i"键进入插入模式。之后,我们应当在屏幕底部看到如下的信息,如果 vi 运行在高级模式下( vi 在兼容模式下不会显示这行信息):

-- INSERT --

现在我们能输入一些文本了。试着输入这些文本:

The quick brown fox jumped over the lazy dog.

若要退出插入模式返回命令模式,按下 Esc 按键。

13.4.2 保存我们的工作

为了保存我们刚才对文件所做的修改,我们必须在命令模式下输入一个 ex 命令。通过按下":"键,这很容易完成。按下冒号键之后,一个冒号字符应该出现在屏幕的底部:

:

为了写入我们修改的文件,我们在冒号之后输入"w"字符,然后按下回车键:

:w

文件将会写入到硬盘,而且我们会在屏幕底部看到一行确认信息,就像这样:

"foo.txt" [New] 1L, 46C written

小贴示:如果你阅读 vim 的文档,你会发现命令模式被(令人困惑地)叫做普通模式,ex 命令叫做命令模式。当心。

13.5 移动光标

当在 vi 命令模式下时,vi 提供了大量的移动命令,其中一些与 less 阅读器的相同。这里列举了一些:

表13-1: 光标移动按键
按键 移动光标
l or 右箭头 向右移动一个字符
h or 左箭头 向左移动一个字符
j or 下箭头 向下移动一行
k or 上箭头 向上移动一行
0 (零按键) 移动到当前行的行首。
^ 移动到当前行的第一个非空字符。
$ 移动到当前行的末尾。
w 移动到下一个单词或标点符号的开头。
W 移动到下一个单词的开头,忽略标点符号。
b 移动到上一个单词或标点符号的开头。
B 移动到上一个单词的开头,忽略标点符号。
Ctrl-f or Page Down 向下翻一页
Ctrl-b or Page Up 向上翻一页
numberG 移动到第 number 行。例如,1G 移动到文件的第一行。
G 移动到文件末尾。

为什么 h,j,k,和 l 按键被用来移动光标呢?因为在开发 vi 之初,并不是所有的视频终端都有箭头按键,熟练的打字员可以使用组合键来移动光标,他们的手指从不需要移开键盘。

vi 中的许多命令都可以在前面加上一个数字,比方说上面提到的"G"命令。在命令之前加上一个数字,我们就可以指定命令执行的次数。例如,命令"5j"将光标下移5行。

13.6 基本编辑

大多数编辑工作由一些基本的操作组成,比如说插入文本,删除文本和通过剪切和粘贴来移动文本。vi,当然,有它独特方式来实现所有的操作。vi 也提供了撤销功能,但有些限制。如果我们按下“u”按键,当在命令模式下,vi 将会撤销你所做的最后一次修改。当我们试着执行一些基本的编辑命令时,这会很方便。

13.6.1 追加文本

vi 有几种不同进入插入模式的方法。我们已经使用了 i 命令来插入文本。

让我们再次进入到我们的 foo.txt 文件:

The quick brown fox jumped over the lazy dog.

如果我们想要在这个句子的末尾添加一些文本,我们会发现 i 命令不能完成任务,因为我们不能把光标移到行尾。vi 提供了追加文本的命令,根据英文单词命名为"a"。如果我们把光标移动到行尾,输入"a",光标就会越过行尾,同时 vi 会进入插入模式。这让我们能添加文本到行末:

The quick brown fox jumped over the lazy dog. It was cool.

记得按 Esc 键来退出插入模式。

因为我们几乎总是想要在行尾添加文本,所以 vi 提供了一个快捷键。光标将移动到行尾,同时 vi 进入输入模式。它是"A"命令。试着用一下它,向文件添加更多行。

首先,使用"0"(零)命令,将光标移动到行首。现在我们输入"A",然后输入下面这些文本:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

再一次,按下 Esc 键退出插入模式。

正如我们所看到的, “A” 命令非常有用,因为它在进入到插入模式前,先将光标移到了行尾。

13.6.2 打开一行

我们插入文本的另一种方式是“另起(open)”一行。这会在两行之间插入一个空白行,并且进入到插入模式。这种方式有两个变体:

表13-2: 另起一行按键
命令 打开行
o 当前行的下方另起一行。
O 当前行的上方另起一行。

我们可以演示一下:把光标移到"Line 3"上,再按下小 o 按键。

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3

line 4
line 5

在第三行之下另起了新的一行,并且进入插入模式。按下 Esc,退出插入模式。按下 u 按键,撤销我们的修改。

按下大 O 按键在光标之上另起新的一行:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2

Line 3
Line 4
Line 5

按下 Esc 按键,退出插入模式,并且按下 u 按键,撤销我们的更改。

13.6.3 删除文本

正如我们所愿,vi 提供了各种删除文本的方法,而且只需一或两个按键。首先,x 按键会删除光标位置的一个字符。可以在 x 命令之前带上一个数字,来指明要删除的字符个数。d 按键更通用一些。跟 x 命令一样,d 命令之前可以带上一个数字,来指定要执行的删除次数。另外,d 命令之后总是带上一个移动命令,用来控制删除的范围。这里有些实例:

表13-3: 文本删除命令
命令 删除的文本
x 当前字符
3x 当前字符及其后的两个字符。
dd 当前行。
5dd 当前行及随后的四行文本。
dW 从光标位置开始到下一个单词的开头。
d$ 从光标位置开始到当前行的行尾。
d0 从光标位置开始到当前行的行首。
d^ 从光标位置开始到文本行的第一个非空字符。
dG 从当前行到文件的末尾。
d20G 从当前行到文件的第20行。

把光标放到第一行单词“It”之上。重复按下 x 按键直到删除剩下的部分。下一步,重复按下 u 按键直到恢复原貌。

注意:真正的 vi 只是支持单层的 undo 命令。vim 则支持多层的。

我们再次执行删除命令,这次使用 d 命令。还是移动光标到单词"It"之上,按下的 dW 来删除单词:

The quick brown fox jumped over the lazy dog. was cool.
Line 2
Line 3
Line 4
Line 5

按下 d$删除从光标位置到行尾的文本:

The quick brown fox jumped over the lazy dog.
Line 2
Line 3
Line 4
Line 5

按下 dG 按键删除从当前行到文件末尾的所有行:

~
....

连续按下 u 按键三次,来恢复删除部分。

13.6.4 剪切,复制和粘贴文本

这个 d 命令不仅删除文本,它还“剪切”文本。每次我们使用 d 命令,删除的部分被复制到一个粘贴缓冲区中(看作剪切板)。过后我们执行小 p 命令把剪切板中的文本粘贴到光标位置之后,或者是大 P 命令把文本粘贴到光标之前。

y 命令用来“拉”(复制)文本,和 d 命令剪切文本的方式差不多。这里有些把 y 命令和各种移动命令结合起来使用的实例:

表13-4: 复制命令
命令 复制的内容
yy 当前行。
5yy 当前行及随后的四行文本。
yW 从当前光标位置到下一个单词的开头。
y$ 从当前光标位置到当前行的末尾。
y0 从当前光标位置到行首。
y^ 从当前光标位置到文本行的第一个非空字符。
yG 从当前行到文件末尾。
y20G 从当前行到文件的第20行。

我们试着做些复制和粘贴工作。把光标放到文本第一行,输入 yy 来复制当前行。下一步,把光标移到最后一行(G),输入小写的 p 把复制的一行粘贴到当前行的下面:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
The quick brown fox jumped over the lazy dog. It was cool.

和以前一样,u 命令会撤销我们的修改。这时光标仍位于文件的最后一行,输入大写的 P 命令把所复制的文本粘贴到当前行之上:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
The quick brown fox jumped over the lazy dog. It was cool.
Line 5

试着执行上表中其他的一些 y 命令,了解小写 p 和大写 P 命令的行为。当你完成练习之后,把文件恢复原样。

13.6.5 连接行

vi 对于行的概念相当严格。通常,用户不可能通过删除“行尾结束符”(end-of-line character)来连接当前行和它下面的一行。由于这个原因,vi 提供了一个特定的命令,大写的 J(不要与小写的 j 混淆了,j 是用来移动光标的)用于链接行与行。

如果我们把光标放到 line 3上,输入大写的 J 命令,看看发生什么情况:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3 Line 4
Line 5

13.7 查找和替换

vi 能把光标移到搜索到的匹配项上。vi 不仅能在搜索一特定行,还能进行全文搜索。它也可以在有或没有用户确认的情况下实现文本替换。

13.7.1 查找一行

f 命令能搜索一特定行,并将光标移动到下一个匹配的字符上。例如,命令 fa 会把光标定位到同一行中下一个出现的"a"字符上。在进行了一次行内搜索后,输入分号能重复这次搜索。

13.7.2 查找整个文件

移动光标到下一个出现的单词或短语上,使用 / 命令。这个命令和我们之前在 less 程序中学到的一样。当你输入/命令后,一个"/"字符会出现在屏幕底部。接下来,输入要查找的单词或短语,按下回车。光标就会移动到下一个包含所查找字符串的位置。通过 n 命令来重复先前的查找。这里有个例子:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

移动光标到文件的第一行。输入:

/Line

然后敲回车。光标会移动到第二行。然后输入 n,这时光标移动到第三行。重复键入 n 命令,光标会继续向下移动直到遍历所有的匹配项。至此我们只是通过输入单词和短语进行搜索,但 vi 支持正则表达式,一种用于表达复杂文本的方法。我们将会在之后的章节中详细讲解正则表达式。

13.7.3 全局查找和替代

vi 使用 ex 命令来执行查找和替代操作。将整个文件中的单词“Line”更改为“line”,输入以下命令:

:%s/Line/line/g

我们把这个命令分解为几个单独的部分,看一下每部分的含义:

条目 含义
: 冒号字符运行一个 ex 命令。
% 指定要操作的行数。% 是一个快捷方式,表示从第一行到最后一行。另外,操作范围也
可以用 1,5 来代替(因为我们的文件只有5行文本),或者用 1,$ 来代替,意思是 “ 从第一行到文件的最后一行。”
如果省略了文本行的范围,那么操作只对当前行生效。
s 指定操作。在这种情况下是,替换(查找与替代)。
/Line/line 查找类型与替代文本。
g 这是“全局”的意思,意味着对文本行中所有匹配的字符串执行查找和替换操作。如果省略 g,则
只替换每个文本行中第一个匹配的字符串。

执行完查找和替代命令之后,我们的文件看起来像这样:

The quick brown fox jumped over the lazy dog. It was cool.
line 2
line 3
line 4
line 5

我们也可以指定一个需要用户确认的替换命令。通过添加一个"c"字符到这个命令的末尾,来完成这个替换命令。例如:

:%s/line/Line/gc

这个命令会把我们的文件恢复先前的模样;然而,在执行每个替换命令之前,vi 会停下来,通过下面的信息,来要求我们确认这个替换:

replace with Line (y/n/a/q/l/^E/^Y)?

括号中的每个字符都是一个可能的选择,如下所示:

表13-5: 替换确认按键
按键 行为
y 执行替换操作
n 跳过这个匹配的实例
a 对这个及随后所有匹配的字符串执行替换操作。
q or esc 退出替换操作。
l 执行这次替换并退出。l 是 “last” 的简写。
Ctrl-e, Ctrl-y 分别是向下滚动和向上滚动。用于查看建议替换的上下文。

如果你输入 y,则执行这个替换,输入 n 则会导致 vi 跳过这个实例,而移到下一个匹配项上。

13.8 编辑多个文件

同时能够编辑多个文件是很有用的。你可能需要更改多个文件或者从一个文件复制内容到另一个文件。通过 vi,我们可以打开多个文件来编辑,只要在命令行中指定要编辑的文件名。

vi file1 file2 file3...

我们先退出已经存在的 vi 会话,然后创建一个新文件来编辑。输入:wq 来退出 vi 并且保存了所做的修改。下一步,我们将在家目录下创建一个额外的用来玩耍的文件。通过获取从 ls 命令的输出,来创建这个文件。

[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt

用 vi 来编辑我们的原文件和新创建的文件:

[me@linuxbox ~]$ vi foo.txt ls-output.txt

vi 启动,我们会看到第一个文件显示出来:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

13.8.1 文件之间切换

从这个文件切换下一个文件,使用这个 ex 命令:

:n

回到先前的文件使用:

:N

当我们从一个文件移到另一个文件时,如果当前文件没有保存修改,vi 会阻止我们切换文件,这是 vi 强制执行的政策。在命令之后添加感叹号,可以强迫 vi 放弃修改而转换文件。

另外,上面所描述的切换方法,vim(和一些版本的 vi)也提供了一些 ex 命令,这些命令使多个文件更容易管理。我们可以查看正在编辑的文件列表,使用:buffers 命令。运行这个命令后,屏幕顶部就会显示出一个文件列表:

:buffers
1 #     "foo.txt"                 line 1
2 %a    "ls-output.txt"           line 0
Press ENTER or type command to continue

要切换到另一个缓冲区(文件),输入 :buffer, 紧跟着你想要编辑的缓冲器编号。比如,要从包含文件 foo.txt 的1号缓冲区切换到包含文件 ls-output.txt 的2号缓冲区,我们会这样输入:

:buffer 2

我们的屏幕现在会显示第二个文件。

13.8.2 打开另一个文件并编辑

在我们的当前的编辑会话里也能添加别的文件。ex 命令 :e (编辑(edit) 的简写) 紧跟要打开的文件名将会打开另外一个文件。 让我们结束当前的会话回到命令行。

重新启动vi并只打开一个文件

[me@linuxbox ~]$ vi foo.txt

要加入我们的第二个文件,输入:

:e ls-output.txt

它应该显示在屏幕上。 我们可以这样来确认第一个文件仍然存在:

:buffers
 1 # "foo.txt" line 1
 2 %a "ls-output.txt" line 0
Press ENTER or type command to continue 

注意:当文件由 :e 命令加载,你将无法用 :n 或 :N 命令来切换文件。这时要使用 :buffer 命令加缓冲区号码,来切换文件。

13.8.3 跨文件复制黏贴

当我们编辑多个文件时,经常地要复制文件的一部分到另一个正在编辑的文件。使用之前我们学到的拉(yank)和粘贴命令,这很容易完成。说明如下。以打开的两个文件为例,首先转换到缓冲区1(foo.txt)
,输入:

:buffer 1

我们应该得到如下输出:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5

下一步,把光标移到第一行,并且输入 yy 来复制这一行。

转换到第二个缓冲区,输入:

:buffer 2

现在屏幕会包含一些文件列表(这里只列出了一部分):

total 343700
-rwxr-xr-x 1 root root    31316  2007-12-05  08:58 [
....

移动光标到第一行,输入 p 命令把我们从前面文件中复制的一行粘贴到这个文件中:

total 343700
The quick brown fox jumped over the lazy dog. It was cool.
-rwxr-xr-x 1 root root    31316  2007-12-05  08:58 [
....

13.8.4 插入整个文件到另一个文件

我们也可以把整个文件插入到我们正在编辑的文件中。看一下实际操作,结束 vi 会话,重新启动一个只打开一个文件的 vi 会话:

[me@linuxbox ~]$ vi ls-output.txt

再一次看到我们的文件列表:

total 343700
-rwxr-xr-x 1 root root    31316  2007-12-05  08:58 [

移动光标到第三行,然后输入以下 ex 命令:

:r foo.txt

这个:r 命令(是"read"的简称)把指定的文件插入到光标位置之前。现在屏幕应该看起来像这样:

total 343700
-rwxr-xr-x 1 root root     31316 2007-12-05  08:58 [
....
The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
-rwxr-xr-x 1 root root     111276 2008-01-31  13:36 a2p
....

13.9 保存工作

像 vi 中的其它操作一样,有几种不同的方法来保存我们所修改的文件。我们已经研究了 :w 这个ex 命令, 但还有几种方法,可能我们也觉得有帮助。

在命令模式下,输入 ZZ 就会保存并退出当前文件。同样地,ex 命令:wq 把:w 和:q 命令结合到一起,来完成保存和退出任务。

这个:w 命令也可以指定可选的文件名。这个的作用就如"Save As..."。例如,如果我们正在编辑 foo.txt 文件,想要保存一个副本,叫做 foo1.txt,那么我们可以执行以下命令:

:w foo1.txt

注意:当上面的命令以一个新名字保存文件时,它并没有更改你正在编辑的文件的名字。如果你继续编辑,你还是在编辑文件 foo.txt,而不是 foo1.txt。


更新于 2022年10月2日
第12章:Shell环境第14章:自定制Shell提示符

发表评论 取消回复

您需要登录后才可以发表评论...
登录... 后才能评论
文章目录
  • 13.1 为什么我们应该学习 vi
  • 13.2 一点儿背景介绍
  • 13.3 启动和退出 vi
  • 13.4 编辑模式
    • 13.4.1 插入模式
    • 13.4.2 保存我们的工作
  • 13.5 移动光标
  • 13.6 基本编辑
    • 13.6.1 追加文本
    • 13.6.2 打开一行
    • 13.6.3 删除文本
    • 13.6.4 剪切,复制和粘贴文本
    • 13.6.5 连接行
  • 13.7 查找和替换
    • 13.7.1 查找一行
    • 13.7.2 查找整个文件
    • 13.7.3 全局查找和替代
  • 13.8 编辑多个文件
    • 13.8.1 文件之间切换
    • 13.8.2 打开另一个文件并编辑
    • 13.8.3 跨文件复制黏贴
    • 13.8.4 插入整个文件到另一个文件
  • 13.9 保存工作

Copyright © 2015-2023 开源之家

  • 首页
  • 每日签到
  • 加入VIP
  • 顶部
AI&大数据 Java Java Linux Linux Python 前端 办公软件 办公软件 培训视频 娱乐休闲 小程序开发 数据库 系统相关 网络 英语 设计创意 软件测试