Shell 的基本操作

常用快捷键

按键 作用
Tab 命令补全
Ctrl+c 强行终止当前程序
Ctrl+d 键盘输入结束或退出终端
Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行
Ctrl+z 将当前程序放到后台运行,恢复到前台命令 fg
Ctrl+a 将光标移动到行首
Ctrl+e 将光标移动到行尾
Ctrl+k 删除从光标所在位置到行末
Alt+Backspace 向前删除一个单词

常用通配符

字符 含义
* 匹配0或多个字符
? 匹配任意一个字符
[list] 匹配 list 中的任意单一字符
[!list] 匹配除 list 中的任意单一字符以外的字符
[c1-c2] 匹配c1-c2中的任意单一字符,如[0-9][a-z]
{string1,string2,...} 匹配其中一个字符串
{c2..c2 匹配c1-c2中全部字符,如{1..10}

用户管理

查看用户

$ who am i

或者

$ who mon likes

who 命令其他常用参数

参数 说明
-a 打印能打印的全部
-d 打印死掉的进程
-m am i, mom likes
-q 打印当前登陆用户数及用户名
-u 打印当前登陆用户登陆信息
-r 打印运行等级

创建用户

创建用户需要 root 用户的权限,所以需要使用 sudo 这个命令。使用 sudo 名利需要满足两个条件:

  1. 知道当前登陆用户的密码
  2. 当前用户必须在 sudo 用户组
$ su <user> # 切换用户到 user
$ sudo <cmd> # 以 root 权限运行命令
$ su - <user> # 切换用户,并且环境变量同时改变到目标用户的环境变量

新建用户命令:

$ sudo adduser <username>

创建用户的同时会为用户创建 home 目录。

用户组

在 Linux 中每个用户都有一个用户组,它们共享一些资源和权限,同时拥有私有资源。

查看自己的用户组

$ groups <username>

或者,查看/etc/group文件

$ cat /etc/group | sort

sort 表示将读取的文本进行一个字典排序再输出。

etc/group 文件格式说明

/etc/group 的内容包括用户组(Group)、用户组口令、GID 及该用户组所包含的用户(User),每个用户组一条记录。格式如下:

group_name:password:GID:user_list

将其他用户加入 sudo 用户组

使用 usermod 命令可以为用户组添加用户,使用该命令需要有 root 权限。

使用一个具有 root 权限的用户为一个不具有 root 权限的用户添加 sudo 权限:

$ sudo usermod -G sudo <username>

删除用户

$ sudo deluser <username> --remove-home

文件权限

查看文件权限

$ ls -l

文件类型

Linux 里面一切皆文件。

文件权限

  • 读权限:可以读取某个文件的内容
  • 写权限:可以编辑和修改某个文件
  • 执行权限:通常指可以运行的二进制程序文件或者脚本文件

注:一个目录要同时具有读权限和执行权限才可以打开,要有写权限才允许在其中创建其他文件。Linux 不是用过文件的后缀名来区分文件的类型。

链接数

链接到该文件所在的 inode 结点的文件名数目。

修改文件权限

方法1:二进制数字表示

修改只能自己使用:

$ chmod 700 <filename>

方法2:加减赋值操作

$ chmod go-rw <filename>

'g''o'还有'u',分别表示group,others,user,'+','-' 就分别表示增加和去掉相应的权限。

目录结构

Windows 是以存储介质为主的,之下才是目录;而 Unix 是以目录为主的,存储介质是挂载在目录上的。Linux 以树形目录结构的形式来构建整个系统。

FHS 标准

FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。

FHS 定义了两层规范,第一层是,/下面的各个目录应该要放什么文件数据,例如 /etc 应该要放设置文件,/bin 与 /sbin 则应该要放置可执行文件等等。

第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统登录文件,/usr/share 放置共享数据等等。

FSH 是根据以往无数 Linux 用户和开发者的经验总结出来的,并且会持续更新,FSH 依据文件系统使用的频繁与否以及是否允许用户随意改动,将目录定义为四中交互作用的形态,如下表示:

目录路径

绝对路径

以根目录为起点的完整路径。

相对路径

相对于你当前目录的路径。

文件的基本操作

新建

新建空白文件

$ touch test

关于 touch 命令,其主要是用来更改文件时间戳的。

新建目录

$ mkdir testDir

使用 -p 参数,可以创建一个多级目录,例如:

$ mkdir -p father/son/grandson

复制

复制文件

$ cp test testDir

复制目录

$ cp -r father family

删除

$ rm test

参数 -f 可以强制删除一些为只读权限的文件。

$ rm -f test

删除一个目录:

$ rm -r testDir

移动文件

$ mv testFile testDir

重命名文件

mv 命令还有重命名的作用:

$ mv oldName newName

查看文件

cattac

这两个命令都是用来打印文件内容到标准输出(终端),其中cat 为正序显示,tac 为倒序显示。

标准输入输出:当我们执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),默认对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应被重定向到终端的屏幕,以便我们能直接看到输出内容。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

