[ctrl]+a:让光标移动到整个指令串的最前面。[ctrl]+e 移动到最后面。
[ctrl]+u:从光标处向前删除指令串。[ctrl]+k:向后删除指令串。
[ctrl]+d:表示键盘输入结束,推出当前命令行环境。
[ctrl]+l:清屏(类似clear) [ctrl]+c:结束运行(kill)
在 Bash shell 中,每一个变量的值都是字符串,无论给变量赋值的时候有没有使用引号,值都会以字符串的形式存储。
得到一个变量的值:
需要在变量名称前面加上$
,或者是以${变量}
的方式来取用。例如:echo $HOME
或者echo ${HOME}
echo
显示变量的值,unset
取消变量的设置
声明(设置)一个变量:
如:myname=abc 左边为变量,右边为其值。等号两边不能有空白字符;变量名不能以数字开头;变量值中有空白字符时,可以采用双引号或单引号将内容都括起来;反斜杠 \ 用来转义;$(指令)
表示得到该指令的运行结果;在一个变量中追加内容时,采用:将$变量名
或${变量名}
和追加的内容相连接,建议采用${变量名}
形式。如:
$ uu=$uuyes
$ echo uu
$ uu=${uu}yes
$ uu=$uuyes
yes
$ uu=$uuyes
$ uu=$uuyes
yesyes
在PATH变量中增加内容时,通过冒号 :来进行连接。如将一个目录加入到PATH环境变量:(通常大写字母为系统默认变量)
$ PATH=${PATH}:/home/dmtsai/bin
在变量的设置当中,单引号和双引号的区别在于双引号碰到 $
时会取它后面变量的值,不管是否带大括号:
$ echo ${uu}
yesyes
$ myuu="$uu hh"
$ echo ${myuu}
yesyes hh
$ myuu='$uu hh'
$ echo ${myuu}
$uu hh
采用env
和export
来列出系统中的环境变量;set
查看所有变量(含环境变量与自定义变量)。
当在bash下面执行另一个bash
命令时,当前的环境就会切换到第二个bash中去(即子程序),那原本的bash就会处于休眠状态(sleep),子程序仅会继承父程序的环境变量,而无法使用父程序中的自定义变量。此时可以通过export
来将父程序中的变量给子程序使用:
$ uu=987
$ bash
$ echo $uu
$ exit
exit
$ export uu
$ bash
$ echo $uu
987
$ exit
exit
$ export
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
declare -x DISPLAY="localhost:10.0"
declare -x HOME="/home/cedric"
...
declare -x XDG_SESSION_ID="14"
declare -x XDG_SESSION_TYPE="tty"
declare -x uu="987"
read [-pt] variable
-p:后面可以接提示字符 -t:后面接等待的秒数,超时会自动停止输入。
如下:读取键盘输入内容到变量 att 中。
$ read att
abc
$ echo $att
abc
$ read -p "please input:" -t 10 att
declare [-aixr] variable
-a 将 variable 变量定义为阵列(array)类型;-i 将变量定义为整数(integer)类型;-x 将该变量定义为环境变量(类似于 export);-r 将变量设置为 readonly 类型,该变量内容不可更改,也不能 unset。
如下:不指定类型的时候,如 1+2 是一个字符串,而不是一个计算式。
$ sum=10+20
$ echo ${sum}
10+20
$ declare -i sum=10+20
$ echo ${sum}
30
声明 sum 为环境变量,可以通过 export 来查看。 通过 +x 使其变为非环境变量,通过 declare -p v 来查看一个的类型。
$ declare -x sum
$ export | grep sum
declare -ix sum="30"
$ declare +x sum
$ declare -p sum
declare -i sum="30"
bash 只支持一维数组形式。使用如下;
$ var[1]="a b"
$ var[2]="b c"
$ var[3]="c d"
$ echo "${var[1]},${var[2]},${var[3]}"
a b,b c,c,d
$ ll
total 20
drwxrwxr-x 5 cedric cedric 4096 Aug 17 05:30 ./
drwxr-xr-x 16 cedric cedric 4096 Aug 17 05:28 ../
-rw-rw-r-- 1 cedric cedric 0 Aug 17 05:30 a.txt
drwxrwxr-x 6 cedric cedric 4096 Aug 16 03:51 CMake/
第一栏代表这个文件的类型(第一个字符)与权限(后九个字符),其中:
当类型为[d],则是目录;当为[-],则是文件,若是[l],则是链接文件(link file);若是[b],则是设备文件里面可供储存的周边设备(可随机存取设备);若是[c],则是设备文件里面的序列设备,例如键盘,鼠标(一次性读取设备)。
权限三个为一组,且均为"rwx"的三个参数的组合,分别表示可读、可写和可执行。- 表示无相应权限。第一组为文件所有者的权限,第二组为所有者所在群组的权限,第三组为其余账号的权限。
第二栏表示有多少个文件名链接到此节点(i-node)
第三栏表示这个文件的“拥有者账号”
第四栏表示这个文件的所属群组
第五栏表示这个文件的容量大小,默认单位为Bytes
第六栏表示这个文件的创建日期或者是最近的修改日期
第七栏表示这个文件的名称,. 开头的代表此文件为“隐藏文件”
chgrp:改变文件所属群组 change group 。被改变的群组名称必须要在 /etc/group 文件内存在
chown:改变文件所有者 change owner。owner 必须是已经存在系统中的账号,也就是在 /etc/passwd 这个文件中有记录的 owner 名称,才能改变
chmod:改变文件的权限,SUID,SGID,SBIT等等属性
通过数字来更改权限:rwx 通过二进制来表示,最大为 111 表示可读可写可执行,此时十进制数值为 7。比如更改文件 a.txt 的权限为:" rwxr-xr-- " 对应的二进制为:111101100,三个二进制为一组,对应的二进制值为:754 。相应的指令为:
$ chmod 754 a.txt
$ ll a.txt
-rwxr-xr-- 1 cedric cedric 0 Aug 17 05:30 a.txt
r(read contents in directory)可以读取该目录下的文件名,即通过 ls 将该目录的内容列表显示出来
w(modify contents of directory) 包括:创建新的文件与目录;删除已经存在的文件与目录(不论该文件的权限为何!);将已经存在的文件或目录进行更名;搬移该目录内的文件、目录位置等等。
x(access directory)代表的是使用者可以进入该目录,其能够成为工作目录。
要开放目录给任何人浏览时,应该至少也要给与 r 及 x 的权限,但 w 权限不可随便给;
能否读取到某个文件内容,跟该文件所在的目录权限也有关系(目录至少需要有 x 的权限)。
默认情况下:
当使用者创建文件时,默认没有可执行(x)权限,亦即只有 rw 这两个权限,也就是最大为 666,故默认权限为:-rw-rw-rw-
当使用者创建目录时,由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777,故默认权限为:drwxrwxrwx
umask:表示默认权限应该减去的权限(第一位表示特殊权限,在此不做关注)。如下:当 umask 为 002 时,文件的默认权限就会从 -rw-rw-rw-
变为-rw-rw-r--
。表示其余用户没有可写权限。
$ umask
0002
$ umask -S
u=rwx,g=rwx,o=rx
$ touch a
$ ll -d a b
-rw-rw-r-- 1 cedric cedric 0 Aug 17 05:30 a
drwxrwxr-x 2 cedric cedric 0 Aug 17 05:30 b/
a:当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有 root 才能设置这个属性。
i:i 比较厉害,它可以让一个文件”不能被删除、改名、设置链接、也无法写入或新增数据!“对于系统的安全性有相当大的助益!只有 root 能设置此属性。
# touch a
# chattr +i a
# rm a
rm: cannot remove 'a': Operation not permitted
# chattr -i a
# rm a
lsattr(显示文件隐藏属性)
file(观察文件类型)
Hard Link(实体链接,硬式链接或实际链接)
由于每个文件都会占用一个 inode,文件内容由 inode 的记录来指向;想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取。
也就是说,其实文件名只与目录有关,但是文件内容则与 inode 有关。那么想一想,有没有可能有多个文件名对应到同一个 inode 号码呢?有的!那就是 hard link 的由来。
所以简单的说:hard link 只是在某个目录下新增一笔文件名链接到某个 inode 号码的关联记录而已。
(ll -i 文件名:-i 表示列出文件的 inode 号)
通过 ln 原文件名 (可选的)实体链接文件名 在当前目录中创建一个其他目录中文件的硬链接:
$ touch a
$ ll -i a
3695289 -rw-rw-r-- 1 cedric cedric 0 Aug 18 03:20 a
$ ln a
ln: failed to create hard link './a': File exists
$ cd projects/
$ ln ~/a
$ ll -i a ~/a
3695289 -rw-rw-r-- 2 cedric cedric 0 Aug 18 03:20 a
3695289 -rw-rw-r-- 1 cedric cedric 0 Aug 18 03:20 /home/cedric/a
$ rm a
$ ll ~/a
-rw-rw-r-- 1 cedric cedric 0 Aug 18 03:20 /home/cedric/a
可以发现,两个文件名的所有相关信息都会一摸一样(除了文件名之外),创建硬链接时,不会新增 inode 和存放内容的 block,只是新增了一条当前文件名到 inode 的链接而已;不论你使用哪个”文件名“来编辑,最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改;删除硬链接文件,只会删除该链接,不会删除原文件,除非当链接数变为 0。
创建硬链接时,其实还是可能会改变系统的 block 的,那就是当你新增的这笔数据刚好将目录的 block 填满时,就可能会新加一个 block 来记录文件名关联性,而导致磁盘空间的变化!不过,一般 hard link 所用掉的关联数据量很小,所以通常不会改变 inode 与磁盘空间的大小!
不能链接目录。因为如果使用 hard link 链接到目录时,链接的数据需要连同被链接目录下面的所有数据都创建链接,这样造成的复杂度很高,故不支持!
Symbolic Link(符号链接)
相对于 hard link,Symbolic link 可就好理解多了,基本上,Symbolic link 就是创建一个独立的文件,而这个文件会让数据的读取指向它 link 的那个文件的文件名!(这个独立的文件中存放的是目标文件的全路径文件名而已)
由于只是利用文件来作为指向的动作。所以,当来原文件被删除之后,symbolic link 的文件会”打不开“。实际上就是找不到原始”文件名“而已!
通过 ln -s 原文件/目录名 (可选的)符号链接文件/目录名 在当前目录创建一个其他目录中文件或者目录的符号链接:
$ ls
a projects
$ cd projects/
$ ln -s ~/a b
$ ll -i ~/a b
3670035 lrwxrwxrwx 1 cedric cedric 14 Aug 18 03:51 b -> /home/cedric/a
3695289 -rw-rw-r-- 1 cedric cedric 0 Aug 18 03:20 /home/cedric/a
可以看出这是两个独立的文件,链接文件 b 中的内容是原文件的文件名,b 的大小为 14 字节,而原文件的文件名:/home/cedric/a 总共有14 个英文,每个英文占用 1 个字节,故大小总计 14 字节。
读取过程:通过链接文件中的内容,得到真正的文件名,从而链接到正确的目录中去取得目标文件的 inode,最终就能读取到正确的数据了。
打包:tar ;压缩:gzip,bzip2,xz
压缩指令大多仅能针对单一文件来进行压缩,虽然 gzip,bzip2,xz也能够针对目录来进行压缩,不过,这两个指令对目录的压缩指的是”将目录内的所有文件“分别”进行压缩“的动作!而非在 Windows 系统中采用类似于 winrar 将好多数据直接压缩成一个文件。
将多个文件或目录包成一个大文件的指令功能,即”打包指令“,在 Linux 中对应的是 tar 指令。tar 可以将多个目录或文件打包成一个大文件,同时还可以通过 gzip/bzip2/xz 的支持,将该文件同时进行压缩!
常用的解压缩命令:
tar -xvf 文件名.tar.xz
tar -zxvf 压缩文件名.tar.gz
常用的压缩和打包命令:
tar -cvf mydir.tar mydir/ 打包目录成为一个文件
gzip myfile 压缩文件
tar -czvf mydir.tar.gz mydir/ 打包目录成为一个文件后进行压缩
ulimit [-SHacdfltu] [配额]
选项和参数:
-H:hard limit,严格设置,不可超过此值
-S:soft limit,警告设置,超过此值时会有警告信息提示。
-a:后面不接任何选项和参数,可以列出所有的限制额度
-c:当程序发生错误时,系统可能会将该程序在内存中的信息写成文件,这种文件被称为核心文件(core file)。此参数用来设置核心文件的最大容量
-f:此 shell 可以创建的最大文件大小(一般可设置为2GB),单位为KBytes
-d:程序可使用的最大段(segment)容量
-l:可用于锁定(lock)的内存量
-t:可使用的最大 CPU 时间,单位为妙
-u:单一使用者可以使用的最大程序(process)数量。
特殊目录
.
代表此层目录
..
代表上一层目录
-
代表前一个工作目录
~
代表”目前使用者身份“所在的主文件夹
相关命令:
cd:变换目录 change directory
ls:ll 列出详细信息 -d 选项仅列出文件或者目录本身(常用,比如:ll -d a ls -d a)
pwd:显示当前所在目录 Print Working Directory -P 选项可以让我们取得正确的目录名称,而不是以链接文件的路径来显示
mkdir:创建一个新的目录 make directory -p 选项:确保目录名称存在,如果目录不存在的话就重新创建一个 可以通过它来创建多个目录: mkdir -p a/b/c/d
rmdir:删除一个空的目录 仅能删除空的目录。 常采用 rm -r
来代替
cp(复制文件或目录) -a 或者 -p 选项能够复制原文件的所有属性和权限。(默认情况下仅仅只是原文件的备份)
rm(移除文件或目录)
mv(移动文件与目录,或重命名)
查阅文件属性的指令 ls 的完整可执行程序文件名:/bin/ls(这是绝对路径),但是可以在任何地方执行 ls 命令的原因在于环境变量 PATH,当在执行一个指令时,系统会按照 PATH 中的设置去每个 PATH 定义的目录下搜寻该可执行文件,如果在 PATH 定义的目录中含有多个文件名为 ls 的可执行文件,那么先搜寻到的同名指令先被执行!
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
which(寻找可执行文件的所在目录) 用法:which [-a] command 选项或参数:
-a :列出在 PATH 目录中可以找到的所有指令,不止第一个
$ which ls
/usr/bin/ls
$ which -a ls
/usr/bin/ls
/bin/ls
通常 find 不很常用,因为它直接搜寻硬盘,速度慢。一般先使用 whereis 或者是 locate 来检查,如果真的找不到了,再采用 find。因为 whereis 只找系统中某些特定目录下面的文件而已,locate 则是利用数据库来搜寻文件名,所以它俩速度相当快速,因为没有实际搜寻硬盘内的文件系统状态。
whereis
whereis [-bmsu] 要查找的文件或者目录名
选项与参数:
-l:列出 whereis 会去查询的几个主要目录,即只在这几个目录下面进行查找。
-b:只找 binary 格式的文件
-m:只找在说明文档 manual 路径下的文件
-s:只找 source 来源文件
-u:搜寻不在上述三个项目当中的其他特殊文件
locate:查找包含 keyword 的文件名
locate [-ir] keyword
选项和参数:
-i:忽略大小写的差异;
-c:不输出文件名,仅计算找到的文件数量
-l:仅输出几行的意思,如输出五行则是 -l 5
-S:输出 locate 所使用的数据库文件的相关信息,包含该数据库记录的文件/目录数量等
-r:后面可接正则表达式的显示方式
locate 是通过数据库来搜寻的,这也意味着它可能会错过最近创建或修改的文件,因为数据库可能不是最新的。当然通过 updatedb 可以手动更新数据库,但也需要数分钟时间。
find
find 的常见使用方法:find / -name *nam*
表示在 / 目录下搜寻名称中包含有 nam 的文件。