《Linux命令行与shell脚本编程大全》学习笔记

Linux命令行部分

附:常见的Linux目录名称
在这里插入图片描述

1、Linux下常用快捷键收录

打开终端Ctrl + Alt + T
同一个窗口打开多个终端Ctrl + Shift + T
在多个终端之间切换Ctrl + PgDn / PgUp
切出/切入终端Alt + Tab
终端最大化/恢复F11
显示已经登录的用户who
新开一个bash/退出bash/exit

2、 bash shell基础命令

2.1 列出文件和目录

  • 区分文件和目录,目录名后面会添加正斜线(/),可执行文件后面添加星号(*)
ls -F
  • 递归选项,可以列出当前目录所包含的子目录中的文件
 ls -R
  • 显示长列表
ls -l  filename         查看单个文件的长列表
ls -ld directoryName    查看目录信息
  • 过滤输出列表——通配符匹配
问号(?)    代表任意单个字符
星号(*)    代表零个或多个字符
方括号([]) 代表单个字符位置并给出该位置上的多个可能的选中,也可以是范围。如 ls f[ai]ll、ls f[a-i]ll
感叹号(!)  代表将不需要的内容排除在外。如 ls f[!a]ll
  • 查看文件的inode编号(文件或目录的inode编号是内核分配给文件系统中的每一个对象的唯一标识)
ls -i
ls -sh	以人类易读的格式显示文件大小

在这里插入图片描述

提示:可以使用组合用法 ls -F -R、 ls -FR、 ls -alF

2.2 处理文件

  • 创建空文件
touch filename

提示:如果filename已经存在,那么touch filename只会更新文件的修改时间,不会改变文件内容

  • cp的用法
cp source destination

提示:①如果source 和 destination 都是文件名,那么cp会将源文件复制成一个新的目标文件,并以destination命名;
②如果目标文件已存在,最好使用 “cp -i ”来强制shell询问是否覆盖已有文件;
③如果destination是一个目录路径(相对/绝对路径),那么最好在目录名尾部加一个正斜线(/),表明destination是一个目录而非文件。
④复制过程中,当前目录可以使用单点号(.)代替;
⑤使用 “cp -R” 可以递归地将一个目录里的所有内容复制到另一个目录;
⑥如果在复制目录的过程中遇到:略过目录"…",那是因为cp命令在复制目录时默认不会复制隐藏文件和隐藏目录,因此要加上 “-a” 选项;
⑦cp可以配合通配符使用;

  • 链接文件
    1)软链接(符号链接)——两者只是指向关系,实际上是两个完全不同的文件
创建文件slink_test,指向test
ln -s test slink_test

2)硬链接——与源文件实际上是同一个文件

创建文件hlink_test,指向test
ln test hlink_test
  • 文件移动和重命名
mv fileA/dirA fileB/dirB    将文件/目录A 移动到文件/目录B

mv fileA fileB :将fileA重命名为fileB
mv fileA dirB :将fileA移动到目录dirB中去
mv fileA dirB/fileB :将fileA移动到目录dirB中去,并重命名为fileB

  • 删除文件
rm filenam
rm -i filename    -i 选项用于询问是否真的要删除
rm -f filename    -f 选项跳过询问,直接强制删除

2.3 管理目录

  • 创建目录(-p选项的作用)
mkdir -p New_Dir/SubDir/UnderDir    -p 可以创建目录和子目录
  • 删除目录
rmdir    命令只能删除空目录
rm -r    可以删除非空目录及其中的文件,但是会逐文件提示是否删除
rm -rf   强制删除非空目录,没有提示(慎用)

2.4 查看文件内容

  • 查看文件类型
file 命令可以查看文件的类型(如目录、符号链接文件、脚本文件、二进制文件)
file FileName

提示:区分文件和目录的方法:1)ls -F ; 2)file

  • 查看整个文件内容
1) cat       :直接在shell中显示文本内容
    cat -n    :显示的时候给所有行加上行号
    cat -b    :仅给文本行添加行号,空行无行号
2) more      :显示文本文件内容,但是会在每页数据之后停下来。可以使用回车逐条往下,或者使用空格逐页往下,按q退出
               例如:more /etc/profile
3)  less      :more命令的升级,能够实现在文本文件中前后翻动,还有一些高级搜索功能
  • 查看部分文件内容(head/tail)
    如果文件很大,用户只想查看其中的部分内容,可以使用head和tail命令
1) tail:默认查看文件后10行内容,可以自定义查看行数:
          tail -n 15 testfile:    查看testfile倒数15行内容,效果和tail -15 testfile 一样
2) head: 默认查看文件开头10行内容,同样可以自定义查看行数:
          head -n 15 testfile:    查看testfile开头15行内容,效果和head -15 testfile 一样

3、更多的bash shell命令

3.1 监测程序

  • 探查进程