可以使用-n 参数来显示行号:

$ cat -n <filename>

nl

添加行号并打印,比 cat 更加强大,参数说明:

-b : 指定添加行号的方式,主要有两种:
    -b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
    -b t:只列出非空行的编号并列出(默认为这种方式)
-n : 设置行号的样式,主要有三种:
    -n ln:在行号字段最左端显示
    -n rn:在行号字段最右边显示,且不加 0
    -n rz:在行号字段最右边显示,且加 0
-w : 行号字段占用的位数(默认为 6 位)

查看文件类型

使用 file 命令来查看文件类型:

$ file /bin/ls

这表示这是一个可执行文件。

环境变量

变量

使用declare命令可以创建一个变量:

$ declare tmp

读取变量的值,使用echo命令和$符号:

$ echo $tmp

环境变量

环境变量就是作用域比自己定义的变量要大,如 Shell 的环境变量作用于自身和它的子进程。例如 Shell 环境变量作用于自身和它的子进程。在类 UNIX 系统中,每个进程都有其各自的环境变量设置,当一个进程被创建时,处理创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。

通常我们会涉及到的环境变量有三种:

  • 当前 Shell 进程私有用户自定义变量,只在当前 Shell 中有效
  • Shell 本身内建的变量
  • 从自定义变量导出的环境变量

set, env, export这三个命令可以用来打印相关环境变量,区别在于涉及的是不同范围的环境变量:

命令 说明
set 显示当前 shell 所有环境变量,包括其内建环境变量、用户自定义变量及导出的环境变量
env 显示与当前用户相关的环境变量,还可以让命令在制定环境中运行
export 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量

命令的查找路径与顺序

Shell 通过环境变量PATH来搜索命令。

查看 PATH 环境变量的内容:

$ echo $PATH

输出的内容为:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

这些目录下面存放的都是可执行文件。

添加自定义路径到PATH 环境变量

PATH里面的路径是以:作为分隔符,所以可以这样添加自定义路径:

$ PATH=$PATH:/home/xxxx

注意到这里一定要使用绝对路径。

这种修改的方式只对当前的 Shell 有效,要想让每个用户都讷讷够使用,需要更改相应的配置文件,例如zsh需要修改相应的.zshrc

修改和删除已有变量

可以使用unset命令来删除一个环境变量:

$ unset temp

如何让环境变量立即生效

在修改了配置文件后,可以使用source命令来让其立即生效:

$ source .zshrc

搜索文件

whereis简单快速

$ whereis who

whereis只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)。

locate快而全

通过/var/lib/mlocate/mlocate.db数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次updatedb命令。他可以用来查找指定目录下的不同文件类型,例如查找/usr/share/下所有的 jpg 文件:

$ locate /usr/share/\*.jpg

注意要添加*号前面的反斜杠转义,否则会无法找到

which小而精

我们通常使用which来确定是否安装了某个指定的软件,因为它只从PATH 环境变量指定的路径中去搜索命令:

$ which man

find 精而细

find命令应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找,而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。

在指定目录下搜索指定文件名的文件:

$ find /etc/ -name interface

find 命令的基本参数格式为:find [path] [option] [action]

与时间相关的命令参数:

参数 说明
-atime 最后访问时间
-ctime 创建时间
-mtime 最后修改时间