文章目录
Linux基础
用户类型
- root用户
一个特殊的管理账户,也称为超级用户,已经接近完整的系统控制能力,操作不当会对系统造成无法无法
挽回的后果。如非必要不要登录root用户
- 普通用户
权限有限造成损害的能力有限
终端terminal
终端设备:键盘、鼠标、显示器
终端类型
- 控制台终端: /dev/console
- 串行终端: /dev/ttyS#
- 虚拟终端:tty: /dev/tty#,tty可以有N个
- 图形终端:startx、xwindows
- 伪终端: pty: /dev/pts/# 如SSH远程连接
查看当前终端设备
tty
交互式接口
交互式接口:启动终端后,在终端设备附加一个交互式应用程序
- GUI:Graphic User Interface
X protocol, window manager, desktop
Desktop:
GNOME (C, 图形库gtk),
KDE (C++,图形库qt)
XFCE (轻量级桌面)
即图形用户接口 - CLI:Command Line Interface
shell程序,即命令行用户接口
什么是shell
- shell 是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
- shell被称为Linux的命令解释器,shell本身是一个程序。根据用户输入的命令名找到要执行的程序,并将解析出的参数传给该程序并执行。
- shell是一种编程语言。
- shell本身也是个程序,所有他可以被任何用户自己开发的各种shell所代替
各种shell
sh :Steve Bourne
bash:Bourne-Again Shell,GPL,CentOS 和 Ubuntu 默认使用
csh :c shell , C 语言风格
tcsh
ksh :Korn Shell, AIX 默认 shell
zsh: MacOS默认shel
bash shell
Linux标准的shell,与sh兼容
- 显示当前使用的shell
[root@Centos ~]#echo ${SHELL}
/bin/bash
- 显示当前系统使用的所有shell
[root@Centos ~]#cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
设置主机名
临时生效
hostname NAME
eg:
[root@Centos ~]#hostname JASON
[root@Centos ~]#hostname
JASON
永久生效
hostnamectl set-hostname NAME
eg:
[root@Centos ~]#hostnamectl set-hostname centos.bruce.cn
[root@Centos ~]#hostname
centos.bruce.cn
注:
主机名不支持使用下划线,但支持横线,可使用字母、横线或数字组合
有些软件对主机名有特殊要求
命令提示符
登录Linux后,默认的系统命令提示符毫无没有个性,无法明显辨别生产和测试环境,而导致误操作。可以通过修改PS1变量实现个性的提示符格式,避免这种低级错误
CentOS默认提示符
[root@Centos ~]#
Ubuntu普通用户提示符
lee@Ubuntu:~$
- 管理员 #
- 普通用户 $
显示提示符格式
[root@Centos ~]#echo $PS1
\[\e[1;33m\][\[\e[1;33m\]\u\[\e[33m\]@\h\[\e[1;33m\] \W\[\e[1;33m\]]\[\e[0m\]\$
修改提示符范例
PS1="\[\e[1;5;41;33m\][\u@\h \W]\\$\[\e[0m\]"
PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\
[\e[0m\]\\$"
提示符格式说明
\e 控制符\033
\u 当前用户
\h 主机名简称
\H 主机名
\w 当前工作目录
\W 当前工作目录基名
\t 24小时时间格式
执行命令
执行命令过程
输入命令后回车,提请shell程序找到键入命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来
shell中可执行的两类命令
- 内部命令:由shell自带的,而且通过某命令形式提供, ,用户登录后自动加载并常驻内存中
- 外部命令:在文件系统路径下对应的可执行程序文件,当执行命令时从磁盘加载至内存中,命令执行文本后从内存中删除
查看命令是内部命令还是外部命令
type 命令名称
eg:
[root@centos ~]#type -a echo
echo is a shell builtin
echo is /usr/bin/echo
[root@centos ~]#type -a cat
cat is /usr/bin/cat
echo命令既是外部命令也是内部命令,cat是外部命令。
hash缓存表
系统初始hash表为空,外部命令执行时,默认会从PATH环境变量路径下寻找该命令,找到后会将该命令路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,命令在hash表中则执行,不存在则去PATH路径下寻找,利用hash缓存吧可以大大提高调用速率。
常用hash命令
- 显示hash缓存
[root@centos ~]#hash
hits command
1 /usr/bin/hostname
1 /usr/bin/ls
- 显示hash中的命令
[root@centos ~]#hash -I
-bash: hash: -I: invalid option
hash: usage: hash [-lr] [-p pathname] [-dt] [name ...]
- 将命令全路径path起别名为name
hash -p path name
- 打印缓存中name的路径
[root@centos ~]#hash -p path name
[root@centos ~]#hash -t name
path
- 清除name缓存
[root@centos ~]#hash -d name
[root@centos ~]#hash -t name
-bash: hash: name: not found
[root@centos ~]#
- 清除缓存
[root@centos ~]#hash -r
[root@centos ~]#hash
hash: hash table empty
[root@centos ~]#
命令别名
对于经常执行的较长的命令,可以将其定义成较短的命令,以方便执行
- 显示当前shell进程所有可以使用的命令别名
[root@centos ~]#alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias xzegrep='xzegrep --color=auto'
alias xzfgrep='xzfgrep --color=auto'
alias xzgrep='xzgrep --color=auto'
alias zegrep='zegrep --color=auto'
alias zfgrep='zfgrep --color=auto'
alias zgrep='zgrep --color=auto'
[root@centos ~]#
- 定义别名NAME,相当于执行命令
alias NAME='VALUE'
eg:扫明新添加的硬盘
[root@centos8 ~]#alias scandisk='echo - - - >
/sys/class/scsi_host/host0/scan;echo - - - >
/sys/class/scsi_host/host1/scan;echo - - - > /sys/class/scsi_host/host2/scan'
- 撤销别名:unalias
unalias [-a] name [name ...]
unalias -a #取消所有别名
注:在命令行中定义的别名,仅对当前shell进程有效
若想永久生效,需要定义在配置文件中
- 仅对当前用户:~/.bashrc
- 对所有用户有效:/etc/bashrc
如果别名同原命令同名,如果要执行原命令,可使用
\ALIASNAME
“ALIASNAME”
‘ALIASNAME’
command ALIASNAME
/path/commmand #只适用于外部命令
命令格式
COMMAND [OPTIONS...] [ARGUMENTS...]
COMMAND [COMMAND] [COMMAND] ....
选项:用于启用或关闭命令的某个或某些功能
- 短选项:UNIX风格选项,-c、-i、-I等
- 长选项:GNU风格选项,–word、–all、–human等
- BSD风格选项:一个字母,a等,使用较少
参数:命令的作用对象。如:文件名、用户名等
[root@Ubuntu ~]#id -u
0
[root@Ubuntu ~]#id -u lee
1000
[root@Ubuntu ~]#ls --all
. .. .bash_history .bashrc .profile .viminfo
[root@Ubuntu ~]#ls -a
. .. .bash_history .bashrc .profile .viminfo
[root@Ubuntu ~]#free -h
total used free shared buff/cache available
Mem: 1.9G 154M 1.2G 884K 589M 1.6G
Swap: 1.9G 0B 1.9G
[root@Ubuntu ~]#free --human
total used free shared buff/cache available
Mem: 1.9G 154M 1.2G 884K 589M 1.6G
Swap: 1.9G 0B 1.9G
[root@Ubuntu ~]#ps a
PID TTY STAT TIME COMMAND
1097 tty1 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
1382 pts/0 Ss 0:00 -bash
1781 pts/0 S 0:00 sudo -i
1782 pts/0 S 0:00 -bash
1899 pts/0 R+ 0:00 ps a
注:
- 多个选项以及多参数和命令之间使用空白字符分隔
- 取消和结束命令执行:Ctrl+c(相当于强行关闭正在进行的进程),Ctrl+d
- 多个命令可以用 “;” 符号分开
- 一个命令可以用\分成多行
常见命令
查看硬件
- 查看CPU
[root@centos ~]#lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
BIOS Vendor ID: GenuineIntel
CPU family: 6
Model: 141
Model name: 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
BIOS Model name: 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
Stepping: 1
CPU MHz: 2304.000
BogoMIPS: 4608.00
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 48K
L1i cache: 32K
L2 cache: 1280K
L3 cache: 24576K
NUMA node0 CPU(s): 0,1
[root@centos ~]#cat /proc/cpuinfo
- 查看内存
[root@centos ~]#free
total used free shared buff/cache available
Mem: 1828248 238232 1295676 8864 294340 1433212
Swap: 4194300 0 4194300
[root@centos ~]#cat /proc/meminfo
MemTotal: 1828248 kB
MemFree: 1295764 kB
MemAvailable: 1433324 kB
Buffers: 5212 kB
Cached: 254904 kB
SwapCached: 0 kB
Active: 79476 kB
Inactive: 266816 kB
Active(anon): 1576 kB
Inactive(anon): 93464 kB
Active(file): 77900 kB
Inactive(file): 173352 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 4194300 kB
SwapFree: 4194300 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 86260 kB
Mapped: 83848 kB
Shmem: 8864 kB
KReclaimable: 34248 kB
Slab: 82380 kB
SReclaimable: 34248 kB
SUnreclaim: 48132 kB
- 查看硬盘
[root@centos proc]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 2G 0 part /boot
├─sda2 8:2 0 100G 0 part /
├─sda3 8:3 0 4G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 50G 0 part /data
sr0 11:0 1 10.4G 0 rom
[root@centos proc]#cat /proc/partitions
major minor #blocks name
8 0 209715200 sda
8 1 2097152 sda1
8 2 104857600 sda2
8 3 4194304 sda3
8 4 1 sda4
8 5 52428800 sda5
11 0 10889216 sr0
查看系统
- 查看系统架构
[root@centos proc]#arch
x86_64
- 查看内核版本
[root@centos ~]#uname -r
4.18.0-365.el8.x86_64
- 查看系统发行版本
Centos
[root@centos proc]#
[root@centos proc]#cat /etc/redhat-release
CentOS Stream release 8
[root@centos proc]#cat /etc/os-release
NAME="CentOS Stream"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Stream 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"
Ubuntu
[root@Ubuntu ~]#cat /etc/issue
Ubuntu 18.04.6 LTS \n \l
[root@Ubuntu ~]#lsb_release
No LSB modules are available.
[root@Ubuntu ~]#lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.6 LTS
Release: 18.04
Codename: bionic
- 查看OS版本
[root@Ubuntu ~]#lsb_release -is
Ubuntu
[root@Ubuntu ~]#lsb_release -rs
18.04
[root@Ubuntu ~]#lsb_release -cs
bionic
日期和时间
Linux的两种时钟
- 系统时钟:由Linux内核通过CPU的工作频率进行的
- 硬件时钟:主板
date 显示和设置系统时间
[root@centos proc]#date
Fri Apr 8 17:45:10 CST 2022
[root@centos proc]#date +%s
1649410899
[root@centos proc]#date -d @`date +%s`
Fri Apr 8 17:42:02 CST 2022
[root@centos proc]#date -d @1649410899
Fri Apr 8 17:41:39 CST 2022
[root@centos proc]#date -d @1649410899 +%F_%T
2022-04-08_17:41:39
- clock、hwclock显示硬件时钟
-s, --hctosys #以硬件时钟为准,校正系统时钟
-w, --systohc #以系统时钟为准,校正硬件时钟
eg:
[root@centos proc]#ll /usr/sbin/clock
lrwxrwxrwx. 1 root root 7 Feb 25 15:11 /usr/sbin/clock -> hwclock
- 时区
[root@centos etc]#timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
Africa/Bujumbura
Africa/Cairo
Africa/Casablanca
Africa/Ceuta
Africa/Conakry
Africa/Dakar
Africa/Dar_es_Salaam
Africa/Djibouti
Africa/Douala
Africa/El_Aaiun
Africa/Freetown
Africa/Gaborone
Africa/Harare
Africa/Johannesburg
Africa/Juba
Africa/Kampala
Africa/Khartoum
Africa/Kigali
Africa/Kinshasa
Africa/Lagos
Africa/Libreville
[root@centos etc]#timedatectl set-timezone Asia/Shanghai
[root@centos etc]#timedatectl status
Local time: Fri 2022-04-08 18:02:05 CST
Universal time: Fri 2022-04-08 10:02:05 UTC
RTC time: Fri 2022-04-08 10:02:05
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
[root@centos etc]#ll -a localtime
lrwxrwxrwx. 1 root root 35 Apr 5 18:08 localtime -> ../usr/share/zoneinfo/Asia/Shanghai
- 显示日历
cay -y
[root@centos etc]#cal 9 2000
September 2000
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
关机和重启
- 关机
halt
poweroff
- 重启
reboot
-f 强制关机
-p 切断电源
- 关机或重启:shutdown
shutdown [OPTION]... [TIME] [MESSAGE]
-r reboot
-h halt
-c cancel
TIME:无指定,默认相当于+1(CentOS7)
now: 立刻,相当于+0
+#: 相对时间表示法,几分钟之后;例如 +3
hh:mm: 绝对时间表示,指明具体时间
用户登录信息查看
whoami 显示当前登录有效用户
who 系统当前所有登录会话
w 系统当前所有的登录会话及所做操作
[root@centos etc]#whoami
root
[root@centos etc]#who
root pts/0 2022-04-08 15:40 (10.0.0.1)
[root@centos etc]#w
18:12:34 up 2:34, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 15:40 2.00s 0.14s 0.00s w
文本编辑
- nano:可以实现文本的编辑,上手容易适合初学者。另外还有vm/vim较难
- gedit:图形工具
创建登录提示文件 /etc/motd
参考网站: https://www.bootschool.net/ascii-art
[root@centos ~]#cat /etc/motd
会话管理
命令行的典型使用方式是,打开一个终端窗口,在里面输入命令。用户与计算机的这种临时的交互称为一次”会话“
会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束
会话的内部进程也随之结束,不管程序有没有运行完。
典型的例子就是,SSH登录远程计算机,打开一个远程窗口执行命令。若此时网络突然断线,再次登录是找不回上一次执行的命令的。因为上一个SSH会话已经终止了,里面的进程也随之消失。为了解决这个问题我们可以使用终端复用器。
终端复用器就是会话与窗口”解绑“的工具,可以将他们彻底分离。
终端复用器
- 允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
- 可以让新窗口”接入“已经存在的会话。
- 允许每个会话有多个连接窗口,因此可以多人实时共享会话。
- 支持窗口的任意垂直水平拆分
类似的终端复用器有Screen、Tmux
Screen
- 利用screen 可以实现会话管理,如:新建会话,共享会话等
- 注意:CentOS7 来自于base源,CentOS8 来自于epel源
#CentOS7 安装screen
[root@centos7 ~]#yum -y install screen
#CentOS8 安装screen
[root@centos8 ~]#dnf -y install epel-release
[root@centos8 ~]#dnf -y install screen
screen命令常见用法
创建新screen会话
screen –S [SESSION]
加入screen会话
screen –x [SESSION]
退出并关闭screen会话
exit
剥离当前screen会话
Ctrl+a,d
显示所有已经打开的screen会话
screen -ls
恢复某screen会话
screen -r [SESSION]
tmux
tmux相比screen更易用功能也更加强大
- 安装
yum install tmux
- 启动与退出
[root@centos8 ~]#tmux
[root@centos8 ~]#exit
mux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是 Ctrl+b ,即先按下
Ctrl+b ,快捷键才会生效。帮助命令的快捷键是 Ctrl+b ? 然后,按下 q 键,就可以退出帮助
- 新建会话 新建第一个启动的tmux窗口就,编号就是0,依次类推 tmux ls或Ctrl+b,s 可以查看当前所有的 Tmux 会话,也可以新建指定名称的会话
tmux 新建会话窗口 默认是零窗口
tmux new -s king 新建一个窗口名为King
exit 退出窗口
- 查看当前所有会话
tmux ls
tmux list-session
- 分离会话 在 Tmux 窗口中,按下Ctrl+b d或者输入tmux detach命令,就会将当前会话与窗口分离
tmux detach
- 接入会话
tmux attach 命令用于重新接入某个已存在的会话
tmux attach -t king
- 杀死会话
tmux kill-session命令用于杀死某个会话
tmux kill-session -t king
- 切换会话
tmux switch命令用于切换会话
tmux switch -t king
tmux可以将窗口分成多个窗口,每个窗口运行不同的命令
上下分隔窗口
tmux split-window
ctrl+b "
左右分隔窗口
tmux split-window -h
ctrl+b %
- 窗口快捷键
Ctrl+b %:划分左右两个窗格
Ctrl+b ":划分上下两个窗格
Ctrl+b <arrow key>:光标切换到其他窗格。<arrow key>是指向要切换到的窗格的方向键,比如切换
到下方窗格,就按方向键↓
Ctrl+b ;:光标切换到上一个窗格
Ctrl+b o:光标切换到下一个窗格。
Ctrl+b {:当前窗格左移
Ctrl+b }:当前窗格右移
Ctrl+b Ctrl+o:当前窗格上移
Ctrl+b Alt+o:当前窗格下移
Ctrl+b x:关闭当前窗格
Ctrl+b !:将当前窗格拆分为一个独立窗口
Ctrl+b z:当前窗格全屏显示,再使用一次会变回原来大小
Ctrl+b Ctrl+<arrow key>:按箭头方向调整窗格大小
Ctrl+b q:显示窗格编号
- 窗口管理
除了将一个窗口划分为多个窗口,tmux也可以新建多个窗口
新建窗口
tmux new-window
新建一个指定名称的窗口
tmux new-window -n king
- 切换窗口
按指定编号切换
tmux select-window -t 0
按指定名称切换
tmux select-window -t king
- 窗口快捷键
Ctrl+b c:创建一个新窗口,状态栏会显示多个窗口的信息。
Ctrl+b p:切换到上一个窗口(按照状态栏上的顺序)。
Ctrl+b n:切换到下一个窗口。
Ctrl+b <number>:切换到指定编号的窗口,其中的<number>是状态栏上的窗口编号
Ctrl+b w:从列表中选择窗口
Ctrl+b ,:窗口重命名
列出所有快捷键
tmux list-keys
列出所有tmux命令及其参数
tmux list-commands
输出信息echo
echo基本用法
echo 命令可以将后面跟的字符进行输出
功能:显示字符,echo会将输出的字符串标准输出。输出的字符串以空白字符隔开,并在最后加上换行号
语法:
echo [-Ene][字符串]
-E (默认)不支\解释功能
-n 不自动换行
-e 启用\字符解释功能
显示变量
echo "$VAR_NAME” #用变量值替换,弱引用
echo '$VAR_NAME’ #变量不会替换,强引用
[root@centos ~]#echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos ~]#echo '$PATH'
$PATH
启用命令选项-e,若字符串中出现以下字符,特别处理,不会当成一般文章输出
\a 发出警告声
\b 退格键
\c 最后不加上换行符号
\e escape,相当于\033
\n 换行且光标移至行首
\r 回车,即光标移至行首,但不换行
\t 插入tab
\\ 插入\字符
\0nnn 插入nnn(八进制)所代表的ASCII字符
\xHH插入HH(十六进制)所代表的ASCII数字(man 7 ascii)
[root@centos ~]#echo -e 'a\x0Ab'
a
b
插入tab
[root@centos ~]#
[root@centos ~]#echo -e 'ki\tng'
ki ng
- 设置输出的颜色
echo高级用法
在终端中,ANSI定义了用于屏幕显示的Escape屏幕控制码
具有颜色的字符,其格式如下
"\033[字符背景颜色;字体颜色m字符串\033[0m"
- \033[30m – \033[37m 设置前景色
- \033[40m – \033[47m 设置背景色
#字符背景颜色范围: 40--47
40:黑
41:红
42:绿
43:黄
44:蓝
45:紫
46:深绿
47:白色
#字体颜色: 30--37
30: 黑
31: 红
32: 绿
33: 黄
34: 蓝
35: 紫
36: 深绿
37:白色
- 一些常见ANSI控制码
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n列
\033[nD 光标左移n列
\033[x;yH 设置光标位置x行y列
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
\033[2J\033[0;0H 清屏且将光标置顶
字符集和编码
- 字符集和编码是两个不同的概念
- 字符集:即二进制和字符的对应关系,不关注最终的存储方式
- 编码 :即字符集编码,简称编码,实现如何将字符转化为实际的二进制进行存储,编码决定了空间的使用大小
ASCII码
计算机内部,所有信息最终都是一个二进制值。规定英语字符对应二进制位制之间的关系,做了统一规定,
即ASCII码
ASCII码一共规定了128个字符的编码,占用了一个字节的后面7位,最前面一位统一规定为0
查看ASCII码
[root@centos ~]#dnf -y install man-pages
[root@centos ~]#man ascii
Unicode
由于计算机是美国人发明的,因此最早只有127个字母被编码到计算机里,即ASCII编码,但是要处理中文一个字节显然是不够的,至少需要2个字节,而且还不能跟ASCII编码冲突,所有中国制定了GB2312编码,用来把中文编进去
全世界有上百种语言,日本把日文编到Shift_JIS里面,韩国把韩文编入Euc-kr里,各国有各国的标准,就会出现冲突,结果就是在多语言的文本中,出现各种乱码
为了解决这种情况,Unicode被发明出来,目前Unicode可以容纳100多万个符号。
- Unicode编码方案
UTF-8 : 变长,1到4个字节
UTF-16: 变长,2或4个字节
UTF-32: 固定长度,4个字节
几个编码查询和转换链接
https://home.unicode.org/
https://unicode.yunser.com/unicode
http://www.chi2ko.com/tool/CJK.htm
https://www.bejson.com/convert/unicode_chinese/
https://javawind.net/tools/native2ascii.jsp?action=transform
http://tool.oschina.net/encode
http://web.chacuo.net/charsetescape
- Unicode转换为UTF-8
“汉”的 Unicode 码 0x6C49(110 110001 001001),需要三个字节存储,格式为: 1110xxxx
10xxxxxx 10xxxxxx,从后向前依次填充对应格式中的 x,多出的 x 用 0 补,得出UTF-8 编码为
11100110 10110001 10001001
“马”的 Unicode 码 0x9A6C(1001 101001 101100),需要三个字节存储,格式为: 1110xxxx
10xxxxxx 10xxxxxx,从后向前依次填充对应格式中的 x,多出的 x 用 0 补,得出UTF-8 编码为
11101001 10101001 10101100
- 修改LANG变量实现中文语言提示
[root@centos ~]#echo $LANG
en_US.UTF-8
[root@centos ~]#king
-bash: king: command not found
[root@centos ~]#LANG=zh_CN.UTF-8
[root@centos ~]#echo $LANG
zh_CN.UTF-8
[root@centos ~]#king
命令行扩展和括号扩展
命令行扩展 ``和$()
- 把一个命令的输出打印给另一个命令的参数,放在 `` 中的一定是有输出信息的命令
- $(COMMAND) 或
COMMAND
- " " ’ ’ ``(双引号、单引号、反引号的区别)
[root@centos ~]#echo $HOSTNAME
centos.bruce.cn
[root@centos ~]#echo "echo $HOSTNAME"
echo centos.bruce.cn
[root@centos ~]#echo 'echo $HOSTNAME'
echo $HOSTNAME
[root@centos ~]#echo `echo $HOSTNAME`
centos.bruce.cn
结论:
双引号:弱引用,不能识别命令,可以识别变量,”半傻不精“。
单引号:强引用,变量和命令都不能识别,都当成了普通的字符串,”最傻“。
反引号:反引号里面的内容必须是能执行的命令且有输出信息,
变量和命令都能够识别并且会将反引号里面的命令进行执行后,再交给调用反引号的命令继续,”最聪明“。
- $() 和 ``
[root@centos ~]#ll `echo `date + %F`.txt`
-bash: .txt: command not found
ls: cannot access 'date': No such file or directory
ls: cannot access '+': No such file or directory
ls: cannot access '%F': No such file or directory
[root@centos ~]#ll $(echo $(date +%F).txt)
ls: cannot access '2022-04-09.txt': No such file or directory
[root@centos ~]#ll `echo $(date +%F).txt`
ls: cannot access '2022-04-09.txt': No such file or directory
[root@centos ~]#ll $(echo `date +%F`.txt)
ls: cannot access '2022-04-09.txt': No such file or directory
括号扩展 {}
{} 可以实现打印重复字符串的简化形式
{元素1,元素2,元素3}
{元素1..元素2}
eg:
echo file{1,3,5}
结果为:file1 file3 file5
rm -f file{1,3,5}
echo {1..10}
echo {a..z}
echo {1..10..2}
echo {000..20..2}
[root@centos ~]#echo {00..18..2}
00 02 04 06 08 10 12 14 16 18
[root@centos ~]#echo {a..z..3}
a d g j m p s v y
[root@centos ~]#echo {A..z..4}
A E I M Q U Y ] a e i m q u y
关闭和开启{}扩展功能
[root@centos ~]#echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@centos ~]#set +B
[root@centos ~]#echo {1..10}
{1..10}
[root@centos ~]#set -B
[root@centos ~]#echo {1..10}
1 2 3 4 5 6 7 8 9 10
结论:
set -B 开启功能
set +B 关闭功能
tab键补全
tab键可以实现命令、路径、文件名等补全
命令补全
bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻以给定命令名命名的文
件,第一次找到的命令即为要执行的命令
命令的子命令补全,需要安装 bash-completion
路径补全
把用户给出的字符串当做路径开头,并在其指定上级目录下搜索以指定的字符串开头的文件名
如果惟一:则直接补全
否则:再次Tab给出列表
双击tab键
command 2Tab 所有子命令或文件补全
string2Tab 以string开头命令
/2Tab 显示所有根目录下一级目录,包括隐藏目录
./2Tab 当前目录下子目录,包括隐藏目录
*2Tab 当前目录下子目录,不包括隐藏目录
~2Tab 所有用户列表
$2Tab 所有变量
@2Tab /etc/hosts记录 (centos7 不支持)
=2Tab 相当于ls –A (centos7不支持)
注:
不是将tab键输入bash终端,而是手动按键盘上的tab键
命令行历史
- 当执行命令后,系统默认会在内存记录执行过的命令 当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是 ~/.bash_history
history [-c] [-d offset] [n]
history -anrw [filename]
history -ps arg [arg...]
常用选项:
-c: 清空命令历史
-d offset: 删除历史中指定的第offset个命令
n: 显示最近的n条历史
-a: 追加本次会话新执行的命令历史列表至历史文件
-r: 读历史文件附加到历史列表
-w: 保存历史列表到指定的历史文件
-n: 读历史文件中未读过的行到历史列表
-p: 展开历史参数成多行,但不存在历史列表中
-s: 展开历史参数成一行,附加在历史列表后
命令历史相关环境变量
HISTSIZE:命令历史记录的条数
HISTFILE:指定历史文件,默认为~/.bash_history
HISTFILESIZE:命令历史文件记录历史的条数
HISTTIMEFORMAT="%F %T `whoami` " 显示时间和用户
HISTIGNORE="str1:str2*:…" 忽略str1命令,str2开头的历史
HISTCONTROL:控制命令历史的记录方式
ignoredups 是默认值,可忽略重复的命令,连续且相同为“重复”
ignorespace 忽略所有以空白开头的命令
ignoreboth 相当于ignoredups, ignorespace的组合
erasedups 删除重复命令
保存变量
以上变量可以 export 变量名=“值” 形式存放在 /etc/profile 或 ~/.bash_profile
[root@centos ~]#cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
export HISTCONTROL=ignoreboth
export HISTTIMEFORMAT="%F %T "
[root@centos /]#history
1 2022-04-09 18:42:36 history
2 2022-04-09 18:42:45 history n
3 2022-04-09 18:45:48 HISTSIZE
4 2022-04-09 18:45:59 HISTTIMEFORMAT="%F %T `whoami` "
5 2022-04-09 18:46:04 history
6 2022-04-09 18:46:18 hostname
7 2022-04-09 18:46:21 history
8 2022-04-09 18:48:02 [root@centos8 ~]#cat .bash_profile
9 2022-04-09 18:48:02 # .bash_profile
10 2022-04-09 18:48:02 # Get the aliases and functions
调用命令行历史
#重复前一个命令方法
重复前一个命令使用上方向键,并回车执行
按 !! 并回车执行
输入!-1 并回车执行
按 Ctrl+p 并回车执行
!:0 执行前一条命令(去除参数)
!n 执行history命令输出对应序号n的命令
!-n 执行history历史中倒数第n个命令
!string 重复前一个以“string”开头的命令
!?string 重复前一个包含string的命令
!string:p 仅打印命令历史,而不执行
!$:p 打印输出 !$ (上一条命令的最后一个参数)的内容
!*:p 打印输出 !*(上一条命令的所有参数)的内容
^string 删除上一条命令中的第一个string
^string1^string2 将上一条命令中的第一个string1替换为string2
!:gs/string1/string2 将上一条命令中所有的string1都替换为 string2
使用up(向上)和down(向下)键来上下浏览从前输入的命令
ctrl-r来在命令历史中搜索命令
(reverse-i-search)`’:
Ctrl+g:从历史搜索模式退出
#要重新调用前一个命令中最后一个参数
!$ 表示前一个命令中最后一个参数
Esc, . 点击Esc键后松开,然后点击 . 键
Alt+ . 按住Alt键的同时点击 . 键
command !^ 利用上一个命令的第一个参数做command的参数
command !$ 利用上一个命令的最后一个参数做command的参数
command !* 利用上一个命令的全部参数做command的参数
command !:n 利用上一个命令的第n个参数做command的参数
command !n:^ 调用第n条命令的第一个参数
command !n:$ 调用第n条命令的最后一个参数
command !n:m 调用第n条命令的第m个参数
command !n:* 调用第n条命令的所有参数
command !string:^ 从命令历史中搜索以 string 开头的命令,并获取它的第一个参数
command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它的最后一个参数
command !string:n 从命令历史中搜索以 string 开头的命令,并获取它的第n个参数
command !string:* 从命令历史中搜索以 string 开头的命令,并获取它的所有参数
bash的快捷键
Ctrl + l 清屏,相当于clear命令
Ctrl + o 执行当前命令,并重新显示本命令
Ctrl + s 阻止屏幕输出,锁定
Ctrl + q 允许屏幕输出,解锁
Ctrl + c 终止命令
Ctrl + z 挂起命令
Ctrl + a 光标移到命令行首,相当于Home
Ctrl + e 光标移到命令行尾,相当于End
Ctrl + f 光标向右移动一个字符
Ctrl + b 光标向左移动一个字符
Ctrl + xx 光标在命令行首和光标之间移动
Alt + f 光标向右移动一个单词尾
Alt + b 光标向左移动一个单词首
Ctrl + u 从光标处删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Alt + r 删除当前整行
Ctrl + w 从光标处向左删除至单词首
Alt + d 从光标处向右删除至单词尾
Alt + Backspace 删除左边单词
Ctrl + d 删除光标处的一个字符
Ctrl + h 删除光标前的一个字符
Ctrl + y 将删除的字符粘贴至光标后
Alt + c 从光标处开始向右更改为首字母大写的单词
Alt + u 从光标处开始,将右边一个单词更改为大写
Alt + l 从光标处开始,将右边一个单词更改为小写
Ctrl + t 交换光标处和之前的字符位置
Alt + t 交换光标处和之前的单词位置
Alt + # 提示输入指定字符后,重复显示该字符#次
获取帮助
- whatis
- command --help
- man and info
- /usr/share/doc/
- Red Hat documentation 、Ubuntu documentation
- 软件项目网站
- 其它网站
- 搜索
whatis
- whatis 使用数据库来显示命令的简短描述 此工具在系统刚安装后,不可立即使用,需要制作数据库后才可使用 。
- 执行下面命令生成数据库
Centos 7 之后:
mandb
Centos 6 之前:
makewhatis
查看命令的帮助
内部命令帮助
help COMMAND
man bash
外部命令及软件帮助
- COMMAND --help 或 COMMAND -h
- 使用 man 手册(manual): man COMMAND
- 信息页:info COMMAND
- 程序自身的帮助文档:README、INSTALL、ChangeLog
- 程序官方文档
- 相关网站,如:技术论坛
- 搜索引擎
外部命令的–help或-h选项
显示用法总结和参数列表,大多数命令使用,但并非所有
[root@centos ~]#date --help
Usage: date [OPTION]... [+FORMAT]
or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.
[root@centos ~]#cal -h
Usage:
cal [options] [[[day] month] year]
cal [options] <timestamp|monthname>
[root@centos ~]#date -h
date: invalid option -- 'h'
Try 'date --help' for more information
格式说明:
- [] 表示可选项
- CAPS或 <> 表示变化的数据
- … 表示一个列表
- x |y| z 的意思是“ x 或 y 或 z ”
- -abc的 意思是 -a -b –c
- { } 表示分组
man命令
- man 提供命令帮助的文件,手册页存放在/usr/share/man
几乎每个命令都有man的“页面” - 中文man需安装包
- man-pages
- man-pages-zh-CN
man页面分组
不同类型的帮助称为不同的“章节”,统称为Linux手册,man 1 man
1:用户命令
2:系统调用
3:C库调用
4:设备文件及特殊文件
5:配置文件格式
6:游戏
7:杂项
8:管理类的命令
9:Linux 内核API
格式:
MANPATH /PATH/TO/SOMEWHERE #指明man文件搜索位置
指定位置下搜索COMMAND命令的手册页并显示
man -M /PATH/TO/SOMEWHERE COMMAND
查看man手册页
man [OPTION...] [SECTION] PAGE...
man [章节] keyword
man 帮助段落说明
- NAME 名称及简要说明
SYNOPSIS 用法格式说明
[] 可选内容
<> 必选内容
a|b 二选一
{ } 分组
... 同一内容可出现多次
DESCRIPTION 详细说明
OPTIONS 选项说明
EXAMPLES 示例
FILES 相关文件
AUTHOR 作者
COPYRIGHT 版本信息
REPORTING BUGS bug信息
SEE ALSO 其它帮助参考
- man命令的操作方法:使用less命令实现
space, ^v, ^f, ^F: 向文件尾翻屏
b, ^b: 向文件首部翻屏
d, ^d: 向文件尾部翻半屏
u, ^u: 向文件首部翻半屏
RETURN, ^N, e, ^E or j or ^J: 向文件尾部翻一行
y or ^Y or ^P or k or ^K:向文件首部翻一行
q: 退出
#:跳转至第#行
1G: 回到文件首部
#CentOS 6 之前版 man 的配置文件
/etc/man.config
#CentOS 7 之后版 man 的配置文件
/etc/man_db.conf
#ubuntu man 的配置文件
/etc/manpath.config
MANPATH /PATH/TO/SOMEWHERE #指明man文件搜索位置
man -M /PATH/TO/SOMEWHERE COMMAND
man [OPTION...] [SECTION] PAGE...
man [章节] keywordG:翻至文件尾部
/KEYWORD
以KEYWORD指定的字符串为关键字,从当前位置向文件尾部搜索;不区分字符大小写
n:下一个
N:上一个
?KEYWORD
以KEYWORD指定的字符串为关键字,从当前位置向文件首部搜索;不区分字符大小写
n:跟搜索命令同方向,下一个
N:跟搜索命令反方向,上一个
- 常用选项
列出所有帮助
man -a keyword
搜索man手册
#列出所有匹配的页面,使用 whatis 数据库
man -k keyword
相当于whatis
man -f keyword
打印man帮助文件的路径
man -w [章节] keyword
- 查看慢帮助文件路径
[root@centos ~]#whereis man
man: /usr/bin/man /usr/share/man /usr/share/man/man7/man.7.gz /usr/share/man/man1/man.1.gz /usr/share/man/man1p/man.1p.gz
info
man常用于命令参考 ,GNU工具 info 适合通用文档参考没有参数,列出所有的页面,info 页面的结构就像一个网站每一页分为“节点”链接节点之前 *
info [命令]
info页导航
方向键:PgUp,PgDn 导航
Tab键: 移动到下一个链接
d: 显示主题目录
Home: 显示主题首部
Enter:进入 选定链接
n/p/u/l: 进入下/前/上一层/最后一个链接
s :文字 文本搜索
q :退出 info
系统及第三方应用官方文档
在线文档
[http://www.github.com](http://www.github.com)
https://www.kernel.org/doc/html/latest/
http://httpd.apache.org
http://www.nginx.org
https://mariadb.com/kb/en
https://dev.mysql.com/doc/
http://tomcat.apache.org
https://jenkins.io/zh/doc/
https://kubernetes.io/docs/home/
https://docs.openstack.org/train/
http://www.python.org
http://php.net
Linux官方在线文档和知识库
http://kbase.redhat.com
http://www.redhat.com/docs
http://access.redhat.com
https://help.ubuntu.com/lts/serverguide/index.html
http://tldp.org
相关搜索网站
http://www.google.com
http://www.bing.com
http://www.slideshare.net/