ps
ps命令默认只显示运行在当前终端中属于当前用户那些进程
ps支持三个版本的命令行选项:Unix风格选项(选项前加单连字符,如-A)、BSD风格选项(选项前不加连字符,如A)、GNU长选项(选项前加双连字符,如--help)
ps -ef :查看系统中运行的所有进程
  • 实时监测进程
top :实时显示进程信息,并且默认情况下,会按照%CPU的值来对进程进行排序
  • 结束进程

在Linux中,进程之间通过信号进行通信,这些信号如表所示

信号名称描述
1HUP挂起
2INT中断
3QUIT结束运行
9KILL无条件中止
11SEGV段错误
15TERM尽可能中止
17STOP无条件停止运行,但不中止
18TSTP停止或暂停,但继续在后台运行
19CONT在STOP或TSTP之后恢复执行

在Linux中有两个命令可以向运行中的进程发出进程信号:kill 和 pkill

kill    :通过且只能通过PID向进程发送信号
kill 3940    :终止运行PID为3940的进程,相当于发送了QUIT信号

使用 -s 选项可以支持指定其他信号(用信号名或信号值)
kill -s HUP 3940    :挂起PID为3940的进程

pkill命令可以使用程序名代替PID来终止进程,而且可以配合通配符使用
pkill http*    :“杀死”所有名称以http起始的进程

3.2 监测磁盘空间

3.2.1 挂载存储设备

Linux文件系统会将所有的磁盘都并入单个虚拟目录。在使用新的存储设备之前,需要将其放在虚拟目录中。这项工作称为挂载

mount 	:用于挂载存储设备的命令,默认情况下,mount命令会输出当前系统已挂载的设备列表。
挂载设备的基本命令:
mount  -t  type  device  directory
其中,type参数指定了磁盘格式化所使用的文件系统类型。
如果想设置开机自动挂载,可以在 /etc/fstab 中添加挂载的命令
如果想挂载Windows下文件夹,可以参考:https://blog.csdn.net/Tang_Zhe/article/details/126856198
mount	:移除可移动设备时,不能将设备直接拔下,应该先卸载
mount  [directory | device]
如:umount  /home/rich/mnt
3.2.2 df 命令

用于逐个显示已挂载的文件系统的使用情况,包括已使用内存,剩余内存等。该命令的输出如下:

  • 设备文件位置
  • 包含多少个以1024字节为单位的块
  • 使用了多少个以1024字节为单位的块
  • 还有多少以1024字节为单位的块可用
  • 已用空间所占的百分比
  • 设备挂载点
    在这里插入图片描述
    显然,df输出的信息可读性并不是很友好,因此可以使用 -h 选项来增强输出结果的易读性
    df -h
    在这里插入图片描述
3.2.3 du命令

du命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。同样的,常用 -h 选项来使输出易读。
在这里插入图片描述

3.3 处理数据文件

  • 数据排序(sort)
    处理大量数据时的一个常用命令是sort
    在这里插入图片描述
    如上,如果想将数字按照数值大小排序,可以使用 -n 选项: sort -n test
    在这里插入图片描述

sort命令的其他一些方便选项如下
在这里插入图片描述

  • 数据搜索(grep)
    grep 命令会在输入或指定文件中逐行搜索匹配指定模式的文本
    grep命令格式如下:
grep  [options]  pattern  [file]

在这里插入图片描述

grep  -v  t  file	:反向搜索(输出不匹配指定模式的行),可以使用 -v 选项
grep  -n  t  file	:显示匹配指定模式的那些行的行号,可以使用 -n 选项
grep  -c  t  file	:只打印有多少行含有匹配的模式,可以使用 -c 选项
grep  -e  t  -e  f  file	:指定多个匹配模式,可以使用 -e 选项

在这里插入图片描述

在默认情况下,grep命令使用基本的Unix风格的正则表达式来匹配模式,如:
grep [tf] file
上式方括号表明grep应该搜索包含 t 字符或者 f 字符的匹配

  • 数据压缩
    Linux包含多种文件压缩工具,如下表:
    在这里插入图片描述
    gzip是Linux中最流行的压缩工具,这个软件包包含以下文件:

  • gzip:用于压缩文件

  • gunzip:用于解压文件

  • gzcat:用于查看压缩过的文本文件的内容
    gzip命令会压缩命令行中指定的文件,也可以指定多个文件或使用通配符来一次性压缩多个文件。

  • 数据归档
    目前,Unix和Linux中最流行的归档工具是 tar 命令
    tar 命令的格式如下:

tar  function  [options]  object1  object2  ....

function 定义了 tar 命令要执行的操作,如表:


每种操作都使用 option (选项)来定义针对 tar 归档文件的具体行为,下表列出了常用的选项:
在这里插入图片描述
这些选项通常合并使用
在这里插入图片描述
该示例中使用 tar -cvf test.tar test/ test2/ 命令创建一个test.tar归档文件,包含目录 test 和 test2的内容.
此外,有

