Linux 相关知识

一、shell相关

快捷键

      [ctrl]+a:让光标移动到整个指令串的最前面。[ctrl]+e 移动到最后面。

      [ctrl]+u:从光标处向前删除指令串。[ctrl]+k:向后删除指令串。

      [ctrl]+d:表示键盘输入结束,推出当前命令行环境。

      [ctrl]+l:清屏(类似clear) [ctrl]+c:结束运行(kill)

变量相关:

变量

      在 Bash shell 中,每一个变量的值都是字符串,无论给变量赋值的时候有没有使用引号,值都会以字符串的形式存储。

  1. 得到一个变量的值:

    需要在变量名称前面加上$,或者是以${变量}的方式来取用。例如:echo $HOME或者echo ${HOME}

  2. echo显示变量的值,unset取消变量的设置

  3. 声明(设置)一个变量:

    如:myname=abc 左边为变量,右边为其值。等号两边不能有空白字符;变量名不能以数字开头;变量值中有空白字符时,可以采用双引号或单引号将内容都括起来;反斜杠 \ 用来转义;$(指令)表示得到该指令的运行结果;在一个变量中追加内容时,采用:将$变量名${变量名}和追加的内容相连接,建议采用${变量名}形式。如:

    $ uu=$uuyes
    $ echo uu
    
    $ uu=${uu}yes
    $ uu=$uuyes
    yes
    $ uu=$uuyes
    $ uu=$uuyes
    yesyes
    

    在PATH变量中增加内容时,通过冒号 :来进行连接。如将一个目录加入到PATH环境变量:(通常大写字母为系统默认变量)

    $ PATH=${PATH}:/home/dmtsai/bin
    
  4. 在变量的设置当中,单引号和双引号的区别在于双引号碰到 $时会取它后面变量的值,不管是否带大括号:

    $ echo ${uu}
    yesyes
    $ myuu="$uu hh"
    $ echo ${myuu}
    yesyes hh
    $ myuu='$uu hh'
    $ echo ${myuu}
    $uu hh
    
查看系统中的变量 env export和set

      采用envexport来列出系统中的环境变量;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宣告变量的类型,array和declare
  1. read 用来读取键盘输入,常用在 shell script 的撰写中。

read [-pt] variable

-p:后面可以接提示字符 -t:后面接等待的秒数,超时会自动停止输入。

如下:读取键盘输入内容到变量 att 中。

$ read att
abc
$ echo $att
abc
$ read -p "please input:" -t 10 att
  1. declare 用来宣告变量的类型,如果 declare 后面没有接任何参数,它会像 set 一样显示出所有变量内容。

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"
  1. array 阵列,即数组。

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

    第六栏表示这个文件的创建日期或者是最近的修改日期

    第七栏表示这个文件的名称,. 开头的代表此文件为“隐藏文件”

更改文件属性和权限

  1. chgrp:改变文件所属群组 change group 。被改变的群组名称必须要在 /etc/group 文件内存在

  2. chown:改变文件所有者 change owner。owner 必须是已经存在系统中的账号,也就是在 /etc/passwd 这个文件中有记录的 owner 名称,才能改变

  3. 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
    

目录权限

  1. r(read contents in directory)可以读取该目录下的文件名,即通过 ls 将该目录的内容列表显示出来

  2. w(modify contents of directory) 包括:创建新的文件与目录;删除已经存在的文件与目录(不论该文件的权限为何!);将已经存在的文件或目录进行更名;搬移该目录内的文件、目录位置等等。

  3. x(access directory)代表的是使用者可以进入该目录,其能够成为工作目录。

    要开放目录给任何人浏览时,应该至少也要给与 r 及 x 的权限,但 w 权限不可随便给;

    能否读取到某个文件内容,跟该文件所在的目录权限也有关系(目录至少需要有 x 的权限)。

文件和目录的默认权限

      默认情况下:

  1. 当使用者创建文件时,默认没有可执行(x)权限,亦即只有 rw 这两个权限,也就是最大为 666,故默认权限为:-rw-rw-rw-

  2. 当使用者创建目录时,由于 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/

文件隐藏属性

  1. chattr(设置文件隐藏属性) change attribute。使用方法:chattr [±=][ASacdistu] 文件或目录名称。通常使用的选项参数为 +/- i 或者 +/- a。

      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
  1. lsattr(显示文件隐藏属性)

  2. file(观察文件类型)

实体链接和符号链接

  1. 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 链接到目录时,链接的数据需要连同被链接目录下面的所有数据都创建链接,这样造成的复杂度很高,故不支持!

  2. 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设置文件相关系统资源

      ulimit [-SHacdfltu] [配额]

      选项和参数:

  1. -H:hard limit,严格设置,不可超过此值

  2. -S:soft limit,警告设置,超过此值时会有警告信息提示。

  3. -a:后面不接任何选项和参数,可以列出所有的限制额度

  4. -c:当程序发生错误时,系统可能会将该程序在内存中的信息写成文件,这种文件被称为核心文件(core file)。此参数用来设置核心文件的最大容量

  5. -f:此 shell 可以创建的最大文件大小(一般可设置为2GB),单位为KBytes

  6. -d:程序可使用的最大段(segment)容量

  7. -l:可用于锁定(lock)的内存量

  8. -t:可使用的最大 CPU 时间,单位为妙

  9. -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(移动文件与目录,或重命名)

可执行文件路径的变量:PATH

      查阅文件属性的指令 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 的文件。

你可能感兴趣的:(Linux,linux)