【Linux】《The Command Line Handbook》 读书笔记(下半部分)
前言
这篇博客介绍的命令确实比较多,并且受到平台字数影响,拆分为上下两个部分。
与其说是读书笔记,实际上更像是学学英语顺带学学Linux命令。这本书是通过每天挤一点时间边看边学边敲完成的,每天日常翻翻所以顺序和原始博客网站优点不一样。
个人起初看这个“书”的时候PDF还是免费开放的,不过现在博主已经转为收费了,但是在线版本依然免费对外公开。
此外英文博主还出过很多小而美的初级教程,英文用词和语法都比较简单,非常适合像我一样词汇量薄弱的人看看。
这个教程对于一些简单的Linux入门是用是非常足够,话不多说我们直接开始。
英文博客网址
网址:https://thevalleyofcode.com/linux/#54-traceroute
在最近的更新当中,作者改名并且把书名改为了《The Command Line Handbook》,在线网址如下:flaviocopes.com
介绍
Linux是操作系统,和MacOs和Windows没什么区别。Linux“核心”(称为内核)于 1991 年在芬兰诞生,从其不起眼的开始经历了很长的路要走。它继续成为 GNU 操作系统的内核,创建了双核 GNU/Linux。
相比Windows和MacOs系统不同的是,Linux是永久免费的。如果你使用Mac,你需要知道macOS是一个UNIX操作系统,它与GNU/Linux系统有很多相共同的思想,Shell命令也甚至部分软件可以直接兼容,因为GNU/Linux是基于UNIX开源的。
而如果使用Windows,则提供了Windows Subsystem for Linux 来实现运行Linux的相关内容。但是个人并不推荐是用WSL来学习Linux命令。(更推荐虚拟机)
绝大多数下使用Linux是在VPS (Virtual Private Server) 等环境当中,Linux提供了shell来执行脚本或者文本来执行一系列操作。同时shell 允许以比 GUI(图形用户界面)更优化的方式执行操作。命令行工具可以提供许多不同的配置选项,并且使用过程中并不会特别复杂。
最后注意,博主用的是Mac电脑编写的笔记,部分命令在CenterOs系统和Ubuntu不一定适用,请以个人实验效果为准。
chmod
每个linux操作系统都具备三个权限,读取,写入,执行。
因为linux一切皆文件理念,可以发现这些设计和文件系统的常见操作如出一辙。
使用命令ls -al
可以列表查看目录所有文件,并且获取所有文件的读写权限。
ubuntu@VM-8-8-ubuntu:~$ ls -al
total 152
drwxr-x--- 11 ubuntu ubuntu 4096 Apr 2 12:09 .
drwxr-xr-x 4 root root 4096 Nov 10 07:16 ..
-rw-rw-r-- 1 ubuntu ubuntu 0 Mar 25 11:15 ''$'\033''[200~recipes.txt~'
-rw-rw-r-- 1 ubuntu ubuntu 10240 Mar 25 14:45 archive.tar
-rw------- 1 ubuntu ubuntu 11962 Apr 2 12:11 .bash_history
-rw-r--r-- 1 ubuntu ubuntu 220 Jan 7 2022 .bash_logout
-rw-r--r-- 1 ubuntu ubuntu 3771 Jan 7 2022 .bashrc
drwx------ 2 ubuntu ubuntu 4096 May 18 2022 .cache
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 25 16:51 compress
drwxr-xr-x 4 ubuntu ubuntu 4096 Mar 16 13:05 .config
drwxrwxr-x 4 ubuntu ubuntu 4096 Mar 26 21:32 current
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 27 21:42 dif
-rw-rw-r-- 1 ubuntu ubuntu 131 Mar 15 09:38 error.txt
rwx
代表所有的文件操作抽象,也是对于文件操作权限抽象,r 代表读取,w 代表吸入,x 代表运行。chmod 的特殊用法如下:
chmode a+rwx test.txt
-a
:代表all。-u
:代表用户。-g
:代表用户组。-o
:代表第三方。
下面是对应的参考案例:
ubuntu@VM-8-8-ubuntu:~/current$ ll
total 28
drwxrwxrwx 4 ubuntu ubuntu 4096 Mar 26 21:32 ./
drwxrwxrwx 11 ubuntu ubuntu 4096 Apr 5 12:12 ../
-rw-rw-r-- 1 ubuntu ubuntu 80 Mar 26 20:55 merge.txt
-rw-rw-r-- 1 ubuntu ubuntu 105 Mar 26 21:10 merge.txt.save
-rw-rw-r-- 1 ubuntu ubuntu 107 Mar 26 21:32 merge.txt.save.1
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:18 test/
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:19 test2/
ubuntu@VM-8-8-ubuntu:~/current$ chmod a+rwx merge.txt
ubuntu@VM-8-8-ubuntu:~/current$ ll
total 28
drwxrwxrwx 4 ubuntu ubuntu 4096 Mar 26 21:32 ./
drwxrwxrwx 11 ubuntu ubuntu 4096 Apr 5 12:12 ../
-rwxrwxrwx 1 ubuntu ubuntu 80 Mar 26 20:55 merge.txt*
-rw-rw-r-- 1 ubuntu ubuntu 105 Mar 26 21:10 merge.txt.save
-rw-rw-r-- 1 ubuntu ubuntu 107 Mar 26 21:32 merge.txt.save.1
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:18 test/
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:19 test2/
还有一种方式是通过数字加减权限,也是更为常用的方式,抛弃其他一切介绍,我们只需要知道Linux系统规定权限的最大值为7,这个7可以拆分为运行、写入、读取
,1:为运行,权限最小,
2:为写入。
4:为读取
如果我们想要给某个文件所有的用户读取写入和执行的权限,可以是用chmod 777
的命令简单的方式分配权限。
第一个 7 对应 u。
第二个 7 对应 g。
最后的 7 对应 other。
ubuntu@VM-8-8-ubuntu:~/current$ ll
total 28
drwxrwxrwx 4 ubuntu ubuntu 4096 Mar 26 21:32 ./
drwxrwxrwx 11 ubuntu ubuntu 4096 Apr 5 12:12 ../
-rwxrwxrwx 1 ubuntu ubuntu 80 Mar 26 20:55 merge.txt*
-rw-rw-r-- 1 ubuntu ubuntu 105 Mar 26 21:10 merge.txt.save
-rw-rw-r-- 1 ubuntu ubuntu 107 Mar 26 21:32 merge.txt.save.1
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:18 test/
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:19 test2/
ubuntu@VM-8-8-ubuntu:~/current$ chmod 777 merge.txt.save
ubuntu@VM-8-8-ubuntu:~/current$ ll
total 28
drwxrwxrwx 4 ubuntu ubuntu 4096 Mar 26 21:32 ./
drwxrwxrwx 11 ubuntu ubuntu 4096 Apr 5 12:12 ../
-rwxrwxrwx 1 ubuntu ubuntu 80 Mar 26 20:55 merge.txt*
-rwxrwxrwx 1 ubuntu ubuntu 105 Mar 26 21:10 merge.txt.save*
-rw-rw-r-- 1 ubuntu ubuntu 107 Mar 26 21:32 merge.txt.save.1
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:18 test/
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:19 test2/
rwx
还是是用数字的方式分配权限,每个人可以根据自己的习惯使用,个人认为数字的方式比字母的方式更加易懂一些。
sort
排序命令sort命令通常是文件排序使用,默认按照字段顺序进行排序。
ubuntu@VM-8-8-ubuntu:~$ ls -al | sort
drwx------ 2 ubuntu ubuntu 4096 Dec 27 14:21 .ssh
drwx------ 2 ubuntu ubuntu 4096 May 18 2022 .cache
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 25 16:51 compress
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 27 21:42 dif
drwxrwxr-x 2 ubuntu ubuntu 4096 May 18 2022 .pip
drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 26 21:08 .local
drwxrwxr-x 4 ubuntu ubuntu 4096 Jan 28 10:02 .npm
drwxrwxr-x 4 ubuntu ubuntu 4096 Mar 26 21:32 current
drwxr-x--- 11 ubuntu ubuntu 4096 Apr 2 13:16 .
drwxr-xr-x 4 root root 4096 Nov 10 07:16 ..
drwxr-xr-x 4 ubuntu ubuntu 4096 Mar 16 13:05 .config
lrwxrwxrwx 1 ubuntu ubuntu 11 Mar 25 11:16 newrecipes.txt -> recipes.txt
-rw------- 1 ubuntu ubuntu 12081 Apr 2 13:18 .bash_history
-rw------- 1 ubuntu ubuntu 177 Apr 2 13:16 .Xauthority
-r
:可以逆序输出结果。
ubuntu@VM-8-8-ubuntu:~$ ls -al | sort -r
total 152
-rw-rw-r-- 1 ubuntu ubuntu 73 Nov 10 07:16 .pydistutils.cfg
-rw-rw-r-- 1 ubuntu ubuntu 49 Mar 14 13:13 testdata.txt.gz
-rw-rw-r-- 1 ubuntu ubuntu 42 Mar 29 07:59 test.txt
-rw-rw-r-- 1 ubuntu ubuntu 30 Mar 15 13:24 list2.txt.gz
-rw-rw-r-- 1 ubuntu ubuntu 23 Mar 14 13:06 testdata2.txt
-rw-rw-r-- 1 ubuntu ubuntu 22 Mar 26 20:16 testdata.txt
-ignore-case
:参数忽略大小写。
ubuntu@VM-8-8-ubuntu:~$ ls -al | sort -r --ignore-case
-n
: 参数是进行数字顺序排序。
ubuntu@VM-8-8-ubuntu:~$ ls -al | sort -n
drwx------ 2 ubuntu ubuntu 4096 Dec 27 14:21 .ssh
drwx------ 2 ubuntu ubuntu 4096 May 18 2022 .cache
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 25 16:51 compress
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 27 21:42 dif
drwxrwxr-x 2 ubuntu ubuntu 4096 May 18 2022 .pip
drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 26 21:08 .local
drwxrwxr-x 4 ubuntu ubuntu 4096 Jan 28 10:02 .npm
drwxrwxr-x 4 ubuntu ubuntu 4096 Mar 26 21:32 current
drwxr-x--- 11 ubuntu ubuntu 4096 Apr 2 13:16 .
drwxr-xr-x 4 root root 4096 Nov 10 07:16 ..
-u
:参数返回不重复的结果。
ubuntu@VM-8-8-ubuntu:~$ ls -al | sort -u
ubuntu@VM-8-8-ubuntu:~$ ls -al | sort -u
drwx------ 2 ubuntu ubuntu 4096 Dec 27 14:21 .ssh
drwx------ 2 ubuntu ubuntu 4096 May 18 2022 .cache
drwxrwxrwx 11 ubuntu ubuntu 4096 Apr 5 20:37 .
drwxrwxrwx 4 root ubuntu 4096 Mar 26 21:32 current
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 25 16:51 compress
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 27 21:42 difff
drwxrwxr-x 2 ubuntu ubuntu 4096 May 18 2022 .pip
drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 26 21:08 .local
drwxrwxr-x 4 ubuntu ubuntu 4096 Jan 28 10:02 .npm
uniq
和名字一样是对于文件排序过滤掉重复数据,可以用在单独命令,也可以用在管道符号当中配合其他命令使用。
uniq dogs.txt
ls | uniq
如果用在文件内容当中,会返回唯一的结果。
ubuntu@VM-8-8-ubuntu:~/current$ cat ../testdata.txt
abcdefg
hijklmn
aa
aa
ubuntu@VM-8-8-ubuntu:~/current$ uniq ../testdata.txt
abcdefg
hijklmn
aa
如果用在文件夹当中,则返回不重复的文件。
ubuntu@VM-8-8-ubuntu:~/current$ ls .. | uniq
recipes.txt~
archive.tar
compress
current
error.txt
list2.txt
list2.txt.gz
list.txt.gz
newrecipes.txt
otherfile2.txt
otherfile.txt
testdata2.txt
testdata.txt
下面的命令和sort配合,排序之后过滤重复数据:
sort dogs.txt | uniq
ubuntu@VM-8-8-ubuntu:~/current$ uniq ../testdata.txt
abcdefg
hijklmn
aa
ubuntu@VM-8-8-ubuntu:~/current$ uniq ../testdata.txt | sort
aa
abcdefg
hijklmn
他的效果和sort
命令的-n
参数是一样的。
ubuntu@VM-8-8-ubuntu:~/current$ sort -u ../testdata.txt
aa
abcdefg
hijklmn
ubuntu@VM-8-8-ubuntu:~/current$ uniq ../testdata.txt | sort
aa
abcdefg
hijklmn
-d
参数可以打印unqi当中的重复数据。
ubuntu@VM-8-8-ubuntu:~/current$ uniq ../testdata.txt | sort
aa
abcdefg
hijklmn
ubuntu@VM-8-8-ubuntu:~/current$ uniq -d ../testdata.txt | sort
aa
-u
参数是打印没有重复的数据。
ubuntu@VM-8-8-ubuntu:~/current$ uniq ../testdata.txt | sort
aa
abcdefg
hijklmn
ubuntu@VM-8-8-ubuntu:~/current$ uniq -u ../testdata.txt | sort
abcdefg
hijklmn
-c
参数可以打印unqi当中重复数据的细节,比如下面通过显示数字表示重复的次数。
ubuntu@VM-8-8-ubuntu:~/current$ sort ../testdata.txt | uniq -c
2 aa
1 abcdefg
1 hijklmn
最后是一段组合参数,常用于文件搜索。
ubuntu@VM-8-8-ubuntu:~/current$ sort ../testdata.txt | uniq -c | sort -nr
2 aa
1 hijklmn
1 abcdefg
diff
类似个人比较常用的 BeCompare类似,可以通过命令对比两个文件不同。首先准备两个文件,内容如下:
ubuntu@VM-8-8-ubuntu:~/dif$ cat a.txt
aaaaa
12345
bbbbb
ccccc
ubuntu@VM-8-8-ubuntu:~/dif$ cat compare_a.txt
bbbbb
ccccc
aaaaa
直接不带任何参数使用此命令:
ubuntu@VM-8-8-ubuntu:~/dif$ diff compare_a.txt a.txt
4c4
<
---
> ccccc
上面的命令会告诉你第四行去少一行c
。如果颠倒一下文件比较顺序,那么结果也会颠倒一下:
ubuntu@VM-8-8-ubuntu:~/dif$ diff a.txt compare_a.txt
4c4
< ccccc
---
>
-y
参数可以逐行对比数据,这样的对比要直观很多,也更像BeCompare
:
ubuntu@VM-8-8-ubuntu:~/dif$ diff -y a.txt compare_a.txt
aaaaa aaaaa
12345 12345
bbbbb bbbbb
ccccc |
-u
参数可以像是git的界面一样对比两个文件,也非常有意思。
ubuntu@VM-8-8-ubuntu:~/dif$ diff -u a.txt compare_a.txt
--- a.txt 2023-03-27 21:36:05.656000000 +0800
+++ compare_a.txt 2023-03-27 21:42:08.936000000 +0800
@@ -1,4 +1,4 @@
aaaaa
12345
bbbbb
-ccccc
+
-rq
参数组合可以只显示两个文件是否存在区别。
ubuntu@VM-8-8-ubuntu:~/dif$ diff -rq a.txt compare_a.txt
Files a.txt and compare_a.txt differ
echo
和单词意思一样只干一件事:打印,打印你想要的内容。
ubuntu@VM-8-8-ubuntu:~$ echo "hello"
hello
双右尖括号可以把打印内容重定向到一个磁盘文件:
ubuntu@VM-8-8-ubuntu:~$ echo "hello" >> echoresult.txt
ubuntu@VM-8-8-ubuntu:~$ cat echoresult.txt
hello
$
变量名称可以打印系统参数或者环境变量,当然也可以脚本自定义参数。
ubuntu@VM-8-8-ubuntu:~$ echo "The path variable is $PATH"
The path variable is /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
如果只是要单纯打印$需要反斜杠转义。
请注意,特殊字符需要用反斜杠\
转义,例如$
:
ubuntu@VM-8-8-ubuntu:~$ echo the cost is \$5
the cost is $5
echo
也可以用于打印当前目录文件:
ubuntu@VM-8-8-ubuntu:~$ echo *
recipes.txt~ archive.tar compress current dif echoresult.txt error.txt list2.txt list2.txt.gz list.txt.gz newrecipes.txt otherfile2.txt otherfile.txt testdata2.txt testdata.txt testdata.txt.gz test.txt
正则输出,打印家目录都可以。
ubuntu@VM-8-8-ubuntu:~$ echo o*
otherfile2.txt otherfile.txt
ubuntu@VM-8-8-ubuntu:~$ echo ~
/home/ubuntu
echo $(ls -al)
可以打印命令的结果:
echo $(ls -al)
ubuntu@VM-8-8-ubuntu:~$ echo $(ls -al)
total 160 drwxr-x--- 11 ubuntu ubuntu 4096 Apr 2 13:35 . drwxr-xr-x 4 root root 4096 Nov 10 07:16 .. -rw-rw-r-- 1 ubuntu ubuntu 0 Mar 25 11:15 recipes.txt~ -rw-rw-r-- 1 ubuntu ubuntu 10240 Mar 25 14:45 archive.tar -rw------- 1 ubuntu ubuntu 12577 Apr 2 14:00 .bash_history -rw-r--r-- 1 ubuntu ubuntu 220 Jan 7 2022 .bash_logout -rw-r--r-- 1 ubuntu ubuntu 3771 Jan 7 2022 .bashrc drwx------ 2 ubuntu ubuntu 4096 May 18 2022 .cache drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 25 16:51 compress drwxr-xr-x 4 ubuntu ubuntu 4096 Mar 16 13:05 .config drwxrwxr-x 4 ubuntu ubuntu 4096 Mar 26 21:32 current drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 27 21:42 dif -rw-rw-r-- 1 ubuntu ubuntu 6 Apr 2 13:35 echoresult.txt -rw-rw-r-- 1 ubuntu ubuntu 131 Mar 15 09:38 error.txt -rw------- 1 ubuntu ubuntu 20 Mar 26 21:13 .lesshst -rw-rw-r-- 1 ubuntu ubuntu 0 Mar 15 13:24 list2.txt -rw-rw-r-- 1 ubuntu ubuntu 30 Mar 15 13:24 list2.txt.gz -rw-rw-r-- 1 ubuntu ubuntu 114 Mar 15 13:25 list.txt.gz drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 26 21:08 .local lrwxrwxrwx 1 ubuntu ubuntu 11 Mar 25 11:16 newrecipes.txt -> recipes.txt drwxrwxr-x 4 ubuntu ubuntu 4096 Jan 28 10:02 .npm -rw-rw-r-- 1 ubuntu ubuntu 16 Mar 15 09:28 otherfile2.txt -rw-rw-r-- 1 ubuntu ubuntu 16 Mar 14 13:28 otherfile.txt drwxrwxr-x 2 ubuntu ubuntu 4096 May 18 2022 .pip -rw-r--r-- 1 ubuntu ubuntu 807 Jan 7 2022 .profile -rw-rw-r-- 1 ubuntu ubuntu 73 Nov 10 07:16 .pydistutils.cfg drwx------ 2 ubuntu ubuntu 4096 Dec 27 14:21 .ssh -rw-r--r-- 1 ubuntu ubuntu 0 Jan 24 22:53 .sudo_as_admin_successful -rw-rw-r-- 1 ubuntu ubuntu 23 Mar 14 13:06 testdata2.txt -rw-rw-r-- 1 ubuntu ubuntu 22 Mar 26 20:16 testdata.txt -rw-rw-r-- 1 ubuntu ubuntu 49 Mar 14 13:13 testdata.txt.gz -rw-rw-r-- 1 ubuntu ubuntu 42 Mar 29 07:59 test.txt -rw-r--r-- 1 ubuntu ubuntu 12288 Mar 29 08:08 .test.txt.swp -rw------- 1 ubuntu ubuntu 8163 Mar 29 08:10 .viminfo -rw-rw-r-- 1 ubuntu ubuntu 165 Jan 28 10:57 .wget-hsts -rw------- 1 ubuntu ubuntu 177 Apr 2 13:16 .Xauthority
除此之外,echo还有一些特殊用法,echo {1..5}
打印1到5。
ubuntu@VM-8-8-ubuntu:~$ echo {1..5}
1 2 3 4 5
上面写法都是shell中比较常用的语法。
chown
这个命令的全称叫做change own,在 Linux 或 macOS 这样的操作系统中,每个文件/目录(以及一般的UNIX系统)都有所有者。
命令格式如下:
chown 用户名 文件
一个文件的所有者可以对它做任何事情,它可以决定文件的命运。所有者(和根用户)也可以使用chown
命令将所有者改为其他用户:
ubuntu@VM-8-8-ubuntu:~/current$ whoami
ubuntu
ubuntu@VM-8-8-ubuntu:~/current$ chown ubuntu ./merge.txt
ubuntu@VM-8-8-ubuntu:~/current$ chown root ./merge.txt
chown: changing ownership of './merge.txt': Operation not permitted
需要注意chown root xx
通常情况下是不被允许的,只有root有权限把文件的所有人变为自己,或者我们用sudo
命令转为root身份执行。
ubuntu@VM-8-8-ubuntu:~/current$ sudo chown root ./merge.txt
ubuntu@VM-8-8-ubuntu:~/current$ ll
total 28
drwxrwxrwx 4 ubuntu ubuntu 4096 Mar 26 21:32 ./
drwxrwxrwx 11 ubuntu ubuntu 4096 Apr 5 12:12 ../
-rwxrwxrwx 1 root ubuntu 80 Mar 26 20:55 merge.txt*
-rwxrwxrwx 1 ubuntu ubuntu 105 Mar 26 21:10 merge.txt.save*
-rw-rw-r-- 1 ubuntu ubuntu 107 Mar 26 21:32 merge.txt.save.1
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:18 test/
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:19 test2/
大部分操作系统中都存在文件所属和用户的概念,但是文件/目录不仅有一个所有者,它们也有所属组。通过下面的命令格式,你可以在改变所有者的同时改变它的所属组:
chown <owner>:<group> <file>
ubuntu@VM-8-8-ubuntu:~/current$ chown ubuntu:ubuntu merge.txt.save.1
如果要修改一整个文件夹的所属人和所属组,可以使用-R
参数。
ubuntu@VM-8-8-ubuntu:~$ ll current/
total 28
drwxrwxrwx 4 ubuntu ubuntu 4096 Mar 26 21:32 ./
drwxrwxrwx 11 ubuntu ubuntu 4096 Apr 5 16:07 ../
-rwxrwxrwx 1 ubuntu ubuntu 80 Mar 26 20:55 merge.txt*
-rwxrwxrwx 1 ubuntu ubuntu 105 Mar 26 21:10 merge.txt.save*
-rw-rw-r-- 1 ubuntu ubuntu 107 Mar 26 21:32 merge.txt.save.1
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:18 test/
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 26 20:19 test2/
ubuntu@VM-8-8-ubuntu:~$ sudo chown root -R ./current
ubuntu@VM-8-8-ubuntu:~$ ll current/
total 28
drwxrwxrwx 4 root ubuntu 4096 Mar 26 21:32 ./
drwxrwxrwx 11 ubuntu ubuntu 4096 Apr 5 16:07 ../
-rwxrwxrwx 1 root ubuntu 80 Mar 26 20:55 merge.txt*
-rwxrwxrwx 1 root ubuntu 105 Mar 26 21:10 merge.txt.save*
-rw-rw-r-- 1 root ubuntu 107 Mar 26 21:32 merge.txt.save.1
drwxrwxr-x 2 root ubuntu 4096 Mar 26 20:18 test/
drwxrwxr-x 2 root ubuntu 4096 Mar 26 20:19 test2/
用户名:用户组
可以修改用户组,chgrp也是一样的效果。
chgrp <group> <filename>
umask
umask意思是说在你创建文件之前系统自动给予创建文件的默认权限。直接使用umask命令,可以看到0022的标记,0002也是比较常见的设置。
ubuntu@VM-8-8-ubuntu:~$ umask
0002
0022通常代表:拥有者用户有全部权限,用户组可以读写,不能执行,其他人只能看。
这里有一个列表,对应的数字以意义,后面三个数字分别对应拥有人、所属组、其他:
0 读、写、执行
1 读和写
2 读和执行
3 只读
4 写和执行
5 只写
6 只执行
7 无权限
0002中的第一个数字比较特殊,这几个数字通常对应了后面三个数字。对应的我们只需要umask 002
这样的写法修改后面三位数字修改umask权限。
ubuntu@VM-8-8-ubuntu:~$ umask 002
ubuntu@VM-8-8-ubuntu:~$ umask
0002
从这些数字可以看出,修改umas
k类似chmod的写法,但是umask是刚好反过来的,0权限最大,7权限最小。
这里可能有疑问前面第一位数字是什么?本着只学有用的内容原则,我们不需要关心。
du
作用:计算文件夹大小。
du *
遍历(当前目录)所有文件夹并且计算总大小,大小单位是字节。
ubuntu@VM-8-8-ubuntu:~$ du *
0 recipes.txt~
12 archive.tar
16 compress
4 current/test
4 current/test2
24 current
12 dif
4 error.txt
0 list2.txt
4 list2.txt.gz
4 list.txt.gz
0 newrecipes.txt
4 otherfile2.txt
4 otherfile.txt
4 testdata2.txt
4 testdata.txt
4 testdata.txt.gz
4 test.txt
-a
:参数遍历到每一个文件。
ubuntu@VM-8-8-ubuntu:~$ du -a *
0 recipes.txt~
12 archive.tar
4 compress/list2.txt.gz
4 compress/aaa.txt
4 compress/list.txt.gz
16 compress
4 current/merge.txt.save.1
4 current/merge.txt
4 current/merge.txt.save
4 current/test
4 current/test2
24 current
4 dif/compare_a.txt
4 dif/a.txt
12 dif
4 error.txt
0 list2.txt
4 list2.txt.gz
4 list.txt.gz
0 newrecipes.txt
4 otherfile2.txt
4 otherfile.txt
4 testdata2.txt
4 testdata.txt
4 testdata.txt.gz
4 test.txt
-h
:用于一个最大的可读的标记展示大小,比如Linux一个读写是 4kb。
ubuntu@VM-8-8-ubuntu:~$ du -h *
0 recipes.txt~
12K archive.tar
16K compress
4.0K current/test
4.0K current/test2
24K current
12K dif
4.0K error.txt
0 list2.txt
4.0K list2.txt.gz
4.0K list.txt.gz
0 newrecipes.txt
4.0K otherfile2.txt
4.0K otherfile.txt
4.0K testdata2.txt
4.0K testdata.txt
4.0K testdata.txt.gz
4.0K test.txt
-ah
参数通常配合一起用于看每一个文件大小。
xander@xander:~$ du -ah *
4.0K demo2.sh
4.0K demo-arges.sh
4.0K error.txt
4.0K func-args.sh
4.0K log.txt
4.0K tesgt
如果想要想要用其他的单位计算文件大小,可以使用下面的命令。
ubuntu@VM-8-8-ubuntu:~$ du -m *
0 recipes.txt~
1 archive.tar
1 compress
1 current/test
1 current/test2
1 current
1 dif
1 error.txt
0 list2.txt
1 list2.txt.gz
1 list.txt.gz
0 newrecipes.txt
1 otherfile2.txt
1 otherfile.txt
1 testdata2.txt
1 testdata.txt
1 testdata.txt.gz
1 test.txt
从大到小打印文件。
ubuntu@VM-8-8-ubuntu:~$ du -ah | sort -nr | head
880K ./.npm/_cacache/index-v5
240K ./.npm/_cacache/content-v2/sha512/46
220K ./.config/cheat/cheatsheets/community/.git
212K ./.npm/_cacache/content-v2/sha512/55
208K ./.npm/_cacache/content-v2/sha512/55/2f
204K ./.npm/_cacache/content-v2/sha512/55/2f/5e0e35de2cf59c21f42175d90c6fcee84dbbb18295027bc011f4668bcf344beb7ee179507f8fda53eb338d0de387d7e8ee1d52219b6590a3ce23cb00b8fb
196K ./.npm/_cacache/content-v2/sha512/f1
152K ./.config/cheat/cheatsheets/community/.git/objects
148K ./.npm/_cacache/content-v2/sha512/34
148K ./.npm/_cacache/content-v2/sha512/27
最后是个人的一些其他实验。
Shell
xander@xander:~$ du *
4 demo2.sh
4 demo-arges.sh
4 error.txt
4 func-args.sh
4 log.txt
xander@xander:~$ du -a *
4 demo2.sh
4 demo-arges.sh
4 error.txt
4 func-args.sh
4 log.txt
xander@xander:~$ mkdir tesgt
xander@xander:~$ du -a *
4 demo2.sh
4 demo-arges.sh
4 error.txt
4 func-args.sh
4 log.txt
4 tesgt
xander@xander:~$ du -ah *
4.0K demo2.sh
4.0K demo-arges.sh
4.0K error.txt
4.0K func-args.sh
4.0K log.txt
4.0K tesgt
# df
此命令是查看当前的磁盘空间。
`df -h`:常用。查看当前磁盘的所有信息。
`df 磁盘名称`:可以查看某个磁盘的详情。
## df -h
`df -h` 可以查看当前系统的磁盘空间占用情况。
xander@xander:~$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 389M 1.7M 388M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 14G 7.4G 5.6G 58% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 2.0G 251M 1.6G 14% /boot
tmpfs 389M 4.0K 389M 1% /run/user/1000
xander@xander:~$ df tmpfs
df: tmpfs: No such file or directory
xander@xander:~$ df /dev/sda2
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 1992552 256924 1614388 14% /boot
xander@xander:~$ df -h /dev/sda2
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 2.0G 251M 1.6G 14% /boot
查看某个磁盘信息,带入对应的磁盘名称即可。
ubuntu@VM-8-8-ubuntu:~$ df -h /dev/vda2
Filesystem Size Used Avail Use% Mounted on
/dev/vda2 40G 9.6G 28G 26% /
# basename
基本用途是返回文件路径所在的最后一层文件夹,如果是文件的绝对路径名称,则直接显示文件名。
xander@xander:~$ basename /usr/local/bin/
bin
xander@xander:~$ basename /home/xander/demo2.sh
demo2.sh
# dirname
和`basename`命令有点类似,如果是文件的绝对路径,截取到当前所在文件夹的路径部分:
xander@xander:~$ dirname /home/xander/demo2.sh
/home/xander
# ps
ps是使用频率极高的命令,可以使用ps命令查看当前运行的所有程序,不使用任何参数的`ps`命令是查看当前用户当前正在运行的启动线程。
xander@xander:~$ ps
PID TTY TIME CMD
15178 pts/0 00:00:00 bash
15334 pts/0 00:00:00 ps
## `ps ax`
`ps` 要看所有的用户进程或者系统进程,需要配合`option`参数使用。作者在这里介绍了`ps ax`的常用用法:
xander@xander:~$ ps
PID TTY TIME CMD
15178 pts/0 00:00:00 bash
15333 pts/0 00:00:00 ps
xander@xander:~$ ps
PID TTY TIME CMD
15178 pts/0 00:00:00 bash
15334 pts/0 00:00:00 ps
xander@xander:~$ ps ax
.....
936 ? Ss 0:00 /lib/systemd/systemd-logind
938 ? Ssl 0:00 /usr/libexec/udisks2/udisksd
957 tty1 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
980 ? Ssl 0:00 /usr/sbin/ModemManager
981 ? Ss 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startup
995 ? Ssl 0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unatte
1242 ? S 0:00 bpfilter_umh
1932 ? Ssl 0:02 dockerd --group docker --exec-root=/run/snap.docker --
2026 ? Ssl 0:16 containerd --config /run/snap.docker/containerd/contai
13649 ? Ssl 0:00 /usr/libexec/packagekitd
15067 ? Ss 0:00 sshd: xander [priv]
15070 ? Ss 0:00 /lib/systemd/systemd --user
15072 ? S 0:00 (sd-pam)
15175 ? R 0:00 sshd: xander@pts/0
15178 pts/0 Ss 0:00 -bash
15219 ? I 0:02 [kworker/1:1-events]
15314 ? I 0:00 [kworker/u256:2-events_power_efficient]
15316 ? I 0:00 [kworker/1:0-cgroup_destroy]
15317 ? I 0:00 [kworker/0:0-mm_percpu_wq]
15319 ? I 0:00 [kworker/0:2-events]
15327 ? I 0:00 [kworker/u256:1-events_power_efficient]
15332 ? I 0:00 [kworker/u256:0-events_unbound]
`-a` 参数可以查看当前所有用户的进程,`-x` 参数可以展示任意的所有非link终端(没有控制终端)的进程。
## `ps axww`
使用`ps axww`命令,在新的一行继续列出命令而不是将其剪掉。
xander@xander:~$ ps axww
...
936 ? Ss 0:00 /lib/systemd/systemd-logind
938 ? Ssl 0:00 /usr/libexec/udisks2/udisksd
957 tty1 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
980 ? Ssl 0:00 /usr/sbin/ModemManager
981 ? Ss 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
995 ? Ssl 0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
1242 ? S 0:00 bpfilter_umh
1932 ? Ssl 0:02 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/run/snap.docker/docker.pid --config-file=/var/snap/docker/2746/config/daemon.json
2026 ? Ssl 0:23 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
13649 ? Ssl 0:00 /usr/libexec/packagekitd
15067 ? Ss 0:00 sshd: xander [priv]
15070 ? Ss 0:00 /lib/systemd/systemd --user
15072 ? S 0:00 (sd-pam)
15175 ? R 0:00 sshd: xander@pts/0
15178 pts/0 Ss 0:00 -bash
15219 ? I 0:04 [kworker/1:1-mm_percpu_wq]
15316 ? I 0:00 [kworker/1:0-cgroup_destroy]
15317 ? I 0:00 [kworker/0:0-mm_percpu_wq]
15319 ? I 0:02 [kworker/0:2-mm_percpu_wq]
15332 ? I 0:00 [kworker/u256:0-events_unbound]
15338 ? I 0:00 [kworker/u256:2-events_unbound]
15356 ? I 0:00 [kworker/u256:1-events_unbound]
15358 pts/0 R+ 0:00 ps axww
## `ps axww | grep bash`
需要注意`ps ax`的缺陷是会把较长的命令直接裁剪掉。我们可以通过`ps axww` 查看完整的内容。
@xander:~ ps axww | grep bashsh
15178 pts/0 Ss 0:00 -bash
15379 pts/0 S+ 0:00 grep --color=auto bash
下面是案例:
ubuntu@VM-8-8-ubuntu:~$ ps axww
PID TTY STAT TIME COMMAND
1 ? Ss 5:47 /lib/systemd/systemd --system --deserialize 36
2 ? S 0:04 [kthreadd]
3 ? I< 0:00 [rcu_gp]
4 ? I< 0:00 [rcu_par_gp]
5 ? I< 0:00 [netns]
7 ? I< 0:00 [kworker/0:0H-events_highpri]
9 ? I< 0:00 [mm_percpu_wq]
10 ? S 0:00 [rcu_tasks_rude_]
11 ? S 0:00 [rcu_tasks_trace]
778 ? Ss 0:03 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
787 ? Ss 0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
793 ? Ssl 0:00 /usr/libexec/polkitd --no-debug
795 ? Ssl 4:18 /usr/sbin/rsyslogd -n -iNONE
807 ? Ss 0:12 /lib/systemd/systemd-logind
872 ? Ssl 0:00 /usr/sbin/ModemManager
951 ? Ssl 0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
1098 ttyS0 Ss+ 0:00 /sbin/agetty -o -p -- \u --keep-baud 115200,57600,38400,9600 ttyS0 vt220
1100 tty1 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
1348 ? Sl 1:01 /usr/local/qcloud/stargate/bin/sgagent -d
但是我们会发现`ps axww`的内容非常多,我们可以使用管道符配合其他命令进行筛选。
ps axww | grep "Visual Studio Code"
## 参数解释
**PID**:进程ID,拿到进程ID我们可以对于进程发送信号做一系列操作,比如`kill`掉。
**TTY**:使用的终端ID,比如`pts/0`。
**S**:告诉我们过程的状态:`STAT`。这里的多个字符 `Ss`关键在于第二个字符的含义。
> \+s含义:在其终端中表示该进程处于前台。并且是该进程是一个会话领导者。
**TIME**:进程运行了多长时间 ,0:00
# top
该命令用于显示系统中运行进程的动态实时信息,top是非常实用的命令,使用起来非常简单。
top - 02:21:18 up 1:56, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 212 total, 1 running, 211 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3889.8 total, 1159.4 free, 414.5 used, 2315.9 buff/cache
MiB Swap: 2860.0 total, 2860.0 free, 0.0 used. 3200.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2026 root 20 0 1279536 43780 31944 S 0.3 1.1 0:31.00 containerd
1 root 20 0 167768 13240 8300 S 0.0 0.3 0:07.83 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 slub_flushwq
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-events_highpri
10 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_rude_
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_trace
13 root 20 0 0 0 0 S 0.0 0.0 0:00.26 ksoftirqd/0
14 root 20 0 0 0 0 I 0.0 0.0 0:01.76 rcu_sched
15 root rt 0 0 0 0 S 0.0 0.0 0:00.08 migration/0
16 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/0
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
20 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_inject/1
21 root rt 0 0 0 0 S 0.0 0.0 0:00.98 migration/1
22 root 20 0 0 0 0 S 0.0 0.0 0:00.35 ksoftirqd/1
24 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H-events_highpri
25 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
26 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 inet_frag_wq
27 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kauditd
29 root 20 0 0 0 0 S 0.0 0.0 0:00.01 khungtaskd
30 root 20 0 0 0 0 S 0.0 0.0 0:00.00 oom_reaper
31 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 writeback
32 root 20 0 0 0 0 S 0.0 0.0 0:00.42 kcompactd0
33 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd
执行top命令之后,top会实时监听,可以通过`ctrl+c`的方式强制退出。
## top -o %MEM
如上所示,占用最多内存和CPU的进程列表不断被更新。
默认情况下,正如从突出显示的那一栏所看到的,它们是按所使用的**CPU(占用)排序**的。
如果想要换成按照占用的内存排序,可以使用下面的命令。
top -o mem
具体的案例如下:
xander@xander:~$ top -o %MEM
top - 02:24:30 up 1:59, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 212 total, 1 running, 211 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3889.8 total, 1159.4 free, 414.5 used, 2315.9 buff/cache
MiB Swap: 2860.0 total, 2860.0 free, 0.0 used. 3200.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1932 root 20 0 1411224 66668 47308 S 0.0 1.7 0:02.97 dockerd
934 root 20 0 1022948 54380 20692 S 0.0 1.4 0:14.22 snapd
2026 root 20 0 1279536 43780 31944 S 0.3 1.1 0:31.82 containerd
560 root rt 0 354884 27360 9072 S 0.0 0.7 0:01.26 multipathd
995 root 20 0 109744 21436 13280 S 0.0 0.5 0:00.12 unattended-upgr
13649 root 20 0 295544 20808 17900 S 0.0 0.5 0:00.18 packagekitd
929 root 20 0 32796 18844 10204 S 0.0 0.5 0:00.20 networkd-dispat
516 root 19 -1 64224 14920 13788 S 0.0 0.4 0:00.54 systemd-journal
1 root 20 0 167768 13240 8300 S 0.0 0.3 0:07.83 systemd
938 root 20 0 392680 12768 10496 S 0.0 0.3 0:00.38 udisksd
909 systemd+ 20 0 25260 12356 8416 S 0.0 0.3 0:00.14 systemd-resolve
805 root 20 0 51128 11848 9880 S 0.0 0.3 0:00.07 VGAuthService
980 root 20 0 317004 11596 9756 S 0.0 0.3 0:00.14 ModemManager
15067 root 20 0 17180 10980 8804 S 0.0 0.3 0:00.09 sshd
15070 xander 20 0 17164 9720 7960 S 0.0 0.2 0:00.15 systemd
806 root 20 0 314904 9176 7568 S 0.0 0.2 0:11.81 vmtoolsd
981 root 20 0 15424 8756 7184 S 0.0 0.2 0:00.02 sshd
907 systemd+ 20 0 16244 8460 7420 S 0.0 0.2 0:00.13 systemd-network
15175 xander 20 0 17312 8216 5812 S 0.3 0.2 0:00.64 sshd
936 root 20 0 15332 7308 6344 S 0.0 0.2 0:00.20 systemd-logind
930 root 20 0 234484 6844 6212 S 0.0 0.2 0:00.03 polkitd
798 systemd+ 20 0 89356 6492 5688 S 0.0 0.2 0:00.12 systemd-timesyn
564 root 20 0 25884 6392 4248 S 0.0 0.2 0:00.51 systemd-udevd
931 syslog 20 0 222400 5856 4508 S 0.0 0.1 0:00.05 rsyslogd
15178 xander 20 0 8864 5704 3840 S 0.0 0.1 0:00.27 bash
15072 xander 20 0 170680 5228 16 S 0.0 0.1 0:00.00 (sd-pam)
921 message+ 20 0 8772 4972 4156 S 0.0 0.1 0:00.48 dbus-daemon
15394 xander 20 0 10636 4048 3188 R 0.3 0.1 0:00.02 top
927 root 20 0 82828 3804 3440 S 0.0 0.1 0:00.28 irqbalance
920 root 20 0 6892 2912 2672 S 0.0 0.1 0:00.02 cron
957 root 20 0 6172 1072 984 S 0.0 0.0 0:00.02 agetty
1242 root 20 0 2772 1024 936 S 0.0 0.0 0:00.01 bpfilter_umh
# grep
`grep`命令经常用于配合其他命令使用,它的关键作用是筛选和快速检索,也可以用于从其他的命令当中合并和过滤多个输出结果。
> 如果你想知道,grep代表全局正则表达式打印。
比如说在某个文件当中搜索需要的关键词:
ubuntu@VM-8-8-ubuntu:~$ cat /etc/profile | grep /bin
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
通过-`n`参数可以打印行号:
ubuntu@VM-8-8-ubuntu:~$ cat /etc/profile | grep -n /bin
5: if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
如果我们想要了解搜索结果的简短上下文来加深印象,可以加入"-C 上下文行数"参数(注意大写),下面的例子演示的是打印被搜索语句,以及对应的两行上下文信息。
ubuntu@VM-8-8-ubuntu:~$ cat /etc/profile | grep -n -C 2 /bin
3-
4-if [ "${PS1-}" ]; then
5: if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
6- # The file bash.bashrc already sets the default PS1.
7- # PS1='\h:\w$ '
# kill
Linux进程可以接收信号并对其作出反应。
这是我们与运行中的程序互动的一种方式。
杀死程序可以向一个程序发送各种信号。
它不仅仅是用来终止一个程序,就像它的名字所暗示的那样,但这是它的主要工作。
我们以这种方式使用它:
kill <PID>
这个**PID**可以通过`ps`命令来获取,比如我们日常是用的`ps -ef | grep xxx`这样的方式。
默认情况下,这将向指定的进程ID发送TERM信号。
我们可以发送各种信号标识通知其他的进程:
kill -HUP <PID>
kill -INT <PID>
kill -KILL <PID>
kill -TERM <PID>
kill -CONT <PID>
kill -STOP <PID>
HUP 意味着挂起。当启动一个进程的终端窗口在终止该进程之前被关闭时,它会自动发送。
INT 表示中断,它发送的信号与我们在终端中按下`ctrl-C`时所用的信号相同,通常会终止进程。
**KILL不是发给进程的,而是发给操作系统内核的**,内核收到响应之后立即停止并终止该进程。
TERM是终止的意思。进程会收到它并自行终止。这是kill发送的默认信号。
CONT表示继续。它可以用来恢复一个停止的进程。
STOP不是发给进程的,而是发给操作系统内核的,它立即停止(但不终止)进程。
你可能会看到用数字代替,比如`kill -1 <PID>`。在这种情况下、
1对应的是HUP。2对应的是INT。9对应的是KILL。15对应的是TERM。18对应的是CONT。15对应的是STOP。
# killall
killall命令主要是为多个进程发送信号量,也就是可以操作多个进程的关闭。比如你有多个top进程就可以使用Kill top的方式结束多个top进程。
`Kill HUP name`的方式通过信号量做特殊关闭操作,就像是使用Kill一样。killall几乎没什么用处,因为这个命令非常危险。
为了验证`killall` 命令,我们可以开启三个Shell,前面两个shell执行top命令,最后一个Shell执行killall 看看能否停止所有的top进程。
执行killall之后,可以看到前面两个shell都被停止了:
ubuntu@VM-8-8-ubuntu:~$ killall top
ubuntu@VM-8-8-ubuntu:~$
# jobs
jobs命令可以看到当前用户所有的后台进程,
我们可以通过`top &` 命令来开启一个后台进程,这样的写法非常有用。
ubuntu@VM-8-8-ubuntu:~$ top &
[1] 2431613
我们接着再新建一个后台进程,这里使用top -o MEM &
ubuntu@VM-8-8-ubuntu:~$ top -o %MEM &
[2] 2432106
我们可以使用`fg`命令**回到**后台程序。需要注意多个后台使用工作编号:fg 1, fg 2 等等才能正常切换。为了获得工作编号,我们使用 `jobs`命令。
通过执行fg命令,结果却提供错误信息`failed tty set: Interrupted system call`,,这个报错通常是在执行 top 命令时终端会话被意外中断。这种情况下 `top` 命令就会抛出 "tty set interrupted system call" 的错误。
ubuntu@VM-8-8-ubuntu:~$ fg
top -o %MEM
top: failed tty set: Interrupted system call
如何避免非交互模式下调用top命令报错问题?答案是使用 `-b` 的选项。但是使用`-b`选项会导致控制台一直打印信息。
> Starts top in Batch mode, which could be useful for sending output from top to other programs or to a file. In this mode, top will not accept input and runs until the iterations limit you\<A1>\<AF>ve set with the -n command-line option or until killed.
> 在批处理模式下启动top,这对于将top的输出发送到其他程序或文件中很有用。 在这种模式下,top 不接受输入,一直运行到你用 -n 命令行选项设置的迭代次数限制或被杀死为止。
现在我们可以用`fg <jobid>`切换回其中一个。要再次停止程序,我们可以点击cmd-Z。
当然因为top命令本身的限制,这里就不做演示了。
运行`jobs -l` 可以打印当前每个任务的进程ID。
ubuntu@VM-8-8-ubuntu:~$ jobs -l
# bg
bg命令用于恢复一个后台jobs任务,没有任何参数选项情况下,bg会是选择列表中的第一个后台进程进行恢复。
![image.png](https://adong-picture.oss-cn-shenzhen.aliyuncs.com/adong/20230405172818.png)
比如上面的命令就可以使用`bg 1`来恢复第一个执行任务。
# fg
当一个命令在后台运行时,因为你在结尾处用&启动它(例如:top &或者因为你用bg命令把它放在后台,你可以用fg把**后台任务放到前台**。
![image.png](https://adong-picture.oss-cn-shenzhen.aliyuncs.com/adong/20230405172900.png)
运行fg会把上一个被暂停的工作恢复到前台。运行fg2将恢复2号工作。
![image.png](https://adong-picture.oss-cn-shenzhen.aliyuncs.com/adong/20230405172912.png)
# type
一个命令可以是这4种类型中的一种:
- 可执行程序
- 内置程序
- shell函数
- 别名
type命令针对不同的内容会给出不同的提示,注意type是用于Linux命令的,如果 type 一个文件,会给出报错的提示:
[zxd@localhost ~]$ type top
top is /usr/bin/top
[zxd@localhost ~]$ type ls
ls is aliased to `ls --color=auto'
[zxd@localhost ~]$ type cd
cd is a shell builtin
[zxd@localhost ~]$ type pwd
pwd is a shell builtin
[zxd@localhost ~]$ type env
env is /usr/bin/env
# which
假设你有一个可以执行的命令,因为它在shell路径中,但你想知道它的位置。
[zxd@localhost ~]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls
which 命令只对存储在磁盘上的**可执行文件**起作用,而不是别名或内置的shell函数。
[zxd@localhost ~]$ which a.txt
/usr/bin/which: no a.txt in (/opt/maven-3.8.6/bin:/opt/jdk8/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/zxd/.local/bin:/home/zxd/bin)
那么如果是用户自定义的可执行文件呢?个人尝试了下,答案也是不行:
[zxd@localhost ~]$ ll
total 354368
-rwxrwxr-x 1 zxd zxd 8304 Oct 15 22:02 a.out
-rw-rw-r-- 1 zxd zxd 8760013 Jun 7 2022 apache-maven-3.8.6-bin.zip
-rw-rw-r-- 1 zxd zxd 1112 Jan 31 21:57 a.txt
-rw-rw-r-- 1 zxd zxd 10 Jan 31 21:59 b.txt
-rw-rw-r-- 1 zxd zxd 11 Jan 31 21:58 c.txt
-rw-rw-r-- 1 zxd zxd 15 Oct 15 22:01 hello.c
-rw-rw-r-- 1 zxd zxd 148003999 Mar 10 2022 jdk-8u331-linux-x64.tar.gz
-rw-rw-r-- 1 zxd zxd 71611122 Sep 10 2022 kafka_2.13-2.8.2.tgz
-rw-rw-r-- 1 zxd zxd 93566066 Dec 26 19:32 seata-server-1.6.1.tar.gz
-rw-rw-r-- 1 zxd zxd 41 Jan 31 23:29 ss.json
-rw-rw-r-- 1 zxd zxd 0 Jan 31 23:26 sss.json
-rw-r--r-- 1 root root 532315 Jan 22 00:15 sys_dump.sql
-rw-rw-r-- 1 zxd zxd 420 Jan 31 23:04 test.json
-rwxrwxr-x 1 zxd zxd 57 Feb 24 21:15 test.sh
-rw-rw-r-- 1 zxd zxd 37676320 Feb 12 15:29 zookeeper-3.4.14.tar_3.gz
-rw-rw-r-- 1 zxd zxd 2670592 Feb 12 15:28 zookeeper-3.4.14.tar.gz.1
[zxd@localhost ~]$ ./a.out
[zxd@localhost ~]$ which a.out
/usr/bin/which: no a.out in (/opt/maven-3.8.6/bin:/opt/jdk8/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/zxd/.local/bin:/home/zxd/bin)
# nohup
有时你必须在一个远程机器上运行一个长期的进程,然后你需要断开连接,或者你只是想在你和服务器之间出现任何网络问题时防止命令被停止。
使用nohup命令可以长期挂起一个程序在后台执行,也就是我们常说的用守护进行去执行程序,通常的写法如下:
nohup <command> &
# xargs
xargs通常是用于把前一个命令移交给后一个命令进行操作。为了方便理解该命令使用,这里举一个例子:
[zxd@localhost ~]$ cat c.txt
6
7
8
9
10
[zxd@localhost ~]$ ll
drwxrwxr-x 2 zxd zxd 6 Mar 16 22:07 10
drwxrwxr-x 2 zxd zxd 6 Mar 16 22:07 6
drwxrwxr-x 2 zxd zxd 6 Mar 16 22:07 7
drwxrwxr-x 2 zxd zxd 6 Mar 16 22:07 8
drwxrwxr-x 2 zxd zxd 6 Mar 16 22:07 9
这个文件中有6-10这几个数字,对应了文件夹6、7、8、9、10,我们把要删除的文件夹名称记录到`c.txt`当中,之后利用xargs的命令把整个文件的内容进行清空:
cat todelete.txt | xargs rm
它的工作方式是xargs将运行`rm`命令 2次,cat返回的每一行运行一次的结果。上面是xarge的最简单用法,除此之外还有一些可用的选项。
在我看来,其中最有用的是-p,特别是在开始学习xargs的时候。使用这个选项将使xargs打印出一个确认提示说明它要采取的行动:
![image.png](https://adong-picture.oss-cn-shenzhen.aliyuncs.com/adong/20230405175236.png)
`-I`选项是另一个广泛使用的选项。它允许你把输出的内容放到一个占位符中,然后你可以做各种事情。
`-n`选项让你告诉xargs一次执行一个迭代,所以你可以用`-p`单独确认它们。这里我们用`-n1`告诉`xargs`一次执行一个迭代:
![image.png](https://adong-picture.oss-cn-shenzhen.aliyuncs.com/adong/20230405175326.png)
通过下面的方法可以运行多个命令:
command1 | xargs -I % /bin/bash -c 'command2 %; command3 %'
上面的命令可以把我上面使用的%符号换成其他东西,它是一个变量。
# vim
vim是一个非常流行的文件编辑器。vim编辑器不用多介绍。
VIM会议:[https://vimconf.org](https://vimconf.org/)
现代Linux系统中的`v`i只是`vim`的一个别名,`vi`属于一种简写。通过执行 vi 命令,可以获得如下的结果
![](https://adong-picture.oss-cn-shenzhen.aliyuncs.com/adong/20230329075044.png)
可以通过`vi filename`的方式修改或者新建文件。在vim当中有命令模式和插入模式。在命令模式下不能做任何操作,我们可以通过按键 `i`的方式进入到插入模式,插入模式当中,在编辑器底部会有`-- INSERT --`字样。
![](https://adong-picture.oss-cn-shenzhen.aliyuncs.com/adong/20230329075409.png)
你可以用方向键在文件中移动,或者退出插入模式,用命令模式的`h-j-k-l`键。`h-l`表示左右,`j-k`表示向下向上。在命令模式下,你可以浏览文件,但你不能向它添加内容(要注意你按的是哪个键,因为它们可能是命令)。
> 总觉得hjkl的设计非常别扭。
你现在可能想做的一件事是保存文件。你可以通过按:(冒号),然后按 w。
![](https://adong-picture.oss-cn-shenzhen.aliyuncs.com/adong/20230329075835.png)
如果是**保存并且退出**,就输入 `:wq`。如果是 **退出但是不保存**,就`:q!`,这里的感叹号表示强制退出,因为vim判断你有改动文件没有保存不能正常的`:q`.
命令模式下,`u` 可以进行`undo`操作,如果无法`undo`,编辑器会提示`Already at oldest change`。如果要撤销`undo`操作,则可以使用`ctrl + r`进行`redo`。
到此最为基本的操作就完成了,进阶内容不再介绍,这里再简要介绍一些好用的功能:
- 按`x`键可以删除当前突出显示的字符
- 按`A`键进入当前所选行的末尾
- 按`0`键,进入该行的开头。
- 词的第一个字符处可以按`d`,然后按`w`来删除该词。如果你用`e`而不是`w`,那么下一个字之前的空白部分将被保留下来。
- 使用`d`和`w`之间的数字来删除一个以上的字,例如使用`d3w`来删除3个字。
- 按d后面的d可以删除一整行。按d后面的$可以删除从光标处开始的整行,直到最后。
最后推荐阅读下面的FAQ了解Vim使用:
[https://vimhelp.org/vim_faq.txt.html](https://vimhelp.org/vim_faq.txt.html)
特别是运行`vimtuto`r命令,它应该已经安装在你的系统中,将极大地帮助你开始vim的探索。
# emacs
emacs 曾经是Unix系统上最棒的编辑器,曾经甚至在国外有 `emacs` 和 `vi`(Vim) 命令的战争:[https://news.ycombinator.com/item?id=19127258](https://news.ycombinator.com/item?id=19127258)
你可以通过调用emacs来打开一个新的emacs会话,但是很遗憾,Ubuntu系统默认不需要手动安装的:
ubuntu@VM-8-8-ubuntu:~$ emacs
Command 'emacs' not found, but can be installed with:
sudo snap install emacs # version 28.2, or
sudo apt install e3 # version 1:2.82+dfsg-2
sudo apt install emacs-gtk # version 1:27.1+1-3ubuntu5
sudo apt install emacs-lucid # version 1:27.1+1-3ubuntu5
sudo apt install emacs-nox # version 1:27.1+1-3ubuntu5
sudo apt install jove # version 4.17.3.6-2
See 'snap info emacs' for additional versions.
Mac系统在使用emacs上可能会出现一些问题,原博主这里巴拉巴拉吐槽一大堆,但是解决办法总结就是用`homebrew`就完事了,这个工具的强大之处相信Mac机主都应该很了解。
具体安装和使用过程这里就跳过展示了,既然ubuntu默认都已经不自带emacs,个人认为也没有学习的必要了,如果确实非常感兴趣,阅读英文博客原文即可。
# nano
个人在起初完全用不懂的一个命令,但是简单用用就会发现就是Linux版本的文本编辑器。即开即用。你可以使用`ctrl-X`退出并且不进行编辑。如果你编辑了文件的缓冲区,编辑器会要求你确认,你可以保存编辑内容,或者放弃编辑丢弃缓冲区。底部的帮助显示了让你处理文件的键盘命令:
![image.png](https://adong-picture.oss-cn-shenzhen.aliyuncs.com/adong/20230403215853.png)
pico也差不多,尽管nano是pico的GNU版本,但pico在历史上的某个时刻是不开源的,nano的克隆版是为了满足**GNU**操作系统的许可要求。
![image.png](https://adong-picture.oss-cn-shenzhen.aliyuncs.com/adong/20230403220057.png)
# whoami
`who am i` 可以查找当前登陆用户的用户名。但是需要注意`whoami`和`who am i`略有不同:
ubuntu@VM-8-8-ubuntu:~$ whoami
ubuntu
ubuntu@VM-8-8-ubuntu:~$ who am i
ubuntu pts/0 2023-04-03 21:50 (120.231.210.178)
# ~~open~~
需要注意open是Mac系统的命令,open命令让你用下面这种语法打开一个文件。
open <filename>
在macOS上,它可以打开当前目录的Finder应用程序。
但是在非Mac系统上,多半会出现下面的报错:
[zxd@localhost ~]$ open a.txt
Couldn't get a file descriptor referring to the console
[zxd@localhost ~]$ open a.txt
Couldn't get a file descriptor referring to the console
[zxd@localhost ~]$ open a.txt
Couldn't get a file descriptor referring to the console
[zxd@localhost ~]$ open c.txt
Couldn't get a file descriptor referring to the console
在桌面版的Linux虚拟机上,可以使用xdg-open替代,具体可以看下面的文章:
[https://stackoverflow.com/questions/42463929/couldnt-find-a-file-descriptor-referring-to-the-console-on-ubuntu-bash-on-win](https://stackoverflow.com/questions/42463929/couldnt-find-a-file-descriptor-referring-to-the-console-on-ubuntu-bash-on-win "https://stackoverflow.com/questions/42463929/couldnt-find-a-file-descriptor-referring-to-the-console-on-ubuntu-bash-on-win")
> For linux, use **xdg-open**. **open** is for Mac OS. **open** in linux is an name alias of openvt (open virtual terminal).
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。