tar  -tf  test.tar		:列出(但不提取)tar文件test.tar 的内容
tar  -xvf  test.tar		:该命令从tar文件test.tar中提取内容。如果在创建的时候tar文件含有目录结构,则在当前目录中重建该目录的整个结构

在下载来源软件时经常会看到文件名以 .tgz 结尾,这是经 gzip压缩过的 tar 文件,可以用命令 tar -zxvf filename.tgz 来提取其中的内容

4、环境变量

4.1 全局环境变量

全局环境变量对于shell会话和所有生成的子shell都是可见的。局部环境变量则只对创建它的shell可见。

printenv/env		:查看全局变量
printenv/echo	:查看特定的环境变量的值(如 printenv HOME、echo $HOME),但是printenv只能显示特定的全局环境变量中的值

在这里插入图片描述

4.2 局部环境变量

局部环境变量只能在定义它的进程中可见

没有哪个命令可以用来只显示局部环境变量,set 命令可以显示特定进程中的所有环境变量,既包括局部变量、全局变量,也包括用户自定义变量。除此之外,还包括局部shell函数。

4.3 设置用户自定义变量

  • 设置局部用户自定义变量

1)启动bash shell后(或者执行shell脚本),就能创建仅对该shell进程可见的局部用户自定义变量。可以使用等号为变量赋值,值可以是数值或字符串;
2)如果要引用自定义的环境变量的值,在变量名前面加 $ 即可;
3)如果用于赋值的字符串包含空格,则必须用单引号或双引号来界定该字符串的起止(如果没有引号,shell会将空格后面的下一个单词单做一个新的命令来执行);
4)在变量名、等号和值之间没有空格!
5)bash shell 的惯例是所有全局环境变量均使用大写字母命名,而自定义的环境变量使用小写字母命名;
6)设置好局部环境变量后,就能在shell进程中随意使用了,但是如果又生成另一个shell,则该变量在子shell中不可用

在这里插入图片描述
在这里插入图片描述

注:bash 是指在当前窗口中重新创建一个子bash进程

  • 设置全局环境变量

创建全局变量的方法是先创建局部变量,然后再将其导出到全局变量,这可以通过 export 命令来实现

在这里插入图片描述

全局环境变量在设置该变量的父进程创建的子进程中都是可见的。
在上述创建全局变量的方法中,也可以将设置变量和导出变量放在一个命令里完成,即

export  my_variable='I am Global now'

注:
修改子shell中的全局环境变量并不会影响父shell中该变量的值,包括在子shell中使用export重新设置该变量的值;

4.4 删除环境变量(unset)

unset直接加要删除的变量名,不要加 $

在这里插入图片描述

如果是在子进程中删除全局变量,那么该操作仅对子进程有效,该全局环境变量在父进程中仍然可用:

在这里插入图片描述

4.5 设置 PATH 环境变量

1)当你在 shell CLI 中输入一个外部命令时,shell必须搜索系统,从中找到对应的程序。PATH 环境变量定义了用于查找命令和程序的目录;
2)如果命令或者程序所在位置没有包括在 PATH 变量中,那么在不使用绝对路径的情况下,shell是无法找到;
3)PATH 中的路径以冒号分隔,如Ubuntu Linux系统中PATH值如下:

在这里插入图片描述

应用程序的的可执行程序文件目录有时不在 PATH 环境变量所包含的目录中。解决办法是保证 PATH 环境变量包含所有存放应用程序的目录。即可以把新的搜索目录添加到现有的 PATH 环境变量中,无需从头定义,PATH 中各个目录之间以冒号分隔,所以只需引用原来的PATH值,添加冒号(:),然后再使用绝对路径输入(添加)新目录即可,例如

在这里插入图片描述该例中,可执行文件test1位于 /home/wsy/WSY/Shell 目录下,当使用绝对路径 ./test1 时可以执行脚本,当仅使用文件名 test1 时,shell 因为在 PATH 定义的目录中查找不到该命令,所以报错,解决办法是将脚本文件所在目录的绝度路径添加到 PATH 目录中去。

4.5 定位系统环境变量

上述对于 PATH 变量的修改只能持续到退出或重启系统,这种效果并不能一直奏效。要想让环境变量的作用持久化,则需要在启动文件中做修改。
当你登录Linux时,bash shell会作为登录shell启动,登录shell通常会从5个不同的启动文件中读取命令,即

  • /etc/profile
  • $HOME/.bash_profile
  • $HOME/.bashrc
  • $HOME/.bash_login
  • $HOME/.profile

1) /etc/profile 文件是系统中默认的 bash shell 的主启动文件,系统中的每个用户登录时都会执行这个启动文件。
2)其余的启动文件(以 $HOME 开头的)都用于同一个目的:提供用户专属的启动文件来定义该用户所用到的环境变量,大多数Linux发行版只用到这4个启动文件中的一两个。

