本文主要介绍“linux 发行版本”、“cpu 架构”、“Linux 目录结构”、“vi 和 vim”、“用户管理”、“文件目录指令”、“docker 安装 ubuntu20.04”。
注:笔者使用的是 ubuntu 20.04 桌面版。
linux 发行版本linux 主要发行版有 ubuntu、redhat、centos等等,都是linux 内核,其他的可能就不同了。不同发行版的很多指令都类似,比如你学会了 ubuntu,在 centos 上也能快速上手。
unix 和 linux 关系首先有 unix,但它的价格昂贵,不能运行于 x86 的 PC。
有个荷兰的教授写了一个叫 MINIX 的操作系统,向学生展示操作系统的内部原理,并将其代码开源。全世界学计算机的学生都通过钻研 MINIX 来操作系统,其中有一位芬兰大学学生,于 1991 年写出了 Linux 0.01。
Tip:更多介绍请看百度百科
cpu 架构cpu 架构有 aarch64
、loongarch64
、mips64
、x86_64
(也是AMD64
)
不同的架构可以简单理解为指令集不同。
Linux 目录结构windows 分 C盘、D盘,而 linux 已经帮我们分好了,例如我们在 /
目录下查看文件信息:
pjl@pjl:/$ ls
bin boot cdrom data dev etc home lib lib32 lib64 libx32 lost+found media mnt opt proc root run sbin snap srv swapfile sys tmp usr var
每个目录的作用请看下文。
bin/bin
,存放最经常使用的命令。例如里面有 whoami
、su
、sudo
等命令
pjl@pjl:/$ ll /bin
lrwxrwxrwx 1 root root 7 12月 7 2021 /bin -> usr/bin/
pjl@pjl:/$ ll usr/bin/ |grep 'whoami'
-rwxr-xr-x 1 root root 39256 9月 5 2019 whoami*
家目录
/home
,存放普通用户的主目录。例如我增加一个用户 pjl,home目录下也会增加一个 pjl 的目录。请看示例:
pjl@pjl:/$ sudo adduser pjl
[sudo] pjl 的密码:
正在添加用户"pjl"...
正在添加新组"pjl" (1004)...
正在添加新用户"pjl" (1004) 到组"pjl"...
创建主目录"/home/pjl"...
正在从"/etc/skel"复制文件...
新的 密码:
重新输入新的 密码:
passwd:已成功更新密码
正在改变 pjl 的用户信息
请输入新值,或直接敲回车键以使用默认值
全名 []:
房间号码 []:
工作电话 []:
家庭电话 []:
其它 []:
这些信息是否正确? [Y/n] pjl@pjl:/$
home 目录下增加用户 pjl 同名的家目录:
pjl@pjl:/$ ll /home
总用量 32
drwxr-xr-x 8 root root 4096 6月 8 20:22 ./
drwxr-xr-x 23 root root 4096 6月 8 10:48 ../
drwxr-xr-x 2 pjl pjl 4096 6月 8 20:22 pjl/
root
/root
,超级权限者的用户主目录。普通用户不能查看:
pjl@pjl:/$ ll /root
ls: 无法打开目录 '/root': 权限不够
切换 root 用户后查看:
pjl@pjl:/$ su
密码:
su: 认证失败
pjl@pjl:/$ su
密码:
root@pjl:/# ll /root
总用量 2012
drwx------ 28 root root 4096 6月 8 11:18 ./
drwxr-xr-x 23 root root 4096 6月 8 10:48 ../
drwxr-xr-x 2 root root 4096 6月 6 10:52 公共的/
drwxr-xr-x 2 root root 4096 6月 6 10:52 模板/
drwxr-xr-x 2 root root 4096 6月 6 10:52 视频/
drwxr-xr-x 2 root root 4096 6月 6 10:52 图片/
drwxr-xr-x 2 root root 4096 6月 6 10:52 文档/
drwxr-xr-x 2 root root 4096 6月 6 10:52 下载/
drwxr-xr-x 2 root root 4096 6月 6 10:52 音乐/
drwxr-xr-x 2 root root 4096 6月 6 10:52 桌面/
...
lib
/lib
,系统开机所需要的最基本的动态链接共享库,类似 windows 中 DLL 文件。几乎所有应用程序都需要用到这些共享库
/lost+found
,通常为空,系统非法关机后,就存放一些文件
pjl@pjl:~$ ls /lost+found/
ls: 无法打开目录 '/lost+found/': 权限不够
pjl@pjl:~$ sudo ls /lost+found/
[sudo] pjl 的密码:
etc
/etc
,系统管理所需的配置文件和子目录。例如 nginx、mysql、python、docker:
pjl@pjl:~$ ls /etc |grep -E 'mysql|nginx|docker|python'
docker
mysql
nginx
python2.7
python3
python3.8
nginx 的配置文件:
pjl@pjl:~$ ls /etc/nginx | grep '.conf'
fastcgi.conf
nginx.conf
usr
/usr
,用户很多的应用程序和文件都在此,类似 windows 下的 Program Files
:
pjl@pjl:~$ ls /usr
bin games include lib lib32 lib64 libexec libx32 local sbin share src
boot
/boot
,存放启动 linux 时使用的一些核心文件。包括一些链接文件和镜像文件:
pjl@pjl:~$ ls /boot
config-5.13.0-41-generic efi initrd.img-5.13.0-41-generic initrd.img.old memtest86+_multiboot.bin System.map-5.13.0-48-generic vmlinuz-5.13.0-44-generic
config-5.13.0-44-generic grub initrd.img-5.13.0-44-generic memtest86+.bin System.map-5.13.0-41-generic vmlinuz vmlinuz-5.13.0-48-generic
config-5.13.0-48-generic initrd.img initrd.img-5.13.0-48-generic memtest86+.elf System.map-5.13.0-44-generic vmlinuz-5.13.0-41-generic vmlinuz.old
proc
/proc
,虚拟目录,它是系统内存的映射,访问这个目录获取系统信息
root@97342c74a502:/# ls /proc
1 cmdline dma ioports kpagecgroup modules schedstat thread-self zoneinfo
10 config.gz driver irq kpagecount mounts self timer_list
160 consoles execdomains kallsyms kpageflags mtrr softirqs tty
acpi cpuinfo filesystems kcore loadavg net stat uptime
buddyinfo crypto fs key-users locks pagetypeinfo swaps version
bus devices interrupts keys meminfo partitions sys vmallocinfo
cgroups diskstats iomem kmsg misc sched_debug sysvipc vmstat
srv
/srv
,service缩写,存放一些服务启动之后需要提取的数据
pjl@pjl:~$ ls /srv
ftp
sys
/sys
,这是 linux 2.6 内核的一个很大的变化
pjl@pjl:~$ ls /sys
block bus class dev devices firmware fs hypervisor kernel module power
tmp
/tmp
,存放一些临时文件
/dev
,类似 windows 的设备管理器,把所有硬件用文件存储。比如笔者 cpu 有 4 核
pjl@pjl:~$ ls /dev/cpu
0 1 2 3 microcode
media
/media
,linux 会自动识别一些设备,例如 U 盘,识别后将会把该设备挂载到这个目录下。
/mnt
,用于让用户临时挂载别的文件系统
/opt
,给主机额外安装软件的目录。例如安装数据库,默认为空。笔者安装了百度网盘
pjl@pjl:~$ ls /opt
baidunetdisk google sogoupinyin teamviewer
usr/local
/usr/local
,另一个给主机额外安装软件的目录。一般通过编译源码方式安装的程序
pjl@pjl:~$ ls /usr/local
bin etc games include lib man rvm sbin share src
var
/var
,存放不断扩充的东西,习惯将经常修改的目录放在这里,例如日志文件
pjl@pjl:~$ ls /var
backups cache crash lib local lock log mail metrics opt run snap spool tmp www
vi 和 vim
linux 会内置 vi 文本编辑器。vim 是增强版。
编辑器模式编辑器有三种模式:
- 正常模式
- 插入模式
- 命令行模式
Tip:通过 vim 默认进去的就是正常模式,退出(:q!
)或保存退出(:wq
)属于命令模式,通过输入 i
进入编辑模式。
模式切换:
- 正常模式 输入
i
进入编辑模式 - 编辑模式 输入
esc
进入正常模式 - 正常模式 输入
:
或/
进入命令模式 - 命令模式 输入
esc
进入正常模式
Tip:退出有以下三种:
:wq
保存退出:q
退出。有时退出失败,提示我们使用强制退出:E37: 已修改但尚未保存 (可用 ! 强制执行)
:q!
强制退出,不保存
复制一行 yy
,复制 5 行 5yy
,粘贴输入 p
。需要在正常模式下进行。
在正常模式,光标在第一行,输入 yy,接着输入 p:
a
b
c
d
e
文件内容变为:
a
a
b
c
d
e
删除
删除当前行 dd
,删除当前行向下3行,输入 3dd
即可。需在正常模式下进行。
正常模式输入 /
进入命令模式,输入要找的单词,例如 test,然后输入回车,接着输入 n
就能匹配下一个,到底了会提示“已查找到文件结尾,再从开头继续查找”,继续输入 n
就会从头开始。
如果需要找其他单词,输入 /
,在输入其他单词例如 apple,如果要编辑找到的这个 apple,输入 i
进入编辑模式即可。
命令行下输入 :set nu
,显示行号。如下所示:
...
7 # the default umask is set in /etc/profile; for setting the umask
8 # for ssh logins, install and configure the libpam-umask package.
9 #umask 022
Tip:输入 :set nonu
隐藏行号
正常模式下,gg
首行,G
末行。
比如输入在某行输入 aa bb cc
,想撤回,回到正常模式,输入 u
即可。对删除的某行(dd)等操作同样适用
一般模式下输入行号,例如 99,然后输入 shift+g
即可
linux 是多用户,多任务的操作系统。
创建用户通过 adduser
创建用户。请看示例:
root@pjl:/# adduser test11
正在添加用户"test11"...
正在添加新组"test11" (1007)...
正在添加新用户"test11" (1007) 到组"test11"...
创建主目录"/home/test11"...
正在从"/etc/skel"复制文件...
新的 密码:
重新输入新的 密码:
passwd:已成功更新密码
正在改变 test11 的用户信息
请输入新值,或直接敲回车键以使用默认值
全名 []:
房间号码 []:
工作电话 []:
家庭电话 []:
其它 []:
这些信息是否正确? [Y/n]
家目录下已增加新增用户 test11:
root@pjl:/# ll /home
总用量 40
drwxr-xr-x 10 root root 4096 6月 14 16:40 ./
drwxr-xr-x 23 root root 4096 6月 8 10:48 ../
drwxr-xr-x 2 test11 test11 4096 6月 14 16:40 test11/
更改用户密码
通过 passwd 可以修改用户密码。请看示例:
test11@pjl:/$ passwd test11
更改 test11 的密码。
Current password:
新的 密码:
重新输入新的 密码:
passwd:已成功更新密码
Tip:远程工具通过 test11 登录成功后,默认会进入该用户的家目录:
test11@pjl:~$ pwd
/home/test11
test11@pjl:~$
切换用户
通过 su -
切换用户。例如切换到 root 用户:
test10@pjl:~$ su - root
密码:
root@pjl:~# su - test10
test10@pjl:~$ su - test11
密码:
su: 认证失败
test10@pjl:~$ su - test11
密码:
Tip:权限高的用户切换到权限低的无需输入密码。反之却需要输入密码。
删除用户通过 userdel
可以删除用户。比如删除用户 test200,但保留家目录:
root@pjl:/home# userdel test200
root@pjl:/home# ls
test200
通过 -r
删除用户,同时删除其家目录:
root@pjl:/home# ls
test201 vncuser
root@pjl:/home# userdel -r test201
userdel:test201 信件池 (/var/mail/test201) 未找到
test201 用户的家目录已删除:
root@pjl:/home# ls
vncuser
Tip:比如张三离职,一般情况保留其家目录,万一留有重要成果。更多介绍请通过 -h 查看:
root@pjl:/home# userdel -h
用法:userdel [选项] 登录名
选项:
-f, --force 即使不属于此用户,也强制删除文件
-h, --help 显示此帮助信息并退出
-r, --remove 删除主目录和信件池
-R, --root CHROOT_DIR chroot 到的目录
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
--extrausers Use the extra users database
-Z, --selinux-user 为用户删除所有的 SELinux 用户映射
查询用户信息
通过 id 可查询用户信息。请看示例:
root@pjl:/home# id root
用户id=0(root) 组id=0(root) 组=0(root)
root@pjl:/home# id test10
用户id=1006(test10) 组id=1006(test10) 组=1006(test10)
root@pjl:/home# id test111
id: “test111”:无此用户
whoami
,查询当前用户:
root@pjl:/home# whoami
root
Tip:通过 who am i
可以查看什么时间(2022-06-14 16:46),从哪台机器(192.168.1.225),什么用户(test11)登录这个 linux 终端。
root@pjl:/home# who am i
test11 pts/6 2022-06-14 16:46 (192.168.1.225)
用户组
用户组类似角色,方便管理。
增加组、删除组增加组使用 groupadd
,删除组使用 groupde
。请看示例:
# 增加组 agroup
root@pjl:/home# groupadd agroup
# 删除组 agroup
root@pjl:/home# groupdel agroup
创建用户并指定所属组
创建用户 test30 并放入 agroup 组中:
root@pjl:/home# useradd -g agroup test30
test30 确实已经属于 agroup 组:
root@pjl:/home# id test30
用户id=1010(test30) 组id=1010(agroup) 组=1010(agroup)
注:如果创建用户时不指定组,系统会创建一个与用户同名的组:
root@pjl:/home# adduser test40
root@pjl:/home# id test40
用户id=1011(test40) 组id=1011(test40) 组=1011(test40)
切换用户所属组
usermod
切换用户所属组。例如将 test40 放入 bgroup 组:
root@pjl:/home# groupadd bgroup
root@pjl:/home# usermod -g bgroup test40
root@pjl:/home# id test40
用户id=1011(test40) 组id=1012(bgroup) 组=1012(bgroup)
用户和组相关文件
用户和组相关的有三个文件:
- 用户的配置文件
- 用户的口令配置文件
- 组的配置文件
用户的配置文件,记录用户的各种信息。请看示例:
test11@pjl:~$ cat /etc/passwd
// 用户名:口令:用户id:组id:注释性描述:家目录:使用的shell
test40:x:1011:1012:,,,:/home/test40:/bin/bash
...
/etc/shadow
口令配置文件:
root@pjl:/home/test11# cat /etc/shadow
// ! 这里是密码
// 19157 等信息都是处理过,看不懂的
test40:!:19157:0:99999:7:::
比如给 test40 设置密码(比如123456
)
root@pjl:/home/test11# passwd test40
新的 密码:
重新输入新的 密码:
passwd:已成功更新密码
再次查看 /etc/shadow
,发现密码加密显示了:
test40:$6$JF.ed3d.S9RHucx.$13bXH9Ji3P8AGB2tsCnjRI8AFhp301F3HWzquzKCBTQWzS3..D6lvgKTsOLWuY1nwogtBcGdiZp5mGN69Ar7E.:19158:0:99999:7:::
/etc/group
组的配置文件:
root@pjl:/home/test11# cat /etc/group
bgroup:x:1012:
上面我们将 test40 用户放入 bgroup。这里的 1012 与用户配置文件中的组 id 相对应。
帮助指令 man比如通过 man
查看 ls
命名。请看示例:
root@pjl:/home/test11# man ls
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all
do not ignore entries starting with .
...
-l use a long listing format
点击空格
能翻页,输入 q
就能退出:
Tip:笔者使用 mobaxterm 能通过鼠标向上向下滚动。
root@pjl:/home/test11#
ls 较常用的两个参数, a
显示所有文件文件。linux 中,隐藏文件以 .
开头:
root@pjl:/home/test11# ls
root@pjl:/home/test11# ls -a
. .. .bash_history .bash_logout .bashrc .cache .config .local .profile .Xauthority
l
是以列表的形式显示信息。参数可以组合使用,不要求顺序:
root@pjl:/home/test11# ls -l
总用量 0
root@pjl:/home/test11# ls -la
总用量 40
drwxr-xr-x 5 test11 test11 4096 6月 15 18:55 .
drwxr-xr-x 12 root root 4096 6月 14 17:21 ..
-rw------- 1 test11 test11 86 6月 14 17:27 .bash_history
-rw-r--r-- 1 test11 test11 220 6月 14 16:40 .bash_logout
-rw-r--r-- 1 test11 test11 3771 6月 14 16:40 .bashrc
drwx------ 4 test11 test11 4096 6月 14 16:46 .cache
drwx------ 4 test11 test11 4096 6月 14 16:46 .config
drwxr-xr-x 3 test11 test11 4096 6月 14 16:46 .local
-rw-r--r-- 1 test11 test11 807 6月 14 16:40 .profile
-rw------- 1 test11 test11 108 6月 15 18:55 .Xauthority
help
help 能查看 shell 内置命令。例如 cd
,请看示例:
root@pjl:/home/test11# help cd
cd: cd [-L|[-P [-e]] [-@]] [目录]
改变 shell 工作目录。
改变当前目录至 DIR 目录。默认的 DIR 目录是 shell 变量 HOME
的值。
变量 CDPATH 定义了含有 DIR 的目录的搜索路径,其中不同的目录名称由冒号 (:)分隔。
一个空的目录名称表示当前目录。如果要切换到的 DIR 由斜杠 (/) 开头,则 CDPATH
不会用上变量。
如果路径找不到,并且 shell 选项 `cdable_vars' 被设定,则参数词被假定为一个
变量名。如果该变量有值,则它的值被当作 DIR 目录。
选项:
-L 强制跟随符号链接: 在处理 `..' 之后解析 DIR 中的符号链接。
-P 使用物理目录结构而不跟随符号链接: 在处理 `..' 之前解析 DIR 中的符号链接。
-e 如果使用了 -P 参数,但不能成功确定当前工作目录时,返回非零的返回值。
-@ 在支持拓展属性的系统上,将一个有这些属性的文件当作有文件属性的目录。
默认情况下跟随符号链接,如同指定 `-L'。
`..' 使用移除向前相邻目录名成员直到 DIR 开始或一个斜杠的方式处理。
退出状态:
如果目录改变,或在使用 -P 选项时 $PWD 修改成功时返回 0,否则非零。
注:man 查看 cd 失败;help 查看 ls 也失败。请看示例:
root@pjl:/home/test11# man cd
没有 cd 的手册页条目
root@pjl:/home/test11# help ls
bash: help: 没有与“ls”匹配的帮助主题。尝试使用“help help”、“man -k ls”或“info ls”。
pwd
用这两个帮助指令都可以。
如果觉得 ls --help
不详细,可以使用 info ls
:
root@97342c74a502:/# info ls
Next: dir invocation, Up: Directory listing
10.1 'ls': List directory contents
==================================
The 'ls' program lists information about files (of any type, including
directories). Options and file arguments can be intermixed arbitrarily,
as usual.
...
文件目录指令
pwd
pwd
,查看当前目录所在的绝对路径。请看示例:
root@pjl:/home/test11# pwd
/home/test11
cd
cd ~
回到家目录。请看示例
// 目前在 tmp
test11@pjl:~/tmp$ pwd
/home/test11/tmp
test11@pjl:~/tmp$ cd ~
// 已回到test11 用户的家目录
test11@pjl:~$ pwd
/home/test11
cd ..
返回上一层目录。
mkdir
,创建目录,默认创建一级目录,多级目录需要使用 -p
参数。例如创建 e、f、g 三个目录:
test11@pjl:/tmp$ mkdir -p e/f/g
test11@pjl:/tmp$ cd e/f/g/
test11@pjl:/tmp/e/f/g$
rmdir
rmdir
,删除空目录。非空目录可以使用 rm -rf
。请看示例:
test11@pjl:~/tmp$ rmdir e
rmdir: 删除 'e' 失败: 目录非空
test11@pjl:~/tmp$ rm -rf e
通过 rm --help
知道:r 表示递归,f 指强制删除
。
rm 也能删除文件,或同时删除非空目录 a 和 a.txt 文件。请看示例:
test11@pjl:~/tmp$ rm -rf a a.txt
touch
touch
创建一个空文件。
test11@pjl:~/tmp$ touch b.txt
test11@pjl:~/tmp$ ls
b.txt
cp
cp
拷贝文件或目录。例如将 b.txt 拷贝到 文件夹 c 中:
# 创建多级目录
test11@pjl:~/tmp$ mkdir -p a/b/c
# 将 b.txt 拷贝到文件夹 c 中
test11@pjl:~/tmp$ cp b.txt a/b/c
test11@pjl:~/tmp$ ls a/b/c
b.txt
通过参数 -r
将非空目录 a 整个拷贝到上层目录。请看示例:
# 拷贝非空目录失败
test11@pjl:~/tmp$ cp a ../
cp: 未指定 -r;略过目录'a'
test11@pjl:~/tmp$ cp a -r ../
test11@pjl:~/tmp$ ls ../
a tmp
多次执行拷贝,未提示是否需要覆盖。
test11@pjl:~/tmp$ cp a -r ../
Tip:笔者是ubuntu20.04,并且也修改了 a/b/c/b.txt 这个文件。
mvmv
移动目录或文件,也可以重命名。请看示例:
test11@pjl:~$ ls
a tmp
# 将 a 重命名为 a2
test11@pjl:~$ mv a a2
test11@pjl:~$ ls
a2 tmp
移动并重新命名。将 b.txt 移动到上一层目录,并重命名:
test11@pjl:~/tmp$ mv b.txt ../b-rename.txt
test11@pjl:~/tmp$ ls ../
b-rename.txt tmp
移动 a 文件夹,并重命名:
test11@pjl:~/tmp$ mv a ../a-rename
test11@pjl:~/tmp$ cd ../a-rename/b
# 检验:a中有b
test11@pjl:~/a-rename/b$
cat
cat
查看文件内容。只读,更安全。请看示例:
# n 显示行号
test11@pjl:~/a-rename/b$ cat -n /etc/profile
...
10 fi
11 else
12 if [ "`id -u`" -eq 0 ]; then
13 PS1='# '
14 else
15 PS1='$ '
16 fi
17 fi
可配合 more
使用:
test11@pjl:~/a-rename/b$ cat -n /etc/profile | more
1 # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
2 # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
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\$ '
8 if [ -f /etc/bash.bashrc ]; then
9 . /etc/bash.bashrc
10 fi
11 else
12 if [ "`id -u`" -eq 0 ]; then
13 PS1='# '
14 else
15 PS1='$ '
16 fi
17 fi
18 fi
19
20 if [ -d /etc/profile.d ]; then
21 for i in /etc/profile.d/*.sh; do
22 if [ -r $i ]; then
23 . $i
--更多--
more
more
,适合屏幕查看的文件阅读输出工具。基于 vi
编辑器的文本过滤器,以全屏幕的方式显示文件内容。可以配合管道使用,也可以单独使用。
例如查看文件:
test11@pjl:~/a-rename/b$ more /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
--更多--(77%)
内置许多快捷键:
q
- 退出 more空格
- 向下翻页回车
- 向下一行ctrl + f
- 向下一屏ctrl + b
- 向上一屏=
- 输出当前行号:f
- 输出文件名和当前行号
less
,功能与 more
类似,功能比 more 更强大。less 显示文件内容时,不是一次将整个文件加载之后才显示,对显示大型文件有较好的效率。
内置许多快捷键:
q
- 退出空格
- 向下翻页page down
- 向下翻页page up
- 向上翻页/字符串
- 向下搜索字符串。n
向下查找;N
向上查找。
echo
,输出内容到控制台。请看示例:
# 输出字符串
root@97342c74a502:/# echo 'hello world'
hello world
# 输出内置变量
root@97342c74a502:/# echo $SHELL
/bin/bash
head
head
,用于显示文件开头部分,默认前 10 行。请看示例:
test11@pjl:~/a-rename/b$ head /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
假如只要显示前 5 行,可以使用参数 n
。请看示例:
test11@pjl:~/a-rename/b$ head /etc/profile -n 5
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
tail
tail
, 与 head 对应,默认显示文件末尾 10 行。也能指定显示末尾 5 行。
test11@pjl:~/a-rename/b$ tail /etc/profile
if [ -r $i ]; then
. $i
fi
done
unset i
fi
export ANDROID_HOME=/home/pjl/software/android-studio-2021.1.1.22-linux/android-studio/bin
export PATH=$PATH:$ANDROID_HOME
tail -f filename
,随文件增长即时输出新增数据,也就是能监听文件。请看示例:
# 新建文件 a.txt
test11@pjl:~/a-rename/b$ touch a.txt
# 监听文件输出。此刻终端不会结束,一直监听着
test11@pjl:~/a-rename/b$ tail -f a.txt
另开一个终端,将字符串(apple
)输出(或重定向)到 a.txt 文件中:
test11@pjl:~/a-rename/b$ echo 'apple' > a.txt
立刻监听到并输出:
test11@pjl:~/a-rename/b$ tail -f a.txt
apple
> 和 >>
>
输出重定向。例如将 pwd 结果输出到 a.txt,这是一个覆盖操作:
test11@pjl:~/tmp$ touch a.txt
test11@pjl:~/tmp$ pwd > a.txt
test11@pjl:~/tmp$ cat a.txt
/home/test11/tmp
test11@pjl:~/tmp$ ls > a.txt
test11@pjl:~/tmp$ cat a.txt
a.txt
>>
则是追加。例如将 pwd 的结果追加到 a.txt 文件中:
test11@pjl:~/tmp$ pwd >> a.txt
test11@pjl:~/tmp$ cat a.txt
a.txt
/home/test11/tmp
ln
ln -s
创建软链接,类似 windows 下快捷键。
语法:
ln -s 文件或目录 软连接名
例如给 a 创建一个软链接 ln-a:
test11@pjl:~/tmp$ ln -s a ln-a
test11@pjl:~/tmp$ ll
总用量 16
drwxrwxr-x 3 test11 test11 4096 6月 17 14:22 ./
drwxr-xr-x 8 test11 test11 4096 6月 17 14:13 ../
drwxrwxr-x 3 test11 test11 4096 6月 17 14:22 a/
lrwxrwxrwx 1 test11 test11 1 6月 17 14:22 ln-a -> a/
删除软连接可以使用 rm
,类似删除一个文件:
test11@pjl:~/tmp$ ls
a ln-a
# 删除软链接
test11@pjl:~/tmp$ rm ln-a
# 软链接已被删除
test11@pjl:~/tmp$ ls
a
Tip:为什么要加 -s
,通过 ln --help
有这么一段信息:-s, --symbolic 创建符号链接而非硬链接
,也就是说加上 s
就是创建软链接。
history
查看已执行过的历史命令,也可以执行历史命令。
查看所有历史命令:
$ history
...
170 ls
171 cd ..
172 ls
173 rm ln-a
174 ls
175 history
176 history |more
177 ls
178 history
查看最近 5 条历史命令:
test11@pjl:~/tmp$ history 5
176 history |more
177 ls
178 history
179 ls
180 history 5
执行第 177(这里是 ls
命名) 条历史命令:
test11@pjl:~/tmp$ !177
ls
a a.txt
运行级别
常用的运行级别有 3
和 5
:
- 0 关机
- 3 多用户有网络服务
- 5 多用户图形
- 6 系统重启
可以通过 init
来切换运行级别,例如 init 0
等于关机。
Tip:可以通过 --help
查看 init
命名。
root@pjl:/home/test11# init --help
init [OPTIONS...] COMMAND
Send control commands to the init daemon.
Commands:
0 Power-off the machine
6 Reboot the machine
2, 3, 4, 5 Start runlevelX.target unit
1, s, S Enter rescue mode
q, Q Reload init daemon configuration
u, U Reexecute init daemon
Options:
--help Show this help
--no-wall Don't send wall message before halt/power-off/reboot
See the telinit(8) man page for details.
当前运行级别是图形化。请看示例:
root@pjl:/home/test11# systemctl get-default
graphical.target
比如将运行级别设置为 3:
root@pjl:/home/test11# systemctl set-default multi-user.target
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/multi-user.target.
root@pjl:/home/test11# systemctl get-default
multi-user.target
注:如果这么做,重启(reboot
)后直接进入级别 3,能够节省资源。
笔者不想安装虚拟机,为图方便,直接在笔记本中安装 ubuntu。
笔者已经在 win10 中安装 Docker Desktop。
Tip: 有关 docker 的介绍请看 初步认识 docker。
下载镜像:
$ docker pull ubuntu:22.04
创建一个名为 ubuntu-test 的容器:
PS C:\Users\78614> docker run -itd --name ubuntu-test ubuntu:20.04
通过 exec 命令进入 ubuntu 容器,指定通过 bash 进行交互:
PS C:\Users\78614> docker exec -it ubuntu-test /bin/bash
root@5dbf1344541e:/# whoami
root
安装 vi
docker 下的 ubuntu 镜像没有 vi 命令。
root@5dbf1344541e:/# vi
bash: vi: command not found
root@5dbf1344541e:/# vim
bash: vim: command not found
如果需要 vi ,我们需要安装它。
据网友介绍:
apt-get
/dpkg
:适用于Debian、Ubuntu等平台rpm/yum
:适用于 Redhat、CentOS、Suse等平台zypper
:适合于Suse平台
笔者依次输入 rpm
、yum
、apt-get
,发现 apt-get
生效:
root@9b385d9791f6:~# rpm
bash: rpm: command not found
root@9b385d9791f6:~# yum
bash: yum: command not found
root@9b385d9791f6:~# apt-get
apt 2.0.8 (amd64)
Usage: apt-get [options] command
apt-get [options] install|remove pkg1 [pkg2 ...]
apt-get [options] source pkg1 [pkg2 ...]
通过 --help
查看 apt-get
:
root@5dbf1344541e:/# apt-get --help
apt 2.0.8 (amd64)
Usage: apt-get [options] command
apt-get [options] install|remove pkg1 [pkg2 ...]
apt-get [options] source pkg1 [pkg2 ...]
apt-get is a command line interface for retrieval of packages
and information about them from authenticated sources and
for installation, upgrade and removal of packages together
with their dependencies.
Most used commands:
update - Retrieve new lists of packages
upgrade - Perform an upgrade
install - Install new packages (pkg is libc6 not libc6.deb)
reinstall - Reinstall packages (pkg is libc6 not libc6.deb)
remove - Remove packages
purge - Remove packages and config files
autoremove - Remove automatically all unused packages
dist-upgrade - Distribution upgrade, see apt-get(8)
dselect-upgrade - Follow dselect selections
build-dep - Configure build-dependencies for source packages
satisfy - Satisfy dependency strings
clean - Erase downloaded archive files
autoclean - Erase old downloaded archive files
check - Verify that there are no broken dependencies
source - Download source archives
download - Download the binary package into the current directory
changelog - Download and display the changelog for the given package
See apt-get(8) for more information about the available commands.
Configuration options and syntax is detailed in apt.conf(5).
Information about how to configure sources can be found in sources.list(5).
Package and version choices can be expressed via apt_preferences(5).
Security details are available in apt-secure(8).
This APT has Super Cow Powers.
使用 apt-get
安装 vi,报错:
root@9b385d9791f6:~# apt-get install vi
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vi
通过apt-get update
检索新的包列表:
root@9b385d9791f6:~# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:2 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:3 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [1324 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]
Get:7 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]
Get:8 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]
Get:10 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [30.3 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [1404 kB]
Get:12 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1170 kB]
Get:13 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2407 kB]
Get:14 http://archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [54.2 kB]
Get:15 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [27.1 kB]
Get:16 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1974 kB]
91% [16 Packages 710 kB/1974 kB 36%]
...
Reading package lists... 80%
Reading package lists... Done
再次通过 apt-get 安装 vi,依然失败:
root@9b385d9791f6:~# apt-get install vi
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vi
尝试安装 vim,成功:
root@9b385d9791f6:~# apt-get install vim
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
alsa-topology-conf alsa-ucm-conf file libasound2 libasound2-data libcanberra0 libexpat1 libgpm2 libltdl7 libmagic-mgc libmagic1 libmpdec2 libogg0 libpython3.8 libpython3.8-minimal libpython3.8-stdlib
libreadline8 libsqlite3-0 libssl1.1 libtdb1 libvorbis0a libvorbisfile3 mime-support readline-common sound-theme-freedesktop vim-common vim-runtime xxd xz-utils
Suggested packages:
libasound2-plugins alsa-utils libcanberra-gtk0 libcanberra-pulse gpm readline-doc ctags vim-doc vim-scripts
The following NEW packages will be installed:
alsa-topology-conf alsa-ucm-conf file libasound2 libasound2-data libcanberra0 libexpat1 libgpm2 libltdl7 libmagic-mgc libmagic1 libmpdec2 libogg0 libpython3.8 libpython3.8-minimal libpython3.8-stdlib
libreadline8 libsqlite3-0 libssl1.1 libtdb1 libvorbis0a libvorbisfile3 mime-support readline-common sound-theme-freedesktop vim vim-common vim-runtime xxd xz-utils
0 upgraded, 30 newly installed, 0 to remove and 7 not upgraded.
Need to get 14.9 MB of archives.
After this operation, 70.6 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu focal/main amd64 libmagic-mgc amd64 1:5.38-4 [218 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal/main amd64 libmagic1 amd64 1:5.38-4 [75.9 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal/main amd64 file amd64 1:5.38-4 [23.3 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libexpat1 amd64 2.2.9-1ubuntu0.4 [74.4 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal/main amd64 libmpdec2 amd64 2.4.2-3 [81.1 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libssl1.1 amd64 1.1.1f-1ubuntu2.13 [1321 kB]
Get:7 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libpython3.8-minimal amd64 3.8.10-0ubuntu1~20.04.4 [717 kB]
Get:8 http://archive.ubuntu.com/ubuntu focal/main amd64 mime-support all 3.64ubuntu1 [30.6 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/main amd64 readline-common all 8.0-4 [53.5 kB]
Get:10 http://archive.ubuntu.com/ubuntu focal/main amd64 libreadline8 amd64 8.0-4 [131 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libsqlite3-0 amd64 3.31.1-4ubuntu0.3 [549 kB]
22% [11 libsqlite3-0 158 kB/549 kB
...
update-alternatives: warning: skip creation of /usr/share/man/man1/editor.1.gz because associated file /usr/share/man/man1/vim.1.gz (of link group editor) doesn't exist
Processing triggers for libc-bin (2.31-0ubuntu9.9) ...
命令行输入 vi 或 vim,发现 vi 和 vim 都已安装成功。
注:vi 和 vim 只在这个容器中安装,如果通过 unbuntu 镜像运行另一个容器,需要重新安装 vi。我们可以通过停止和启动这个安装好 vi 的容器,反复使用它即可。