shell基础命令
1 使用shell提示符
默认的bash shell提示符是美元符号($),这个符号表明shell在等待用户输入命令,不同的linux发行版会采用不同的提示符。
2 与bash手册交互
man 命令可以访问linux系统的手册页。在 man 命令后加上命令名,即可显示相应的手册页。
许多命令采用的基本模式如下
COMMAND-NAME [OPTION] [ARGUMENT]
COMMAND-NAME是想要运行的命令名。
[OPTION] 是用于修改命令行的选项。可添加的OPTION通常不止一个。
[ARGUMENT]是传递给命令的参数,指明命令操作的对象。
除了按照惯例命名的各段,手册页中还有不同的节,例如,可通过 man 7 hostname来访问手册页中的第七节。另外,大多数命令接受-h 或者--help选项,可输入hostname -h来访问帮助信息。
3 浏览文件系统
层次目录结构
Linux文件系统采用树形目录结构,所有的文件和目录都从根目录(/
)开始。根目录下可以有多个子目录,每个子目录下又可以包含文件和其他子目录。这种结构使得文件的组织和访问非常清晰。
文件类型
Linux中的文件类型包括常规文件(如文本文件、二进制文件)、目录、符号链接(软链接,指向其他文件或目录的引用,类似于Windows中的快捷方式)、设备文件(代表系统中的硬件设备,通常位于/dev
目录中)、管道和套接字(用于进程间通信的特殊文件)。
挂载点
Linux文件系统通过挂载点将不同的文件系统(例如不同的磁盘分区、外部存储设备等)集成到单一的目录树下。挂载点是目录,通过它可以访问挂载的文件系统。
Linux文件系统会将所有的磁盘都并入单个虚拟目录。在使用新的存储设备之前,需要将其放在虚拟目录中,这项工作称为挂载
文件权限和所有权
每个文件和目录都有与之关联的权限和所有权,确定哪些用户和组可以读取、写入或执行文件。
元数据
文件系统不仅存储文件内容,还存储与文件相关的元数据,如文件大小、创建时间、修改时间、权限、所有者等。
3.1 遍历目录
在linux文件系统中,可以使用目录切换cd destination 命令将shell会话切换到另一个目录,如果没有指定目标路径,则会切换到你的主目录中。destination 参数可以用两种方式表示:相对路径和绝对路径。
绝对路径
绝对路径定义了在虚拟目录结构中,该目录从根目录开始的确切位置,相当于目录的全名。绝对路径总是以正斜线 / 开始,以指明虚拟文件系统的根目录。
相对路径
相对路径允许你指定一个基于当前位置的目标路径,相对路径以目录名或是特殊字符开始。
单点好 . 表示当前目录 双点号 .. 表示当前目录的父目录
4 列出文件和目录
本节将描述 ls 命令和可用来格式化其输出信息的选项
4.1 显示基本列表
ls 命令输出的列表是按照字母按列排序的,-F 选项会在目录名之后添加正斜线 / 以方便分辨,以 * 号结尾的文件为可执行文件。要查看隐藏文件,可使用 -a 选项,通常以 . 开头。-R 称作递归选项,可以列出当前目录所包含的子目录中的文件。
4.2 显示长列表
-l 选项会产生长列表格式的输出,提供目录中各文件的详细信息。
4.3 过滤输出列表
可直接使用文件名放在选项之后,ls 命令则会只显示该文件的信息。当你可能不知道你要寻找的文件的确切名称时,ls 命令也可使用通配符进行模式匹配。
? : 代表任意单个字符 * : 代表零个或者多个字符 [ ] : 用来指定一组字符中的任意一个。 ! : 排除不需要的内容
5 处理文件
5.1 创建文件
touch 命令可在你的工作目录创建一个空文件
5.2 复制文件
cp 命令最基本的用法需要两个参数,即源对象和目标对象
cp source destination
当参数source 和destination 都是文件名时,cp 命令会将源文件复制成一个新的目标文件,并以destination 命名。当被复制文件以存在时,-i 选项会询问是否覆盖已有文件。-R 选项可在单个命令中递归复制整个目录的内容。
5.3 链接文件
链接是指在目录中指向文件真实位置的占位符,linux系统中有两种类型的文件链接。
符号链接
符号链接也称为软链接是一个真实存在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个以符号方式链接在一起的文件彼此的内容并不相同。
要为一个文件创建符号链接,该文件必须事先存在,随后使用ln 命令以及-s 选项创建符号链接。
硬链接
硬链接创建的是一个独立的虚拟文件,其中包含了原始文件的信息以及位置。但是两者本质是同一个文件。ln 命令可直接创建硬链接
5.4 文件重命名
mv 命令可将文件和目录移动到另一个位置或者是重新命名
5.5 删除文件
rm 命令可直接删除文件或者目录,-r 选项可以向下进入目录删除文件,然后再删除目录本身。
6 管理目录
6.1 创建目录
mkdir 命令可直接创建目录,-p 选项可批量创建目录,例如:
mkdir -p Newd_dir/sub_dir/under_dir
6.2 删除目录
基础命令是rmdir ,默认情况下,rmdir 只删除空目录。
7 查看文件内容
有几个命令可以直接查看文件的内容,不需要调用其他文本编辑器。
7.1 查看文件类型
file 命令可判断文件类型并查看内容。
7.2 查看整个文件
cat 命令是显示文本文件中所有数据的得力工具,-n 会给所有行加上行号,-b 会只给有文本的行加上行号。more 命令和less 命令是一个分页工具,可部分显示文本内容。
7.3 查看部分文件
tail 命令可显示文件的后10行,-n 选项可修改显示的行数,-f 选项允许其他进程使用此文件时添加到文件中的内容。head 命令则会显示文件开头若干行。
更多的bash shell命令
1 监测程序
1.1 探查进程
当程序在系统中运行的时候,它被称为进程(process)。要熟悉这些进程,必须熟悉ps 命令的用法。linux系统中使用GNU ps命令支持一下三种类型的命令行选项
Unix风格选项,选项前加单连字符
- -a:显示与任何用户标识和终端相关的进程。
- -e:显示所有进程(包括守护进程)。
- -f:显示进程的完整和详细信息,包括进程启动时间、控制终端、用户、组等。
- -H:显示进程的层级关系,即进程树。
- -l:长格式展示进程信息。
- -L:显示进程的线程信息。
- -o format:自定义输出格式。
- -p pid:显示与指定PID相关的进程。
- -u userid:显示与指定用户标识userid相关的进程。
BSD风格选项,选项前不加连字符
- a:与Unix风格选项的-a相同,显示与任何用户标识和终端相关的进程。
- e:与Unix风格选项的-e相同,显示所有进程(包括守护进程)。
- f:显示进程从属关系。
- u:显示进程的用户信息。
- x:显示没有控制终端的进程。
BSD风格选项还可以组合使用,例如
ps aux
显示所有用户的所有进程(包括其他用户的进程),并给出完整的输出信息。
GNU长选项,选项前加双连字符
- --forest:以树状图显示进程信息,显示进程的层级关系。
- --info:显示关于ps命令的详细信息。
- --sort:根据指定的列对进程进行排序,例如
--sort=-pmem
按内存使用率降序排序。
1.2 实时检测进程
ps 命令虽然在手机系统中运行的进程信息时非常有用,但也存在不足之处:只能显示特定时间点的信息。如果想观察那些被频繁换入和换出内存的进程,ps 命令就不太方便了,这正是top 命令的用武之地。与ps 命令类似,top 命令可以显示进程信息,但采用的是实时方式。
1.3 结束进程
在linux中有两个命令可以向运行中的进程发出进程信号:kill 和 pkill
kill 命令默认情况下会向命令行中列出的所有PID发送TREM信号以结束进程。
pkill 命令可以使用程序名代替PID来终止进程,此外,pkill命令也允许使用通配符
pkill http*
以root身份使用pkill命令时要格外小心。命令中的通配符很容易意外地将系统的重要进程终止,这可能会导致文件系统损害
2 监测磁盘空间
2.1 挂载存储设备
用于挂载存储设备的命令叫做 mount
移除可移动设备时,不能直接将设备拔下,应该先卸载,此命令为 umount
3 处理数据文件
3.1 数据排序
处理大量数据时的一个常用命令是 sort,这是用来对数据进行排序的命令。默认情况下,sort 命令会依据默认语言的排序规则来对文本中的数值进行排序。
- -r/--reverse:反转排序顺序,即从大到小进行降序排序。默认情况下,sort命令会按照升序进行排序。
- -n/--numeric-sort:按数字顺序进行排序。默认情况下,sort命令会将每行当做文本进行排序,而不是按照数字大小。使用此选项后,sort命令会按照数值大小对行进行排序。
- -u/--unique:在排序之后移除重复的行。此选项可以帮助用户快速去除文件中的重复内容。
- -t/--field-separator:定义字段的分隔符。默认情况下,sort命令使用空格作为字段的分隔符。使用此选项,用户可以指定其他字符作为分隔符,以便对特定字段进行排序。
- -k/--key:指定排序的字段。此选项通常与-t选项一起使用,用于指定基于哪个字段进行排序。字段的编号从1开始,表示第一个字段。
- -b/--ignore-leading-blanks:忽略每行开头的空格字符。此选项可以帮助用户去除行首的空白部分,以便更准确地进行排序。
- -f/--ignore-case:忽略大小写进行排序。默认情况下,sort命令会区分大小写进行排序。使用此选项后,sort命令会忽略大小写差异,将所有字母视为相同大小写进行排序。
- -M/--month-sort:以月份进行排序。此选项允许用户按照月份的顺序(如JAN小于FEB)对包含月份的文本进行排序。
- -c/--check:检查文件是否已经排序。如果文件已经按照指定的排序规则排好序,则sort命令不会输出任何内容;如果文件未排序,则sort命令会输出第一个乱序的行的相关信息,并返回1。
- -C/--check=quiet:与-c选项类似,但不会在发现乱序时输出乱序行的信息,仅返回1。
- -o/--output:指定输出文件的名称。默认情况下,sort命令会将排序结果输出到标准输出(通常是屏幕)。使用此选项,用户可以将排序结果保存到指定的文件中。
3.2 数据搜索
与其手动翻找整个文件,不如使用grep 命令来帮助查找。grep 命令的格式如下:
grep [options] pattern [file]
grep 命令会在输入或指定文件中逐行搜索匹配指定模式的文本。该命令输出指定模式的行。
3.3 数据压缩
gzip软件包是GNU项目的产物,旨在编写一个能够替代原先Unix中compress的免费版本,其包括以下文件:
gzip 用于压缩文件
gzcat 用于查看压缩过的文本内容
gunzip 用于解压文件
3.4 数据归档
tar 命令的格式如下
tar function [options] object1 object2
理解shell
shell的类型
shell的父子关系
理解外部命令和内部命令
Linux环境变量
什么是环境变量
bash shell使用环境变量来存储shell会话和工作环境的相关信息,环境变量允许在内存中存储数据。
全局变量
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部环境变量则只对创建它的shell可见。
可以使用env 命令或者printenv 命令查看全局变量
局部环境变量
用户自定义的变量为局部环境变量
set 可显示特定进程的所有环境变量,包括局部变量、全局变量
设置用户自定义变量
设置局部用户自定义变量
可以使用等号为变量赋值,值可以是数值或字符串,如果用于赋值的字符串包含空格,则必须用单双引号界定字符串的起止。
my_variable='Hello world'
echo $my_variable
记住,在变量名、等号和值之间没有空格,这一点非常重要。如果在子进程中设置了一个局部变量,那么一旦退出子进程,该局部变量就不能用了,反之亦然。
设置全局环境变量
创建全局环境变量的方法是先创建局部变量,然后再将其导出到全局环境中。这可以提供export 命令以及要导出的变量名实现。
my_variable='I m Global now'
export my_variable
子shell无法使用export 命令改变父shell中全局环境变量的值,如果子shell重新定义并导出了全局变量,父shell中的变量任然保留着原先的值
删除环境变量
unset 命令可以完成这个操作
my_variable='I m going to removed'
unset my_variable
在涉及环境变量名时,什么时候用$需要记住一点;如果要用到(doing anything with)变量,则使用$;如果要操作(doing anything to)变量,则不用$
默认的shell环境变量
HOME | 当前用户的主目录路径 | /home/username |
PATH | 定义Shell搜索可执行文件的目录列表 | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
SHELL | 当前用户正在使用的Shell程序的路径 | /bin/bash |
USER | 当前登录用户的用户名 | username |
LOGNAME | 与USER 变量类似,也表示当前登录用户的用户名 | username |
HOSTNAME | 当前主机(计算机)的名称 | mycomputer |
TERM | 定义当前终端的类型 | xterm-256color |
PWD | 当前工作目录的路径 | /home/username/Documents |
LANG 或 LC_* 系列 | 定义程序的语言和区域设置 | en_US.UTF-8 |
PS1 | Shell命令行界面的主提示符 | \u@\h:\w\$ |
PS2 | Shell命令行界面的次提示符(用于多行命令续行) | > |
设置PATH环境变量
当在shell CLI中输入一个外部命令时,shell必须搜索系统,从中找到对应的程序。PATH环境变量定义了用于查找命令和程序的目录。如果命令或者程序所在的位置没有包括在PATH变量中,那么在不使用绝对路径的情况下,shell是无法找到的。
PATH=$PATH:/home/pepsi/scripts
将目录添加到PATH环境中后,可以在虚拟目录结构下的任意位置执行这个程序。
定位系统环境变量
接下来的问题是如何让环境变量的作用持久化
1 登录shell
在登录Linux系统时,bash shell会作为登录shell启动,登录shell会从5个不同的启动文件中读取。这些启动文件的读取顺序通常是:/etc/profile
-> ($HOME/.bash_profile
|$HOME/.bash_login
| $HOME/.profile
) -> $HOME/.bashrc
。这些文件均以点号开头,说明属于隐藏文件。.bashrc通常被其他文件允行。
1.1 /etc/profile
这是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。
1.2 $HOME目录下的启动文件
其余的启动文件都用于一个目的:提供用户专属的启动文件来定义该用户所用到的环境变量。大多数Linux发行版只用这四个中的一两个。
2 交互式shell进程
如果不是登录系统时启动的bash shell,那么这时的shell称为交互式shell
3 非交互式shell
非交互式shell是一种不等待用户输入命令,而是自动执行脚本文件中的命令的shell环境
4 环境变量持久化
在大多数发行版中,保存个人用户永久性bash shell变量的最最佳地点是$HOME/.bashrc
数组变量
环境变量的一个很酷的特性是可以作为数组使用,数组是能够存储多个值的变量,这些值既可以单独引用也可以作为整体引用
mytest=(0 1 2 3 4)
将值放在中括号内,值与值以空格分隔。
要想引用单个元素,必须使用位置索引,显示整个数组变量,可以使用通配符*作为索引。
echo ${mytest[2]}
echo ${mytest[*]}
索引从0开始,这一点与python一致
理解Linux文件权限
Linux文件权限通常通过以下几种方式表示:
符号表示法(Symbolic Notation):
r
表示可读(read)w
表示可写(write)x
表示可执行(execute)-
表示没有相应的权限例如,
rwxr-xr--
表示:
- 所有者(user)有读、写和执行权限(
rwx
)- 所属组(group)有读和执行权限(
r-x
)- 其他用户(others)只有读权限(
r--
)
八进制表示法(Octal Notation):
例如,
- 每个权限位可以转换为一个八进制数:
- 读权限(
r
) = 4- 写权限(
w
) = 2- 执行权限(
x
) = 1- 无权限 = 0
rwxr-xr--
可以转换为755
:
- 所有者权限:
rwx
= 4+2+1 = 7- 所属组权限:
r-x
= 4+1 = 5- 其他用户权限:
r--
= 4 = 4(但通常表示为0,因为这里没有写和执行权限,所以合并后为0)
基于Debian的软件安装
vim编辑器
vim编辑器在内存缓冲区域中处理数据,只要输入vim 命令和文件名就可以启动vim编辑器
vim编辑器有三种模式:
命令模式
刚打开要编辑(或新建文件)时,vim编辑器会进入命令模式,此模式下将你的按键解释成命令。
光标移动:
- “h”:向左移动光标。
- “j”:向下移动光标。
- “k”:向上移动光标。
- “l”:向右移动光标。
- “gg”:移动到文件首行。
- “G”:移动到文件尾行。
- “0”(数字零):移动到当前行的行首。
- “$”:移动到当前行的行尾。
- “w”:移动到下一个单词的开头。
- “b”:移动到上一个单词的开头。
- “Ctrl+b”:屏幕往后移动一页。
- “Ctrl+f”:屏幕往前移动一页。
- “Ctrl+u”:屏幕往后移动半页。
- “Ctrl+d”:屏幕往前移动半页。
- “#l”:光标移到该行的第#个位置,如5l表示光标移到当前行的第五个位置。
文本操作:
- “x”:删除光标所在字符。
- “dd”:删除当前行(剪切)。
- “yy”:复制当前行。
- “p”:在光标后粘贴内容。
- “u”:撤销上一个操作。
- “Ctrl+r”:重做被撤销的操作。
- “yy”:复制游标所在的整行(3yy表示复制3行)。
- “P”:粘贴至光标前(上)。
- “ddp”:交换上下行。
- “cc”:替换整行,即删除游标所在行并进入插入模式。
- “nx”:连续删除n个字符。
- “dw”或“daw”:删除一个单词。
- “d$”或“D”:删除至行尾。
- “d^”:删除至行首。
- “dG”:删除至文档尾部。
- “d1G”:删除至文档首部。
- “ndd”:删除n行。
- “nx”:删除n个连续字符。
- “~”:将光标所在位置字母变成大写或小写。
光标快速移动:
- “nG”:到文件第n行。
- “:n”:移动到第n行。
- “H”:把光标移到屏幕最顶端一行。
- “M”:把光标移到屏幕中间一行。
- “L”:把光标移到屏幕最底端一行。
- “zz”:将当前行移动到屏幕中央。
- “zt”:将当前行移动到屏幕顶端。
- “n%”:到文件n%的位置。
- “Ctrl+o”:快速回到上一次光标所在位置。
屏幕翻页:
- “Ctrl+f”:下翻一屏。
- “Ctrl+b”:上翻一屏。
- “Ctrl+d”:下翻半屏。
- “Ctrl+e”:向下滚动一行。
- “Ctrl+y”:向上滚动一行。
文本缩进:
- “>>”:当前行右移一个缩进。
- “<<”:当前行左移一个缩进。
标记与跳转:
- “m{A-Z}”:标记光标所在位置,全局标记。标记之后,退出Vim,重新启动,标记仍然有效。
- `{a-z}”:移动到标记位置。
- “`{0-9}”:回到上[2-10]次关闭vim时最后离开的位置。
- “Ctrl+o”:跳转到更老的位置。
- “Ctrl+i”:跳转到更新的位置。
- “`” ”:移动到上次离开的地方。
- “`.”:移动到最后改动的地方。
复制与粘贴
剪切和粘贴:可以先用dd 命令删除一行文本,然后把光标移动到想要操作的位置,输入p 命令,p 命令会将数据从数据从寄存器中取回。
复制与粘贴:vim的复制命令时y (yank),yw 表示复制一个单词,y$表示复制到行尾,复制之后使用p 命令复制的文本就会出现在想要的位置。
查找和替换:如果要查找一个字符串,则可以在输入/ 后接上想要查找的字符。
EX模式中的替换命令:
s/old/new/g ###替换当前行内的所有old为new
n,ms/old/new/g ###替换n到m行内的所有old
:%s/old/new/g ###替换整个文本中的old
:%s/old/new/gc ###替换整个文本中的ol并作出提示
EX模式
在命令模式中输入:
文件操作命令:
:w
:保存文件。:q
:退出Vim编辑器。:wq
:保存文件并退出编辑器。:saveas filename
:将文件另存为指定的文件名。文本查找和替换命令:
:%s/old/new/g
:在整个文件中替换所有出现的“old”为“new”。:10,20s/old/new/g
:仅在文件的第10行到第20行之间替换“old”为“new”。:%s/\cold/new/g
:使用正则表达式进行替换,\c
表示忽略大小写。行操作和移动命令:
d
:删除行。例如,:3,18d
删除第3行到第18行。m
:移动行。例如,:11,15m23
将第11行到第15行移动到第23行下面。co
或t
:复制行。例如,:23,29co100
将第23行到第29行复制到第100行下面。外部命令执行和文本插入:
:!ls
:执行外部命令ls
并显示结果。:r!cat filename
:读取外部文件filename
的内容并插入到当前光标位置。多文件操作命令:
:arg file1.txt file2.txt
:设置参数列表,包含file1.txt
和file2.txt
。:argadd anotherfile.txt
:向参数列表添加文件anotherfile.txt
。:argdelete file1.txt
:从参数列表删除文件file1.txt
。:next
:编辑参数列表中的下一个文件。其他高级命令:
- 宏录制:Ex命令可以录制宏,以便在多个地方重复使用。例如,使用
:'<,'>normal @a
选中可视区域内的文本,并执行寄存器a
中的宏。- 条件执行:Ex命令可以根据条件执行不同的命令。例如,
:if &filetype == 'python' | set expandtab | endif
如果文件类型为python
,则设置expandtab
。- 函数定义:Ex命令允许定义函数,以封装复杂的操作。例如,定义一个函数
UpperCase()
将所有单词的首字母大写。