3)$HOME 代表某个用户的主目录,效果和波浪号(~)一样

4.6 数组变量

1)环境变量的一个很酷的特性是可以作为数组使用,要为某个环境变量设置多个值,可以把值放在圆括号内,值与值之间用空格分开;
2)如果像普通环境变量那样显示数组,则只会显示数组中的第一个值;
3)数组变量的索引是从0开始的;
4)要引用单个数组元素,必须使用表示其在数组中位置的索引,索引要写在方括号内,$ 符号后的所有内容要放在花括号内;
5)要显示整个数组变量,可以使用通配符*作为索引

在这里插入图片描述

1)可以使用 unset 删除数组中的某个元素,但是删除后这个位置是空的,并没有被后面的元素填补;
2)可以在unset后面跟上数组名用以删除整个数组

在这里插入图片描述

5、Linux 文件权限

5.1 Linux 的安全性

Linux 安全系统的核心是用户账户。每个能访问Linux系统的用户都会被分配一个唯一的用户账户,用户对系统中各种对象的访问权限取决于他们登录系统时所用的账户。
用户权限是通过创建用户时分配的用户ID(user ID, UID)来跟踪的。Linux为系统账户预留了500以下的UID。有些服务甚至要用特定的UID才能正常工作。为普通用户创建账户时,大多数Linux会从500开始,将第一个可用的UID分配给这个账户,但并非所有的Linux发行版都这样,比如Ubuntu就是从1000开始(可以通过 echo $UID 指令查看登录账户的UID值)

5.2 /etc/passwd 文件和 etc/shadow 文件

Linux 系统使用一个专门的文件 /etc/passwd 来匹配登录名与对应的UID值,该文件包含了一些与用户有关的信息,例如:
在这里插入图片描述其中,root用户账户是Linux系统的管理员,为其固定分配的UID是0,wsy是我创建的用户账户,也就是当前系统登录使用的账户,可见系统为我分配的UID 是1000。

在这里插入图片描述

鉴于安全考虑,/etc/passwd文件中的密码字段都被设置为 x ,现在绝大多数Linux系统会将用户密码保存在单独的文件中,即shadow文件(位于/etc/shadow),只有特定的程序(如登录程序)才能访问该文件。

/etc/passwd 文件对Linux系统密码管理提供了更多的控制,只有root用户才能访问该文件
/etc/passwd文件为系统中每个用户账户都保存了一条记录,如下:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

5.3 添加、删除、修改用户

  • 添加新用户(useradd)
    在这里插入图片描述

useradd 使用系统的默认值和命令行参数来设置用户账户,要想查看所使用的Linux发行版的系统默认值,可以使用 -D 选项
在这里插入图片描述

useradd 命令的默认值使用 /etc/default/useradd 文件设置。另外,进一步的安全设置在 /etc/login.defs 文件中定义,你可以调整这些文件来改变Linux系统默认的安全行为。

在创建新用户时,如果你不在命令行中指定具体的值, useradd命令就会使用-D选项所显示的那些默认值,这些默认值的如下:
在这里插入图片描述
useradd命令允许管理员创建默认的 $HOME 目录配置,然后将其作为创建新用户的 $HOME 目录模板,这样就能自动在每个新用户的 $HOME 目录里放置默认的系统文件了。在Linux Ubuntu 系统中,/etc/skel 目录包含下列文件:
在这里插入图片描述
可以看出,这些都是 bash shell环境的标准启动文件。系统会自动将这些文件复制到你创建的每个用户的 $HOME 目录里。

例如,使用默认系统配置创建用户 test ,然后检查一下新用户的$HOME 目录:
在这里插入图片描述

注:对于很多Linux 发行版本而言,useradd 命令默认并不创建 $ HOME 目录,但是 -m 命令行选项会使其创建$HOME 目录,可以在 /etc/login.defs 文件中修改这一行为。

要想在创建新用户的时候改变默认值或默认行为,可以使用相应的命令行选项,具体如下:
在这里插入图片描述

但是如果总是需要改动某个值,则最好的办法是修改一下系统默认值,方法是使用 -D 选项来修改系统默认的新用户设置,相应的选项如下表:
在这里插入图片描述
修改 -D 选项修改默认设置很简单,例如:
在这里插入图片描述
上图中使用 useradd -D -s /bin命令就将创建新用户时设置的默认登录shell由 /bin/sh 修改为了 /bin

  • 删除用户(userdel)
    在这里插入图片描述

默认情况下,userdel命令只会删除 /etc/passwd 和 /etc/shadow 文件中的用户信息,属于该账户的文件会被保留。如果加上 -r 选项,则userdel会删除用户的$HOME目录以及邮件目录
在这里插入图片描述

  • 修改用户

Linux 提供了一些工具来修改已有账户的信息,如下表:
在这里插入图片描述
每种工具都提供了特定的功能来修改用户账户信息,具体用法参考教材 7.1.5节(第四版),或使用 -h 选项查看可用选项,如
在这里插入图片描述
以修改用户密码为例:

在这里插入图片描述

5.4 使用Linux组

组,是Linux系统提供的另一种安全策略。组权限允许多个用户对系统对象(如文件、目录或设备等)共享一组权限。每个组都有一个唯一的 GID ,这与 UID 类似,此外,每个组还有一个唯一的组名。

  • /etc/group 文件
    组信息保存在/etc/group 文件中,如下:
    在这里插入图片描述
    /etc/group 文件中包含的每一条信息有四个字段:
    在这里插入图片描述
  • 创建新组(groupadd)
    在创建新组时,默认不为其分配任何用户,因为groupadd命令没有提供向组中添加用户的选项,这一任务可以通过usermod命令的 -D 选项来完成,如下为创建一个新组shared,并向组中添加用户test的示例(用户test已经提前创建好):
    在这里插入图片描述
  • 修改组(groupmod)
    需要修改的组信息并不是很多。groupmod命令可以修改已有组的GID(使用-g选项)或组名(使用-n选项)
    以修改组名为例
    在这里插入图片描述

与UID类似,对于系统账户组,为其分配的GID值低于500,而普通用户组的GID则是从500开始分配,Ubuntu是从1000开始分配

5.5 理解文件权限

  • 使用文件权限符号
    在这里插入图片描述
    在 ls -l 的输出结果中,第一个字段就是描述文件和目录权限的编码,这个字段的第一个字符表示对象的类型

关于第一个字符表示的含义如下:

  • - 代表文件
  • d 代表目录
  • l 代表连接
  • c 代表字符设备
  • b 代表块设备
  • p 代表具名管道
  • s 代表网络套接字

之后是3组三字符的编码,每一组定义了3种访问权限

  • r 代表对象是可读的
  • w 代表对象是可写的
  • x 代表对象是可执行的

如果没有某种权限,则在该权限位会出现连字符。
这3组权限分别对应对象的3个安全级别

  • 对象的属主
  • 对象的数组
  • 系统其他用户

这个概念如下图所示:
在这里插入图片描述
以下面这个文件为例:
在这里插入图片描述
文件夹(文件类型是d) Python 具有一下3组权限:
1)rwx :属主(wsy)权限;
2)rwx :数组(wsy)权限;
3)r-x :系统其他用户权限

这些权限表明用户 wsy 可以读取、写入以及执行该文件夹(即有全部权限)、类似地,wsy组的成员也可以读取、写入、执行该文件夹。然而,不属于wsy组的其他用户只能读取和执行该文件夹,w被连字符取代了,说明这个安全级别没有写入权限。

  • 默认文件权限(umask)

mask命令用来设置新建文件和目录的默认权限

可以通过 umask 命令查看当前系统中的默认值:
在这里插入图片描述
其中,第一个数位代表了一项特别的安全特性,接下来的3个数位表示文件或目录对应的umask八进制值。

八进制模式的安全设置先获取 rwx 权限值,然后将其转换成3为(bit)二进制值,用一个八进制值来表示。
例如,如果只有读权限,则权限值是 r-- ,转换成二进制就是 1 0 0 ,代表的八进制数值是 4 。下表列出了可能的所有组合:
在这里插入图片描述
现在我们创建一个文件,并查看其权限:
在这里插入图片描述

八进制模式先取得权限的八进制值,然后把这3种安全级别(属主、属组、其他用户)对应的八进制值按顺序列出来。
可以看出,该文件属于3中安全级别的权限分别是 rw- rw- r-- , 因此,该文件的三种安全级别对应的二进制的值为110 110 100表示属主和属组成员都有读取和写入的权限,而其他用户都只有读权限,它对应的八进制数值是 664.
那么这一切和 umask 有什么关系呢(上面已经查看过当前系统的 umask 值是 0002)?mask是怎么确定当前系统的默认权限值的呢?

要把 umask 值从对象的全权限值中减掉。对文件而言,全权限值是666(所有用户都有读和写的权限);对目录而言,全权限值是777(所有用户都有读取、写入和执行的权限)

根据上述规则,我们就可以使用文件的全权限值 666 减去当前系统的 umask值 0002,就可以得到当前系统默认的文件权限的八进制模式了:

0666 - 0002 = 0664

由此,我们可以分析出默认的文件权限是 w- rw- r-- ,这与上面的实际情况是一致的

那么,如果想要修改mask的默认值,从而达到修改默认文件权限的目的,该怎么做呢?
很简单,首先,确定你想要设置的文件权限,如 rw- r-- r–
然后写出对应的二进制:110 100 100,再由二进制写出八进制值:644
用文件的全权限值:666 减去想要设置的文件默认权限值:644就得到了 umask的值:0666 - 0644 = 0022
最后使用如下命令修改 mask的值即可:

umask  0022

在这里插入图片描述
由图可见,修改umask的值后,新创建的文件的权限为rw- r-- r–,这与期望的值是一致的。

5.6 更改安全设置

  • 5.6.1 修改权限(chmod)
    chmod命令可以修改文件和目录的安全设置,该命令的格式如下:
chmod  options  mode  file

mode 参数允许使用八进制符号模式来进行安全设置
八进制模式设置比较简单,直接用打算赋予文件的标准3位八进制权限编码即可:
在这里插入图片描述
符号模式稍微复杂,下面是在符号模式下指定权限的格式:
[ugoa…] [+ - =] [rwxXstugo…]
其中,第一组字符定义了权限作用的对象:
在这里插入图片描述
接下来的符号表示你是想在现有权限的基础上增加权限(+)、移除权限(-),还是设置权限(=)。
最后,第三个符号表示要设置的权限,可取的值要比 rwx 多,这些额外的值如下:
在这里插入图片描述
具体用法如下:
在这里插入图片描述
再如:
在这里插入图片描述
使用 chmod u-x test1 将原可执行文件test1的用户执行权限取下后就没有权限再执行该文件。

options 选项为 chmod 命令提供了额外的增强特性。-R 选项能够以递归的方式修改文件和目录的权限,还可以通过通配符指定多个文件名,然后再用单个命令批量修改权限。

  • 5.6.2 改变所属关系(chown、chgrp)

chown可以修改文件的属主,chgrp可以修改文件的默认数组。

待更新…

5.7 共享文件

待更新…

6、安装软件

Linux中广泛使用的两种主要的软件包管理系统基础工具是 dpkgrpm
基于 Debian 的发行版本(Ubuntu、Linux Mint)使用的是dpkg 命令,dpkg会直接和Linux系统中的软件包管理系统交互,用于安装、管理、删除软件包。
基于Red Hat的发行版本(如CentOS、Fedora和openSUSE)使用的是rpm命令,该命令是其软件包管理系统的底层基础。

6.1 基于Debian的系统

dpkg命令是基于Debian的软件包管理器的核心,用于在Linux系统中安装、更新、删除 DEB包文件。dpkg命令假定你已经把DEB文件包下载到本地Linux系统或是以URL形式提供,但很多时候并非如此。通常情况下,你更愿意从所使用的Linux发行版仓库中安装软件包,为此,需要使用 APT(advanced package tool)工具集。

  • apt -cache
  • apt -get
  • apt
    apt 命令本质是 apt -cache 命令和apt -get 命令的前端,apt命令的基本格式如下:
apt  [options]  command

command定义了apt要执行的操作,如果需要,可以指定一个或多个options进行微调。

  • 使用 apt 管理软件包
apt list															:显示仓库中所有可用的软件包
apt  --installed  list									:限制仅输出那些已经安装在系统中的软件包
apt show package_name					:显示系统中某个具体软件包的详细信息
dpkg -L package_name						:获取与特定软件包相关的所有文件
dpkg --search absolute_file_name	:找出特定文件属于哪个软件包(文件要使用绝对路径)
  • 使用apt安装软件包
apt  search package_name								:查找特定的软件包(在安装软件包之前确定要安装的软件包的名称)

search命令不需要在package_name周围使用通配符,直接就有通配符的效果。在默认情况下,search命令显示的是在名称或描述中包含搜索关键字的那些软件包,如果只想搜索软件包名称,可以加入 –names-only 选项

apt  --names-only  search  package_name

一旦找到待安装的软件包,就可以使用 apt 安装了:

apt  install  package_name
  • 使用 apt 升级软件

upgrade 命令可以使用仓库中的任何新版本安全地升级系统中所有软件包:

apt  upgrade

upgrade命令在升级过程中不会删除任何软件包,如果必须删除某个软件包才能完成升级,可以使用以下命令:

apt  full-upgrade

最好定期执行 apt upgrade,保持系统处于最新状态。

  • 使用 apt 卸载软件包
    apt 的 remove 命令可以删除软件包,同时保留数据和配置文件,如果要将软件包以及相关的配置文件和数据全部删除,name需要使用 purge 选项:
apt  remove package_name
apt purge package_name

此外,如果有依赖关系的软件包不会再有他用,可以使用 autoremove 命令将其自动删除,autoremove 命令会检查所有被标记为存在依赖关系且不再被需要的软件包:

apt  autoremove

6.2 基于 Red Hat 的系统

和基于Debian的发行版本类似,基于Red Hat 的系统有以下几个前端工具:

  • yum :用于 Red Hat、CentOS和Fedora
  • zypper:用于openSUSE
  • dnf:yum的升级版,有一些新增特性
  • 6.2.1 列出已安装的软件包
dnf  list  installed

可以使用将已安装的列表导出(重定向)到一个文件中,然后使用more或者less命令(或GUI编辑器)来自己查看:

dnf  list  installed > installed_software

也可以使用 dnf 查找特定软件包的详细信息:

dnf  list  package_name

还可以通过下述命令查看具体软件包是否已经安装:

dnf  list  instead package_name

最后,可以通过下述命令查看文件系统中的某个文件是由哪个软件包安装的

dnf  provides  file_name
  • 6.2.2 使用 dnf 安装软件
dnf  install  package_name
  • 6.2.3 使用 dnf 升级软件
dnf  list  upgrades							:查看已安装软件包的所有可用更新
dnf  upgrade package_name	:升级特定软件包
dnf  upgrade										:升级所有软件包
  • 6.2.4 使用 dnf 卸载软件包
dnf  remove  package_name

尚没有选项或命令可以在删除软件包的同时保留数据或配置文件

  • 6.2.5 处理损坏的依赖关系
    有时在安装多个软件包的时候,一个软件包的依赖有可能被其他软件包搞乱,这称为依赖关系破损
    可以尝试使用下述命令解决:
dnf  clean all

然后尝试使用 dnf 的 upgrade 选项。有时,只要清理了放错位置的文件就可以了
如果还解决不了问题,再尝试使用下列命令:

dnf  repoquery  --deplist  package_name

该命令会显示指定软件包的所有依赖关系以及哪些软件包提供了这种依赖。只要知道软件包需要哪个库,就可以自行安装了

  • 6.2.6 RPM 仓库
    就像 apt 系统一样,dnf 在安装时也设置了软件仓库,要相查看当前拉取软件的仓库,可以使用下列命令:
dnf  repolist

有两个地方可以找到 dnf 的仓库定义:

  • 配置文件: /etc/dnf/dnf.conf
  • /etc/yum.repos.d目录中的单独文件

7、 文本编辑器

主要介绍 vim 编辑器

vi 编辑器是 Unix 系统中最早的编辑器之一,在GNU 项目将 vi 编辑器移植到开源世界时,他们决定对其做一番改进,因此开发人员将其重命名为 “vi improved”或 vim。

  • 7.1 检查 vim 软件包
    在开始研究vim编辑器之前,最好先搞明白你所用的Linux系统是哪种vim软件包。在有些发行版中安装的是完整的vim, 另外还有一个vi命令的别名,就像下面所显示的CentOS发行版中的那样。
$ alias vi
alias vi='vim'
$
$ which vim
/usr/bin/vim
$
$ ls -l /usr/bin/vim
-rwxr-xr-x. 1 root root 1967072 Apr 5 2012 /usr/bin/vim
$

注意,上面的程序文件长列表中并没有显示出任何的链接文件。如果vim程序被设置了链接,它可能会被链接到一个功能较弱的编辑器。所以最好还是检查一下链接文件。
在其他发行版中,你会发现各种各式各样的vim编辑器。要注意的是,在Ubuntu发行版中不仅没有vi命令的别名,而且/usr/bin/vi程序属于一系列文件链接中的一环。

$ alias vi
-bash: alias: vi: not found
$
$ which vi
/usr/bin/vi
$
$ ls -l /usr/bin/vi
lrwxrwxrwx 1 root root 20 Apr 22 12:39
/usr/bin/vi -> /etc/alternatives/vi
$
$ ls -l /etc/alternatives/vi
lrwxrwxrwx 1 root root 17 Apr 22 12:33
/etc/alternatives/vi -> /usr/bin/vim.tiny
$
$ ls -l /usr/bin/vim.tiny
-rwxr-xr-x 1 root root 884360 Jan 2 14:40
/usr/bin/vim.tiny
$
$ readlink -f /usr/bin/vi
/usr/bin/vim.tiny

因此,当输入vi命令时,执行的是程序/usr/bin/vim.tiny。 vim.tiny只提供少量的vim编辑器功能。如果特别需要vim编辑器,而且使用的又是Ubuntu,那至少应该安装一个基础版本的vim包。

说明 在上面的例子中,其实用不着非得连续使用ls –l命令来查找一系列链接文件的最终目标,只需要使用readlink –f命令就可以了。它能够立刻找出链接文件的最后一环。

在Ubuntu发行版中安装基础版的vim包非常简单,使用之前介绍的 apt 软件安装即可:
在这里插入图片描述基础版的vim现在安装好了, /usr/bin/vi的文件链接会自动更改成指向/usr/bin/vim.basic。以后再输入vi命令的时候,使用的就是基础版的vim编辑器了。

  • 7.2 vim基础
    vim 编辑器在内存缓冲区中处理数据。只要输入 vim 命令(或 vi, 如果这个别名或连接文件存在的话)和要编辑的文件名就可以启动 vim 编辑器:
vi  test1

在这里插入图片描述
如果在启动 vim 时未指定文件名,或者指定文件名不存在,则 vim 会开辟一段新的缓冲区进行编辑。如果是指定的已有文件的名称,则vim会将该文件的整个内容都读入缓冲区以备编辑。vim 编辑器会检测会话终端的类型,使用全屏模式来将整个控制台窗口作为编辑器区域。

最初的vim编辑窗口显示了文件的内容(如果有内容的话),并在窗口的底部显示了一条消息行。如果文件内容并未占据整个屏幕, vim会在非文件内容行放置一个波浪线(如上图)。

底部的消息行根据文件的状态以及vim安装时的默认设置显示了所编辑文件的信息。如果文件是新建的,会出现消息[New File]。

vim 编辑器有3种操作模式:

  • 命令模式
  • Ex模式
  • 插入模式
    刚打开文件时(或新建文件时),vim 编辑器会进入命令模式(普通模式),在该模式下,vim 编辑器会将按键解释成命令。
    在插入模式中,vim 会将你在当前光标位置输入的内容都放入缓冲区。按下 i 键就可以进入插入模式,按下 Esc 就可以退出插入模式转而进入命令模式

移动光标的命令:

h	:左移一个字符
j	:下移一行(下一行文本)
k	:上移一行(上一行文本)
l	:右移一个字符

PageDown(或Ctrl + F)	:下翻一屏
PageUp(或Ctrl + B)		:上翻一屏
G						:移到缓冲区的最后一行
num G					:移到缓冲区的第 num 行
gg						:移到缓冲区第一行

Ex 模式提供了一个交互式命令行,可以输入额外的命令来控制 vim 的操作。要进入 Ex 模式,在命令模式下按下冒号键(:)即可,光标会移动到屏幕底部的消息行处,然后出现冒号,等待输入命令。Ex 模式下的一下命令可以将缓冲区的数据保存到文件中并退出:

q					:如果未修改缓冲区内容,则退出
q!					:放弃对缓冲区的修改,强制退出
wq					:将缓冲区数据保存到文件中并退出(保存、退出)
w  filename			:将文件另存为其它名称
set nu				:显示行号
set nonu			:隐藏行号
  • 7.3 编辑数据
    在命令模式中,vim 编辑器提供了可用于编辑缓冲区数据的命令,如下表
    在这里插入图片描述
    有些编辑命令允许使用数字修饰符来指定重复该命令多少次。比如,命令2x会删除从光标当前位置开始的两个字符,命令5dd会删除从光标当前所在行开始的5行。

  • 7.4 复制和粘贴

剪切和粘贴相对容易一些。你已经看到上表中用来从缓冲区中删除数据的命令。但vim在删除数据时,实际上会将数据保存在单独的一个寄存器中。可以用p命令取回数据。举例来说,可以用dd命令删除一行文本,然后把光标移动到缓冲区的某个要放置该行文本的位置,然后用p命令。该命令会将文本插入到当前光标所在行之后。可以将它和任何删除文本的命令一起搭配使用。

复制文本则要稍微复杂点。 vim中复制命令是y(代表yank)。可以在y后面使用和d命令相同的第二字符( yw表示复制一个单词, y$表示复制到行尾)。在复制文本后,把光标移动到你想放置文本的地方,输入p命令。复制的文本就会出现在该位置。
复制的复杂之处在于,由于不会影响到你复制的文本,你没法知道到底发生了什么。你无法确定到底复制了什么东西,直到将它粘贴到其他地方才能明白。但vim还有另外一个功能来解决这个问题。
可视模式会在你移动光标时高亮显示文本。可以用可视模式选取要复制的文本。要进入可视模式,应移动光标到要开始复制的位置,并按下v键。你会注意到光标所在位置的文本已经被高亮显示了。下一步,移动光标来覆盖你想要复制的文本(甚至可以向下移动几行来复制更多行的文本)。在移动光标时, vim会高亮显示复制区域的文本。在覆盖了要复制的文本后,按y键来激活复制命令。现在寄存器中已经有了要复制的文本,移动光标到你要放置的位置,使用p命令来粘贴

  • 7.5 查找和替换

可以使用vim查找命令来轻松查找缓冲区中的数据。要输入一个查找字符串,就按下斜线( /)键。光标会跑到消息行,然后vim会显示出斜线。在输入你要查找的文本后,按下回车键要继续查找同一个单词,按下斜线键,然后按回车键。或者使用n键,表示下一个( next)

替换命令允许你快速用另一个单词来替换文本中的某个单词。必须进入命令行模式才能使用替换命令。替换命令的格式是:
在这里插入图片描述---------------------------------------------------------------------------------------------------------------------------------------
vim还有很多实用命令,推荐学习:掌握vim编辑器这些实用命令,让编辑效率翻倍!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值