tty 命令可以查看当前所在的终端
范例:
# tty 可以查看当前所在的终端
$ tty
/dev/pts/1
$ who am i
root pts/1 2022-05-03 01:37 (120.229.46.163)
$ who
root pts/0 2022-05-03 01:30 (120.229.46.163)
root pts/1 2022-05-03 01:37 (120.229.46.163)
$ w
01:47:52 up 4 days, 14:35, 2 users, load average: 0.04, 0.08, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 120.229.46.163 01:30 8.00s 14:17 0.02s vim /etc/hostna
root pts/1 120.229.46.163 01:37 0.00s 0.02s 0.00s w
交互式接口:启动终端后,在终端设备附加一个交互式应用程序
硬件:计算机设备的硬件,例如:处理器,内存,存储等等硬件设备;
内核:即是操作系统的核心;内核是操作系统最基本的部分,但不是操作系统的全部。内核负责管理系统的进程、内存、设备驱动程序,文件和网络系统,决定着系统的性能和稳定性。而操作系统一般包括内核、驱动程序、接口库等等组成部分。
系统调用:用户想要使用操作系统是需要通过接口来访问的,这些接口就是系统调用。
Shell 是 Linux 系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。Shell 也被称为 Linux 的命令解释器(Command Interpreter)Shell 是一种高级程序设计语言。
Shell本身就是一个程序,将用户输入的命令行拆解为"命令名" 与 “参数”。接着,根据命令名找到对应要执行的程序,对被执行的程序进行初始化,然后将刚才解析出来的参数传递给该程序并执行
Shell 是一种高级程序设计语言,提供了变量,函数,条件判断,循环等开发语言的功能
由于Shell 本身是个程序,所以它可以被任何用户自己开发的各种Shell所代替。
GNU Bourne-Agent Shell(bash)是GNU计划中最重要的工具软件之一,目前也是Linux标准的shell,与sh 兼容。
显示当前使用的shell
echo $SHELL
显示当前系统使用的所有shell
cat /etc/shells
# 安装shell
yum install -y csh # 可以在/etc/shells中查看新安装shell
# 临时生效,可以生效,但是系统重启后无法持久保存
hostname NAME
# 持久生效,支持CentOS7和Ubuntu18.04以上的版本使用
hostnamectl set-hostname NAME
范例:
$ hostnamectl set-hostname bj-yz-k8s-node01-100-10.kubesphere.com
# 主机名不要使用下划线
$ hostname centos7_3.kubesphere.io
hostname: the specified hostname is invalid
注意:
范例:
$ hostnamectl set-hostname docker.kubesphere.io
# 主机名保存的配置文件
$ cat /etc/hostname
docker.kubesphere.io
# 当使用非法的主机名时,可能会导致某些服务启动失败的情况
$ hostname centos8.1 # 主机名不支持小数点
$ systemctl restart postfix
Job for postfix.service failed because the control process exited with error code.
See "systemctl status postfix.service" and "journalctl -xe" for details.
登录 Linux 后,默认的系统命令提示符毫无没有个性,无法明显辨别生产和测试回家,而导致误操作,可以通过修改 PS1 变量实现个性的提示符格式,避免这种低级错误发生。
范例:默认的提示符
# CentOS默认的命令提示符
[root@centos8 ~]#
# Ubuntu默认的命令提示符
root@docker:~#
#:管理员
$:普通用户
显示操作符格式
[root@centos8 ~]# echo $PS1
[\u@\h \W]\$
修改提示符格式范例
# \[\e[1;5;41;33m\]中 1:代表高亮显示;5:代表闪烁;41;提示符的背景颜色;33:提示符颜色;0m:终止颜色渲染
PS1="\[\e[1;5;41;33m\][\u@\h \W]\\$\[\e[0m\]"
PS1="\[\e[1;32m\][\[\e[0m\]\t \[\e[1;33m\]\u\[\e[36m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"
提示符格式说明:
范例:持久保存 PS1 格式
# CentOS系统持久保存提示符格式
echo 'PS1="\[\e[1;32m\][\[\e[0m\]\t \[\e[1;33m\]\u\[\e[36m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$ "' > /etc/profile.d/env.sh
echo 'PS1="\[\e[1;33m\][\u@\h \W]\\$\[\e[0m\] "' > /etc/profile.d/env.sh
source /etc/profile.d/env.sh
# Ubuntu系统持久保存提示符格式
echo 'PS1="\[\e[1;32m\][\[\e[0m\]\t \[\e[1;33m\]\u\[\e[36m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$ "' >> .bashrc
echo 'PS1="\[\e[1;33m\][\u@\h \W]\\$\[\e[0m\] "' >> .bashrc
tail -n1 .bashrc
输入命令后回车,提请 Shell 程序找到键入命令所对应的可执行程序或者代码,并由其分析后提交给内核分配资源将其运行起来。
区别指定的命令时内部或者外部命令
type COMMAND
范例:查看是否存在对应的内部命令和外部命令
$ type echo
echo is a shell builtin
# 查看是否存在对应的内部命令和外部命令
$ type -a echo
echo is a shell builtin # 内部命令
echo is /usr/bin/echo
$ type -a type
type is a shell builtin # 内部命令
type is /usr/bin/type
$ type -a hostname
hostname is /usr/bin/hostname # 外部命令
# 查看内部所有命令,内部命令是集成在Shell中的,不同的Shell集成的内部命令数量不同
$ enable
...
$ enable | wc -l
61
help 内部命令列表
enable 管理内部命令
$ enable help
# 禁用内部命令
$ enable -n help
$ enable -n
enable -n help
# 启用内部命令
$ enable help
查看外部命令路径:
which -a |--skip-alias
whereis
Hash缓存表 系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率。
hash 命令常见用法:
# CentOS系统进行下载firefox
yum install -y firefox
export DISPLAY=10.0.0.1:0.0 # export DISPLAY=:0.0
firefox
# 可能会需要进行下载相关依赖库
yum provides libGL.so.1 # <库名>
yum install -y libglvnd-glx
firefox # 直接运行即可
# 如果使用mobaxterm工具连接CentOS
# 需要安装插件
yum install -y xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 firefox
exit
firefox # 直接运行即可
# Ubuntu系统进行下载firefox
apt install -y firefox
firefox # 直接运行即可
alias cdnet='cd /etc/sysconfig/network-scripts/'
alias cdyum='cd /etc/yum.repos.d/'
alias nm='systemctl restart NetworkManager'
alias disepel='sed -ri /enabled/s/enabled=1/enabled=0/ /etc/yum.repos.d/base.repo'
alias egrep='egrep --color=auto'
alias epel='sed -ri /enabled/s/enabled=0/enabled=1/ /etc/yum.repos.d/base.repo'
alias fgrep='fgrep --color=auto'
alias i.='ls -d .* --color=auto'
alias lh='ls -lh --color=auto'
alias p='poweroff'
alias restart='systemctl restart '
alias restartnet='systemctlrestart network"
alias scandisk='echo "- - -" > /sys/class/scsi_host/host0/scan;\
echo "- - -" > /sys/class/scsi_host/host1/scan;\
echo "- - -" > /sys/class/scsi_host/host2/scan'
alias vie0='vim /etc/sysconfig/network-scripts/ifcfg-eth0'
alias vie1='vim /etc/sysconfig/network-scripts/ifcfg-eth1'
alias xzfgrep='xzfgrep --color=auto'
alias xzgrep=' xzgrep --color=auto'
alias yr='yum remove'
alias yy='yum -y install'
alias zegrep='zegrep --color=auto'
alias zfgrep='zfgrep --color=auto'
alias zgrep='zgrep --color=auto'
对于经常执行的较长的命令,可以将其定义成较短的别名,以方便执行
显示当前shell进程所有可用的命令别名 alias
定义别名NAME,其相当于执行命令VALUE
alias NAME='VALUE'
范例:扫描新加的磁盘
alias scandisk='echo "- - -" > /sys/class/scsi_host/host0/scan;\
echo "- - -" > /sys/class/scsi_host/host1/scan;\
echo "- - -" > /sys/class/scsi_host/host2/scan'
$ type scandisk
scandisk is aliased to `echo "- - -" > /sys/class/scsi_host/host0/scan;\
echo "- - -" > /sys/class/scsi_host/host1/scan;\
echo "- - -" > /sys/class/scsi_host/host2/scan'
范例:持久保存别名
$ vim ~/.bashrc
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 进程有效;
如果想永久有效,要定义在配置文件中
编辑配置给出的新配置不会立刻生效,bash 进程重新读取配置文件
source /path/to/config_file
. /path/to/config_file
如果别名同原命令同名,如果想要执行原命令,可使用:
\ALIASNAME
"ALIASNAME"
'ALIASNAME'
command ALIASNAME
/path/command
$ alias hostname=who
$ hostname
root pts/5 2022-05-02 13:05 (10.0.0.1)
$ \hostname
CentOS8-Server
$ 'hostname'
CentOS8-Server
# 撤销别名
$ unalias hostname
命令执行过程:命令别名 > 内部命令 > 命令Hash缓存 > 外部命令
第一次执行外部命令优先级:命令别名 > 内部命令 > Hash 缓存表 > 外部命令(查找$PATH路径)。
COMMAND [OPTIONS…] [ARGUMENTS…]
COMMAND [COMMAND…] [COMMAND…] …
选项:用于启用或关闭命令的某个或某些功能
参数:命令的作用对象,比如:文件名,用户名等
范例:
$ id -u zzw
1000
$ ls -a | ls --all
$ free -h | free --human
$ ps aux
注意:
lscpu 命令可以查看 CPU 信息
cat /proc/cpuinfo 也可以查看到
范例:
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4 # 4core
# 最多同时开4个同时执行的任务,一个任务占用一个内核
# 一般任务的数量和CPU内核的数量尽可能统一
# 因为,任务如果太多,会产生一个问题就是CPU会进行来回的切换
# CPU的个数就决定了它能同时执行任务的个数
On-line CPU(s) list: 0-3
Thread(s) per core: 1 # 每个core 有几个线程
Core(s) per socket: 2 # 每个槽位有2core
Socket(s): 2 # 服务器面板上有2个CPU槽位
NUMA node(s): 2 # nodes的数量
Vendor ID: AuthenticAMD
BIOS Vendor ID: AuthenticAMD
CPU family: 23
Model: 113
Model name: AMD Ryzen 7 3700X 8-Core Processor
BIOS Model name: AMD Ryzen 7 3700X 8-Core Processor
Stepping: 0
CPU MHz: 3600.013
BogoMIPS: 7200.02
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 512K
L3 cache: 16384K
NUMA node0 CPU(s): 0,2,4,6 # 对应的core
NUMA node1 CPU(s): 1,3,5,7
# 可以查看单独的CPU的信息
$ cat /proc/cpuinfo
$ free
total used free shared buff/cache available
Mem: 3799012 532704 1908780 10132 1357528 2967392
Swap: 4194300 0 4194300
# 展示人类可读的输出
$ free -h
total used free shared buff/cache available
Mem: 3.6Gi 520Mi 1.8Gi 9.0Mi 1.3Gi 2.8Gi
Swap: 4.0Gi 0B 4.0Gi
$ cat /proc/meminfo
MemTotal: 3799012 kB # 内存的总大小
MemFree: 1908852 kB # 内存可用的大小
MemAvailable: 2967464 kB
Buffers: 200 kB
Cached: 1095516 kB
...
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 2G 0 part /boot
├─sda2 8:2 0 100G 0 part /
├─sda3 8:3 0 100G 0 part /data
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 4G 0 part [SWAP]
$ cat /proc/partitions
major minor #blocks name
8 16 104857600 sdb
8 0 524288000 sda
8 1 2097152 sda1
8 2 104857600 sda2
8 3 104857600 sda3
8 4 1 sda4
8 5 4194304 sda5
$ arch
x86_64
# 可以获取全部系统信息
$ getconf -a
$ getconf LONG_BIT
lscpu | grep Architecture
Architecture: x86_64
$ uname -r
4.18.0-305.3.1.el8.x86_64
$ uname -a
Linux CentOS8-Server 4.18.0-305.3.1.el8.x86_64
#1 SMP Tue Jun 1 16:14:33 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
### CentOS查看操作系统发行版本
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
### lsb_release: command not found 解决方法:
$ yum install -y redhat-lsb-core
$ lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.9.2009 (Core)
Release: 7.9.2009
Codename: Core
### Ubuntu查看操作系统发行版本
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
$ cat /etc/issue
Ubuntu 20.04.2 LTS \n \l
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
范例:查看OS版本
$ lsb_release -is
Ubuntu
$ lsb_release -cs
focal
$ lsb_release -rs
20.04
Linux 的两种时钟:
相关命令:
范例:
$ date +%s
1651555049
$ date -d @`date +%s`
Tue May 3 13:17:45 CST 2022
$ date -d @1651555049
Tue May 3 13:17:29 CST 2022
$ date -d "2020-02-02" +%s
1580572800
$ clock --help
-s, --hctosys set the system time from the RTC
-w, --systohc set the RTC from the system time
# RTC:一般指实时时钟,是在主板集成电路芯片上的时间
范例:
$ ls -l /usr/sbin/clock
lrwxrwxrwx. 1 root root 7 Jan 21 2021 /usr/sbin/clock -> hwclock
时区
/etc/localtime
### 设置时区
# 列出所有的时区
$ timedatectl list-timezones
# 查看当前系统的时区情况
$ timedatectl status
Local time: Tue 2022-05-03 13:27:34 CST
Universal time: Tue 2022-05-03 05:27:34 UTC
RTC time: Tue 2022-05-03 05:27:39
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
# 设置时区
$ timedatectl set-timezone Asia/Shanghai
$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 Jul 11 2021 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
显示日历
# 显示当前月份的日历
$ cal
# 显示整一年的日历
$ cal -y
范例:
$ cal 9 1752
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
# 从1752年9月3日到1752年9月13日的11天并不存在。
# 抹掉这11天是由英国议会做出的决定。所以要计算某年每个月的天数的,除了要考虑是否是闰年以外,还要考虑1752年的9月。
关机:
重启:
关机或者重启:shutdown
shutdown [OPTIONS] ... [TIME] [MESSAGE]
-r : reboot 重启
-h :halt 关机
-c :cancel 取消 shutdown 选项
TIME :无指定,默认相当于 +1(CentOS 7)
$ uptime
13:46:43 up 7:38, 1 user, load average: 0.00, 0.00, 0.00
范例:创建登录提示文件 /etc/motd
$ yum install -y nano
$ nano /etc/motd
welcome to kubepshere.docker
参考网站:https://bootschool.net/ascii-art
# 登录后提示信息
$ cat /etc/motd
welcome to kubepshere.docker
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
# 登录前提示信息
$ cat /etc/issue
\S
Kernel \r on an \m
命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口”),在里面输入命令,用户与计算机的这种临时的交互,称为一次会话”(session)
会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完
一个典型的例子就是,SSH登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次SSH会话已经终止了,里面的进程也随之消失了。为了解决这个问题,会话与窗口可以’解绑︰窗口关闭时,会活并不终止,而是继续运行,等到以后需要的时候,再让会话^绑定"“其他窗口
终端复用器软件就是会话与窗口的"解绑”"工具,将它们彻底分离。
(1)它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
(2)它可以让新窗口"接入"已经存在的会话。
(3)它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
(4)它还支持窗口任意的垂直和水平拆分。
类似的终端复用器还有Screen,Tmux
利用 screen 可以实现会话管理,如:新建会话,共享会话
注意:CentOS 7来自于 base 源,CentOS 8 来自于 epel 源
范例:安装 screen
# CentOS7 安装 screen 软件
$ yum install -y screen
# CentOS8 安装 screen 软件
$ dnf install -y epel-release
$ dnf install -y screen
Tmux 是一个终端复用器(Terminal Multiplexer),类似 screen,但是要易用,也要强大。
Tmux就是会话与窗口的"解绑""工具,将它们彻底分离,功能如下
安装
# 安装Tmux
$ yum install -y tmux
启动与退出
$ tmux
$ exit
[exited]
Tmux 窗口有大量的快捷键,所有快捷键都要通过前缀唤起。默认的前缀是 Ctrl + B,即先按下 Ctrl + B,快捷键才会生效。帮助命令的快捷键是 Ctrl + B , 然后,按下 Q 键,就可以退出帮助。
新建会话
第一个启动的 Tmux 窗口,编号为 0,第二个窗口的编号为 1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。使用编号区分会话,不太直观,更好的方法是为会话起名。下面命令新建一个指定名称的会话。
tmux new -s <seesion-name>
Tmux ls 或者 Ctrl + B,S 可以查看所有的 Tmux 会话。
tmux ls
tmux list-session
分离会话
在 Tmux 窗口中,按下 Ctrl + B 或者输入 tmux detach 命令,就会将当前会话与窗口分离。
tmux detach
接入会话
tmux attach 命令用于重新接入某个已存在的会话。
tmux attach -t <seesion-name>
范例:
tmux attach -t 0
杀死会话
tmux kill-session 命令用于杀死某个会话。
tmux kill-session -t <session-name>
切换会话
tmux switch 命令用于切换会话。
tmux switch -t <session>
可以将窗口分成多个窗格(pane),每个窗格运行不同的命令
上下分窗格
tmux split-window
Ctrl + B , "
左右分窗格
tmux split-window -h
Ctrl + B , %
窗格快捷键
Ctrl + B %:划分左右两个窗格。
Ctrl + B ":划分上下两个窗格。
Ctrl + B :光标切换到其他窗格。 是指向要切换到下方窗格,就按方向键。
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 + :按箭头方向调整窗格大小。
Ctrl + B q :显示窗格编号。
窗口管理
除了将一个窗口划分成多个窗格,Tmux 也允许新建多个窗口。
新建窗口
tmux new-windows 命令用来创建新窗口。
tmux new-windows
新建一个指定名称的窗口
tmux new-windows -n <windows-name>
切换窗口
tmux select-windows 命令用来切换窗口
切换到指定编号的窗口
tmux select-windows -t <windows-number>
切换到指定名称的窗口
tmux select-windows -t <windows-name>
列出所有快捷键,及其对应的 Tmux 命令
tmux list-keys
列出所有 Tmux 命令及其参数
tmux list-commands
echo 命令可以将后面跟的字符进行输出
功能:显示字符,echo 会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行符号。
语法:
echo [-neE] [字符串]
选项:
显示变量
echo "$VAR_NAME":#变量会替换,弱引用
echo '$VAR_NAME':#变量不会替换,强引用
启用命令选项 -e,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出;
范例:
## 字体颜色
31:红色
32:绿色
33:黄色
34:蓝色
35:粉色
36:浅蓝色
37:白色
# ----- #
## 背景颜色
41:红色背景
42:绿色背景
43:黄色背景
44:蓝色背景
45:粉色背景
46:浅蓝色背景
47:白色背景
# ----- #
$ echo -e '\033[43;41;5m magedu \e[0m'
$ echo -e "\E[1;31mwww.kubesphere.com\E[0m"
$ echo -e '\033[31m hello \033[0m'
$ echo -e "\033[1;31mWarning\033[0m\a"
Warning
# 闪烁
$ echo -e "\033[1;5;31mWarning\033[0m\a"
Warning
# 举例:echo 基本用法
$ echo -e "a\x0Ab"
a
b
$ echo -e "\E[43;31;1;5mwww.kubesphere.com\E[0m"
$ echo -e "\x57\x41\x4E\x47"
WANG
$ echo \$PATH
$PATH
$ echo \
$ echo \\
$ echo \\\
$ echo \\\\
$ echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
$ echo '$PATH'
$PATH
在终端中,ANSI 定义了用于屏幕显示的 Escape 屏幕控制码
具有颜色的字符,其格式如下:
“\033[字符背景颜色;字体颜色m字符串\033[0m”
“\E[字符背景颜色;字体颜色m字符串\E[0m”
\033[30m — \033[37m 设置前景色
\033[40m — \033[37m 设置背景色
# 字符背景颜色范围:40 -- 47
40:黑色
41:红色
42:绿色
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色
# 字体颜色范围:30 -- 37
30:黑色
31:红色
32:绿色
33:黄色
34:蓝色
35:紫色
36:深绿
37:白色
加颜色只是以下控制码中的一种,下面是常见的一些ANSI 控制码:
033[Om 关闭所有属性
\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 保存光标位置
1033[u 恢复光标位嚣
\033[?25l 隐藏光标
\033[?25h 显示光标
\033[2J\033[0;0H 清屏且将光标置顶
许多场合下,字符集与编码这两个概念常被混为一谈,但两者是有差别的。字符集与字符集编码是两个不同是面的概念charset是character set的简写.即字特集,即二进利和字待的对应关系,不关注最终的存储形式
encoding是chaiset encoding的简写,即字将集编码,简称编码、实现如诃将字符转化为实际的二进制进行存佬或相反,编郅决定了空间的使用的大少
计算机内部,所有信息最终都是一个二进制值。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一的规定,即ASCII(American Standard Code for Information Interchange)码。ASCII 码一共规定了 128 个字符的编码,占用了一个字节的后面7位,最前面的一位统一规定为0。
范例:查看 ASCII 表
$ yum install -y man-pages
$ man ascii
一个字节由八个二进制组成,一个十六进制由四个二进制组成,一个八进制由三个二进制组成。
# 查看文本文件的格式
$ file test.txt
test.txt: ASCII text
$ file windows.txt
windows.txt: ASCII text, with CRLF line terminators
# 为了节约计算机空间
$ cat linux.txt
a
b
c
$ hexdump -C linux.txt
00000000 61 0a 62 0a 63 0a |a.b.c.|
00000006
$ cat windows.txt
a
b
c
$ hexdump -C windows.txt
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
# 可以使用工具将windows格式和linux格式进行相互转换
$ yum install -y dos2unix
# windows格式转换为linux格式
$ dos2unix windows.txt
dos2unix: converting file windows.txt to Unix format ...
$ hexdump -C windows.txt
00000000 61 0a 62 0a 63 |a.b.c|
00000005
# linux格式转换为windows格式
$ unix2dos windows.txt
unix2dos: converting file windows.txt to DOS format ...
$ hexdump -C windows.txt
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
用于表示世界上所有语言中的所有字符,称为万国码。每一个符号都给予了一个独一无二的编码数字,Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号。Unicode 仅仅只是一共字符集,规定了每个字符对应的二进制代码,至于这个二进制代码如何存储则没有规定。
由于计算机时美国人发明的,因此,最早只有127各字母被编码到计算机里,即ASCII编码,但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。全世界有上百种语言,日本把日文编到了Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免的出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
Unicode 编码方案:
UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,可变长存储,使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度,编码规则如下:
对于单个字节的字符,第一位设为 0,后面的 7位对应这个字符的 Unicode 码。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。这意味着 ASCII 码的文档可用 UTF-8 编码打开。
对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为 0,剩余的 N - 1个字节的前两位都设为10,剩下的二进制位则使用这个字符的 Unicode 码来填充。(1个十六进制需要4个二进制表示)
编码转换和查询参考连接:
http://www.chi2ko.com/tool/CJK.htm
https://javawind.net/tools/native2acsii.jsp?action=transform
http://tool.oschina.net/encode
http://home.unicode.org/
https://unicode.yunser.com/unicode
http://web.chacuo.net/charsetescape
https://www.bejson.com/convert/unicode_chinese/
Unicode 和 UTF-8
Unicode 符号范围(十六进制) | UTF-8 编码方式(二进制) |
---|---|
0000 0000-0000 007F | 0xxxxxxx |
0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
范例: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变量实现中文语言提示
$ echo $LANG
en_US.UTF-8
$ kubesphere
-bash: kubesphere: command not found
# 更改系统使用编码
$ LANG=zh_CN.UTF-8
$ kubesphere
-bash: kubesphere: 未找到命令
和$()把一个命令的输出打印给另一个命令的参数。
$(COMMAND) 或者 COMMAND
范例:比较 " "、’ ’ 、
三者区别
$ echo "echo $(hostname)"
echo docker.kubesphere.io
$ echo 'echo $(hostname)'
echo $(hostname)
$ echo `echo $(hostname)`
docker.kubesphere.io
$ echo "echo $HOSTNAME"
echo docker.kubesphere.io
$ echo 'echo $HOSTNAME'
echo $HOSTNAME
$ echo `echo $HOSTNAME`
docker.kubesphere.io
# 结论:
单引号:强引用,六亲不认,变量和命令都不识别,都当成了昔通的字符串,"最傻"
双引号:弱引用,不能识别给令,可以识别度量,"半慢不精"
反向单引号:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内容当成命令进行执行后,再交抬调用反向单引号的命令继续,"最聪明"
范例:
$ echo "This system"s name is $(hostname)"
This system"s name is docker.kubesphere.io
$ echo "I am `whoami`"
I am root
$ touch $(date +%F).log
$ ls -l
total 0
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
$ touch `hostname`-`date +%F`.log
$ ls -l
total 0
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
-rw-r--r-- 1 root root 0 May 3 18:02 docker.kubesphere.io-2022-05-03.log
$ touch `date +%F_%H-%M-%S`.log
$ touch `date -d '-1 day' +%F`.log
$ touch `hostname`_`date +%F_%T`.log
$ ls -l
total 0
-rw-r--r-- 1 root root 0 May 3 18:05 2022-05-02.log
-rw-r--r-- 1 root root 0 May 3 18:05 2022-05-03_18-05-18.log
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
-rw-r--r-- 1 root root 0 May 3 18:09 docker.kubesphere.io_2022-05-03_18:09:13.log
-rw-r--r-- 1 root root 0 May 3 18:02 docker.kubesphere.io-2022-05-03.log
范例:$() 和
$ ls -l `echo `date +%F`.txt`
-bash: .txt: command not found
ls: cannot access date: No such file or directory
ls: cannot access +%F: No such file or directory
$ ls -l $(echo $(date +%F).log)
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
$ ls -l `echo $(date +%F).log`
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
$ ls -l $(echo `date +%F`.log)
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
{ } 可以实现打印重复字符串的简化形式
{元素1,元素2,元素3}
{元素1…元素2}
范例:
$ echo file{1,3,5} 结果为:file1 file3 file5
$ rm -rf file{1,3,5}
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ echo {a..z}
$ echo {1..10..2}
1 3 5 7 9
$ echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020
$ ls -l /sys/class/scsi_host/host{0..2}/scan
--w------- 1 root root 4096 May 3 18:25 /sys/class/scsi_host/host0/scan
--w------- 1 root root 4096 May 3 18:25 /sys/class/scsi_host/host1/scan
--w------- 1 root root 4096 May 3 18:25 /sys/class/scsi_host/host2/scan
范例:
$ echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020
$ cho {a..z..2}
a c e g i k m o q s u w y
$ echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo {A..a}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a
范例:关闭和启用 {} 的扩展功能
$ echo $-
himBH
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ set +B
$ echo $-
himH
$ echo {1..10}
{1..10}
$ set -B
$ echo $-
himBH
Tab 键可以实现命令及路径等补全,提高输入效率,避免出错;
bash-completion
yum install -y bash-completion
注意:用户给定的字符串只有一条唯一对应的命令,直接补全,否则,再次 Tab 会给出列表
范例:
$ nmcli connection 2Tab键
add clone delete down edit export help
import load modify monitor reload show up
把用户给出的字符串当作路径开头,并在其指定的上级目录下搜索以指定的字符串开头的文件名
如果唯一:则直接补全
否则,再次 Tab 会给出列表。
当执行命令后,系统默认会在内存记录执行过的命令
当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是~/.bash_history
登录进 Shell 后新执行的命令只会记录在缓存中
登录进 Shell 后新执行的命令只会记录在内存的缓存区中; 这些命令会用户退出时“追加”至命令文件。
利用命令历史,可以用它来重复执行命令,提高输入效率
命令:history
history [-c] [-d offset] [n]
history -anrw [filename]
history -ps arg [arg...]
常见的选项:
命令历史相关环境变量
持久保存变量
范例:
$ 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 HISTSIZE=100000
export HISTTIMEFORMAT="%F %T "
# 重复前一个命令方法
重复前一个命令使用上方向键,并回车执行;
按!!并回车执行;
输入!-1并回车执行;
按Ctrl + P并回车执行。
!:0 :执行前一条命令(去除参数)
Ctrl + n:显示当前历史中的下一条命令,但是不执行
Ctrl + j:执行当前命令
!n:执行history命令输出对应序号n的命令
!-n:执行history历史中倒数第n个命令
!string:重复前一个以”string”开头的命令
!?string:重复前一个包含string的命令
! string:p:仅仅打印命令历史,而不执行
!$:p:打印输出!$(上一条命令的最后一个参数)的内容
!*:p:打印输出!*(上一条命令的所有参数)的内容
^string:删除上一条命令中的第一个string
^string1^string:将上一条命令中的第一个string1替换为string2
!:gs/string1/string2:将上一条命令中所有的string1都替换为string2
使用up(向上)和down(向下)键来上下浏览从前输入的命令
Ctrl + r来在命令历史中搜索命令:
(revese-i-search)`’:
Ctrl + g:从历史搜索模式退出
# 要重新调用前一个命令中的最后一个参数
!$: :表示
Esc,. :(点击Esc键后松开,然后点击.键)
Alt+. :(按住Alt键的同时点击.键)
# 调用历史参数
Command !^ (利用上一个命令的第一个参数做cmd的参数)
Command !$ (利用上一个命令的最后一个参数做cmd的参数)
Command !* (利用上一个命令的全部参数做cmd的参数)
Command!:n(利用上一个命令的第n个参数做cmd的参数)
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开头的命令,并获取它的所有参数)
* Ctrl + l :清屏,相当于clear命令
Ctrl + o :执行当前命令,并重新显示本命令
* Ctrl + s :阻止屏幕输出,锁定
* Ctrl + q :允许屏幕输出
* Ctrl + c :终止命令
* Ctrl + z :挂起命令
* Ctrl + a :光标移动到命令行首,相当于Home
* Ctrl + e :光标移动到命令行尾,相当于End
Ctrl + f :光标向右移动一个字符
Ctrl + b :光标向左移动一个字符
Alt + f :光标向右移动一个单词尾
Alt + b :光标向左移动一个单词首
Ctrl + xx :光标在命令行首和光标之间移动
* Ctrl + u :从光标处删除至命令行首
* Ctrl + k :从光标处删除至命令行尾
* Alt + r :删除当前整行
Ctrl + w :从光标处向左删除至单词首
Alt + d :从光标处向右删除至单词尾
Ctrl + d :删除光标处的一个字符
Ctrl + h :删除光标前的一个字符
Ctrl + y :将删除的字符粘贴至光标后
Alt + c :从光标处开始向右更改为首字母大写的单词
Alt + u :从光标处开始,将右边一个单词更改为大写
Alt + l :从光标处开始,将右边一个单词更改为小写
Ctrl + t :交换光标处和之前的字符位置
Alt + t :交换光标处和之前的单词位置
Alt + # :提示输入指定字符后,重复显示该字符 # 次
注意:Alt 组合快捷键经常和其他软件冲突
范例:Xshell 中启动 Alt 键
获取帮助的能力决定了技术的能力!
多层次的帮助
whatis 使用数据库来显示命令的简短描述
此工具在系统刚安装后,不可立刻使用,需要制作数据库
执行下面命令生成数据库
# CentOS7 版本以后
mandb
# CentOS6 版本之前
makewhatis
范例:
$ whatis cal
cal (1) - display a calendar
cal (1p) - print a calendar
$ man -f cal
cal (1) - display a calendar
cal (1p) - print a calendar
范例:
$ whatis ls
ls: nothing appropriate.
# 生成man相关数据库
$ mandb
Processing manual pages under /usr/share/man...
Updating index cache for path `/usr/share/man/man4'...Wait...done
Checking for stray cats under /usr/share/man...
...省略...
$ whatis ls
ls (1) - list directory contents
ls (1p) - list directory contents
范例:
$ type history
history is a shell builtin
$ help history
history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]
...
显示用法总结和参数列表,使用的大多数,但是并非所有的。
范例:
$ 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.
$ cal -h
Usage:
cal [options] [[[day] month] year]
$ strace --help
strace: invalid option -- '-'
Try 'strace -h' for more information.
$ openssl --help
openssl:Error: '--help' is an invalid command.
$ date -h
date: invalid option -- 'h'
Try 'date --help' for more information.
$ shutdown -h
Shutdown scheduled for Tue 2022-05-03 20:31:04 CST, use 'shutdown -c' to cancel.
格式说明:
# 1.显示当前时间,格式:2016-06-18 10:20:30
$ date +"%F %T"
2021-04-29 16:58:44
# 2.显示前天是星期几
$ date -d '-2 day' +%u
2
# 3.设置当前日期为 2019-08-07 06:05:10
$ date 080706052019.10
Wed Aug 7 06:05:10 CST 2019
man 提供命令帮助的文件,手册页存放在 /usr/share/man
几乎每个命令都有 man 的"页面"
中文 man 需要安装包
man 页面分组
不同类型的帮助成为不同的“章节”,统称为 Linux 手册,man 1 man
1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions within program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]
man 命令的配置文件
# CentOS6之前版 man的配置文件
/etc/man.config
# CentOS7之后版 man的配置文件
/etc/man_db.conf
# ubuntu man的配置文件
/etc/manpath.config
格式:
MANPATH /PATH/TO/SOMEWHERE # 指明man文件搜索位置
也可以指定位置下搜索COMMAND命令的手册页并显示
man -M /PATH/TO/SOMEWHERE COMMAND
查看man手册页
$ man --help
Usage: man [OPTION...] [SECTION] PAGE...
man [章节] keyword
man 帮助段落说明
man 命令的操作方法:使用 less 命令实现
常用选项
man -a keyword
# 列出所有匹配的页面,使用 whatis 数据库
man -k keyword
man -f keyword
# 举例:
$ man -f ls
ls (1) - list directory contents
ls (1p) - list directory contents
man -w [章节] keyword
范例:
$ yum install -y man-pages
$ man -w 1 passwd
/usr/share/man/man1/passwd.1.gz
$ whatis passwd
sslpasswd (1ssl) - compute password hashes
passwd (1) - update user's authentication tokens
passwd (5) - password file
$ man lssl openssl-passwd
$ man 7 ascii
$ man 7 utf8
范例:查看passwd 相关命令和文件,man帮助文件路径
$ whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
练习:
# 1.在本机字符终端登录时,除了显示原有信息外,再显示当前登录终端号,主机名和当前时间
# 可以使用软件将图形转换为字符,ASCIIGenerator
$ cat /etc/issue
The tty is \l
The hostname is \n
The time is \t
=================================================
\S
Kernel \r on an \m
# 2.今天18:30自动关机,并提示用户
$ shutdown 18:30 "The system will shutdown autocatically at 20:30 tonight,please save your file"
man 常用于命令参考,GNU 工具 info 适合通用文档参考;
没有参考,列出所有的页面;
info 页面的结构就像一个网站;
每一页分为“节点”;
链接节点之前 *
info 命令格式:
info [ 命令 ]
导航 info 页:
Applications → Documentation → help(CentOS 7)
System → help(CentOS 6)
/usr/share/doc
http://www.github.com
http://www.kernel.org/doc/html/latest/
http://httpd.apache.org
http://www.nginx.org/
https://mariadb.com/kb/en
https://dev.mysql.com/doc/
https://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
通过发行版官方的文档光盘或者网站可以获取安装指南,部署指南,虚拟化指南等。
rhn.redhat.com 或者本地卫星服务器 / 代理服务器
RHN 账号为及其注册和基于网络管理的 RHN 用户
sosreport 收集所有系统上的日志信息的工具,并自动打包压缩包,方便技术支持人员和红帽全球支持提供分析问题依据。
范例:
$ yum install -y sos
$ sosreport
Please note the 'sosreport' command has been deprecated in favor of the new 'sos' command, E.G. 'sos report'.
Redirecting to 'sos report '
sosreport (version 4.0)
This command will collect diagnostic and configuration information from
this CentOS system and installed applications.
An archive containing the collected information will be generated in
/var/tmp/sos.5rr_xr0d and may be provided to a CentOS support
representative.
Any information provided to CentOS will be treated in accordance with
the published support policies at:
https://www.centos.org/
...省略...
Finishing plugins [Running: selinux] ]ger]
Finished running plugins
Creating compressed archive...
Your sosreport has been generated and saved in:
/var/tmp/sosreport-CentOS8-Server-2022-05-03-gldmows.tar.xz
Size 15.74MiB
Owner root
md5 aa24e602e6582f2633126f73c14c863b
Please send this file to your support representative.
http://www.google.com
OpenStack filetype:pdf
rhca site:redhat.com/docs
http://bing.com
http://www.baidu.com
http://www.slideshare.net
# 1.下载源码
源码网址 https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/
下载源码 wget https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/v1.5.2.tar.gz/1bbdc4f32272df0b95146518b27bf4be/v1.5.2.tar.gz
[root@localhost opt]# wget https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.1.tar.gz/13275fd039de8788b15151c896150bc4/manpages-zh-1.5.1.tar.gz
# 2.解压并安装
[root@localhost opt]# tar xf manpages-zh-1.5.1.tar.gz
[root@localhost opt]# cd manpages-zh-1.5.2/
[root@localhost manpages-zh-1.5.1]# ./configure --disable-zhtw --prefix=/usr/local/zhman
[root@localhost manpages-zh-1.5.1]# make && make install
# 3.为了不抵消man,我们新建cman命令作为中文查询
[root@localhost man1]# cd ~
[root@localhost ~]# echo "alias cman='man -M /usr/local/zhman/share/man/zh_CN' " >>.bash_profile
[root@localhost ~]# source .bash_profile
# 4.使用中文man查询命令
[root@localhost ~]# cman ls
tty 命令可以查看当前所在的终端
范例:
# tty 可以查看当前所在的终端
$ tty
/dev/pts/1
$ who am i
root pts/1 2022-05-03 01:37 (120.229.46.163)
$ who
root pts/0 2022-05-03 01:30 (120.229.46.163)
root pts/1 2022-05-03 01:37 (120.229.46.163)
$ w
01:47:52 up 4 days, 14:35, 2 users, load average: 0.04, 0.08, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 120.229.46.163 01:30 8.00s 14:17 0.02s vim /etc/hostna
root pts/1 120.229.46.163 01:37 0.00s 0.02s 0.00s w
交互式接口:启动终端后,在终端设备附加一个交互式应用程序
硬件:计算机设备的硬件,例如:处理器,内存,存储等等硬件设备;
内核:即是操作系统的核心;内核是操作系统最基本的部分,但不是操作系统的全部。内核负责管理系统的进程、内存、设备驱动程序,文件和网络系统,决定着系统的性能和稳定性。而操作系统一般包括内核、驱动程序、接口库等等组成部分。
系统调用:用户想要使用操作系统是需要通过接口来访问的,这些接口就是系统调用。
Shell 是 Linux 系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。Shell 也被称为 Linux 的命令解释器(Command Interpreter)Shell 是一种高级程序设计语言。
Shell本身就是一个程序,将用户输入的命令行拆解为"命令名" 与 “参数”。接着,根据命令名找到对应要执行的程序,对被执行的程序进行初始化,然后将刚才解析出来的参数传递给该程序并执行
Shell 是一种高级程序设计语言,提供了变量,函数,条件判断,循环等开发语言的功能
由于Shell 本身是个程序,所以它可以被任何用户自己开发的各种Shell所代替。
GNU Bourne-Agent Shell(bash)是GNU计划中最重要的工具软件之一,目前也是Linux标准的shell,与sh 兼容。
显示当前使用的shell
echo $SHELL
显示当前系统使用的所有shell
cat /etc/shells
# 安装shell
yum install -y csh # 可以在/etc/shells中查看新安装shell
# 临时生效,可以生效,但是系统重启后无法持久保存
hostname NAME
# 持久生效,支持CentOS7和Ubuntu18.04以上的版本使用
hostnamectl set-hostname NAME
范例:
$ hostnamectl set-hostname bj-yz-k8s-node01-100-10.kubesphere.com
# 主机名不要使用下划线
$ hostname centos7_3.kubesphere.io
hostname: the specified hostname is invalid
注意:
范例:
$ hostnamectl set-hostname docker.kubesphere.io
# 主机名保存的配置文件
$ cat /etc/hostname
docker.kubesphere.io
# 当使用非法的主机名时,可能会导致某些服务启动失败的情况
$ hostname centos8.1 # 主机名不支持小数点
$ systemctl restart postfix
Job for postfix.service failed because the control process exited with error code.
See "systemctl status postfix.service" and "journalctl -xe" for details.
登录 Linux 后,默认的系统命令提示符毫无没有个性,无法明显辨别生产和测试回家,而导致误操作,可以通过修改 PS1 变量实现个性的提示符格式,避免这种低级错误发生。
范例:默认的提示符
# CentOS默认的命令提示符
[root@centos8 ~]#
# Ubuntu默认的命令提示符
root@docker:~#
#:管理员
$:普通用户
显示操作符格式
[root@centos8 ~]# echo $PS1
[\u@\h \W]\$
修改提示符格式范例
# \[\e[1;5;41;33m\]中 1:代表高亮显示;5:代表闪烁;41;提示符的背景颜色;33:提示符颜色;0m:终止颜色渲染
PS1="\[\e[1;5;41;33m\][\u@\h \W]\\$\[\e[0m\]"
PS1="\[\e[1;32m\][\[\e[0m\]\t \[\e[1;33m\]\u\[\e[36m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"
提示符格式说明:
范例:持久保存 PS1 格式
# CentOS系统持久保存提示符格式
echo 'PS1="\[\e[1;32m\][\[\e[0m\]\t \[\e[1;33m\]\u\[\e[36m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$ "' > /etc/profile.d/env.sh
echo 'PS1="\[\e[1;33m\][\u@\h \W]\\$\[\e[0m\] "' > /etc/profile.d/env.sh
source /etc/profile.d/env.sh
# Ubuntu系统持久保存提示符格式
echo 'PS1="\[\e[1;32m\][\[\e[0m\]\t \[\e[1;33m\]\u\[\e[36m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$ "' >> .bashrc
echo 'PS1="\[\e[1;33m\][\u@\h \W]\\$\[\e[0m\] "' >> .bashrc
tail -n1 .bashrc
输入命令后回车,提请 Shell 程序找到键入命令所对应的可执行程序或者代码,并由其分析后提交给内核分配资源将其运行起来。
区别指定的命令时内部或者外部命令
type COMMAND
范例:查看是否存在对应的内部命令和外部命令
$ type echo
echo is a shell builtin
# 查看是否存在对应的内部命令和外部命令
$ type -a echo
echo is a shell builtin # 内部命令
echo is /usr/bin/echo
$ type -a type
type is a shell builtin # 内部命令
type is /usr/bin/type
$ type -a hostname
hostname is /usr/bin/hostname # 外部命令
# 查看内部所有命令,内部命令是集成在Shell中的,不同的Shell集成的内部命令数量不同
$ enable
...
$ enable | wc -l
61
help 内部命令列表
enable 管理内部命令
$ enable help
# 禁用内部命令
$ enable -n help
$ enable -n
enable -n help
# 启用内部命令
$ enable help
查看外部命令路径:
which -a |--skip-alias
whereis
Hash缓存表 系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率。
hash 命令常见用法:
# CentOS系统进行下载firefox
yum install -y firefox
export DISPLAY=10.0.0.1:0.0 # export DISPLAY=:0.0
firefox
# 可能会需要进行下载相关依赖库
yum provides libGL.so.1 # <库名>
yum install -y libglvnd-glx
firefox # 直接运行即可
# 如果使用mobaxterm工具连接CentOS
# 需要安装插件
yum install -y xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 firefox
exit
firefox # 直接运行即可
# Ubuntu系统进行下载firefox
apt install -y firefox
firefox # 直接运行即可
alias cdnet='cd /etc/sysconfig/network-scripts/'
alias cdyum='cd /etc/yum.repos.d/'
alias nm='systemctl restart NetworkManager'
alias disepel='sed -ri /enabled/s/enabled=1/enabled=0/ /etc/yum.repos.d/base.repo'
alias egrep='egrep --color=auto'
alias epel='sed -ri /enabled/s/enabled=0/enabled=1/ /etc/yum.repos.d/base.repo'
alias fgrep='fgrep --color=auto'
alias i.='ls -d .* --color=auto'
alias lh='ls -lh --color=auto'
alias p='poweroff'
alias restart='systemctl restart '
alias restartnet='systemctlrestart network"
alias scandisk='echo "- - -" > /sys/class/scsi_host/host0/scan;\
echo "- - -" > /sys/class/scsi_host/host1/scan;\
echo "- - -" > /sys/class/scsi_host/host2/scan'
alias vie0='vim /etc/sysconfig/network-scripts/ifcfg-eth0'
alias vie1='vim /etc/sysconfig/network-scripts/ifcfg-eth1'
alias xzfgrep='xzfgrep --color=auto'
alias xzgrep=' xzgrep --color=auto'
alias yr='yum remove'
alias yy='yum -y install'
alias zegrep='zegrep --color=auto'
alias zfgrep='zfgrep --color=auto'
alias zgrep='zgrep --color=auto'
对于经常执行的较长的命令,可以将其定义成较短的别名,以方便执行
显示当前shell进程所有可用的命令别名 alias
定义别名NAME,其相当于执行命令VALUE
alias NAME='VALUE'
范例:扫描新加的磁盘
alias scandisk='echo "- - -" > /sys/class/scsi_host/host0/scan;\
echo "- - -" > /sys/class/scsi_host/host1/scan;\
echo "- - -" > /sys/class/scsi_host/host2/scan'
$ type scandisk
scandisk is aliased to `echo "- - -" > /sys/class/scsi_host/host0/scan;\
echo "- - -" > /sys/class/scsi_host/host1/scan;\
echo "- - -" > /sys/class/scsi_host/host2/scan'
范例:持久保存别名
$ vim ~/.bashrc
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 进程有效;
如果想永久有效,要定义在配置文件中
编辑配置给出的新配置不会立刻生效,bash 进程重新读取配置文件
source /path/to/config_file
. /path/to/config_file
如果别名同原命令同名,如果想要执行原命令,可使用:
\ALIASNAME
"ALIASNAME"
'ALIASNAME'
command ALIASNAME
/path/command
$ alias hostname=who
$ hostname
root pts/5 2022-05-02 13:05 (10.0.0.1)
$ \hostname
CentOS8-Server
$ 'hostname'
CentOS8-Server
# 撤销别名
$ unalias hostname
命令执行过程:命令别名 > 内部命令 > 命令Hash缓存 > 外部命令
第一次执行外部命令优先级:命令别名 > 内部命令 > Hash 缓存表 > 外部命令(查找$PATH路径)。
COMMAND [OPTIONS…] [ARGUMENTS…]
COMMAND [COMMAND…] [COMMAND…] …
选项:用于启用或关闭命令的某个或某些功能
参数:命令的作用对象,比如:文件名,用户名等
范例:
$ id -u zzw
1000
$ ls -a | ls --all
$ free -h | free --human
$ ps aux
注意:
lscpu 命令可以查看 CPU 信息
cat /proc/cpuinfo 也可以查看到
范例:
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4 # 4core
# 最多同时开4个同时执行的任务,一个任务占用一个内核
# 一般任务的数量和CPU内核的数量尽可能统一
# 因为,任务如果太多,会产生一个问题就是CPU会进行来回的切换
# CPU的个数就决定了它能同时执行任务的个数
On-line CPU(s) list: 0-3
Thread(s) per core: 1 # 每个core 有几个线程
Core(s) per socket: 2 # 每个槽位有2core
Socket(s): 2 # 服务器面板上有2个CPU槽位
NUMA node(s): 2 # nodes的数量
Vendor ID: AuthenticAMD
BIOS Vendor ID: AuthenticAMD
CPU family: 23
Model: 113
Model name: AMD Ryzen 7 3700X 8-Core Processor
BIOS Model name: AMD Ryzen 7 3700X 8-Core Processor
Stepping: 0
CPU MHz: 3600.013
BogoMIPS: 7200.02
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 512K
L3 cache: 16384K
NUMA node0 CPU(s): 0,2,4,6 # 对应的core
NUMA node1 CPU(s): 1,3,5,7
# 可以查看单独的CPU的信息
$ cat /proc/cpuinfo
$ free
total used free shared buff/cache available
Mem: 3799012 532704 1908780 10132 1357528 2967392
Swap: 4194300 0 4194300
# 展示人类可读的输出
$ free -h
total used free shared buff/cache available
Mem: 3.6Gi 520Mi 1.8Gi 9.0Mi 1.3Gi 2.8Gi
Swap: 4.0Gi 0B 4.0Gi
$ cat /proc/meminfo
MemTotal: 3799012 kB # 内存的总大小
MemFree: 1908852 kB # 内存可用的大小
MemAvailable: 2967464 kB
Buffers: 200 kB
Cached: 1095516 kB
...
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 2G 0 part /boot
├─sda2 8:2 0 100G 0 part /
├─sda3 8:3 0 100G 0 part /data
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 4G 0 part [SWAP]
$ cat /proc/partitions
major minor #blocks name
8 16 104857600 sdb
8 0 524288000 sda
8 1 2097152 sda1
8 2 104857600 sda2
8 3 104857600 sda3
8 4 1 sda4
8 5 4194304 sda5
$ arch
x86_64
# 可以获取全部系统信息
$ getconf -a
$ getconf LONG_BIT
lscpu | grep Architecture
Architecture: x86_64
$ uname -r
4.18.0-305.3.1.el8.x86_64
$ uname -a
Linux CentOS8-Server 4.18.0-305.3.1.el8.x86_64
#1 SMP Tue Jun 1 16:14:33 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
### CentOS查看操作系统发行版本
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
### lsb_release: command not found 解决方法:
$ yum install -y redhat-lsb-core
$ lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.9.2009 (Core)
Release: 7.9.2009
Codename: Core
### Ubuntu查看操作系统发行版本
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
$ cat /etc/issue
Ubuntu 20.04.2 LTS \n \l
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
范例:查看OS版本
$ lsb_release -is
Ubuntu
$ lsb_release -cs
focal
$ lsb_release -rs
20.04
Linux 的两种时钟:
相关命令:
范例:
$ date +%s
1651555049
$ date -d @`date +%s`
Tue May 3 13:17:45 CST 2022
$ date -d @1651555049
Tue May 3 13:17:29 CST 2022
$ date -d "2020-02-02" +%s
1580572800
$ clock --help
-s, --hctosys set the system time from the RTC
-w, --systohc set the RTC from the system time
# RTC:一般指实时时钟,是在主板集成电路芯片上的时间
范例:
$ ls -l /usr/sbin/clock
lrwxrwxrwx. 1 root root 7 Jan 21 2021 /usr/sbin/clock -> hwclock
时区
/etc/localtime
### 设置时区
# 列出所有的时区
$ timedatectl list-timezones
# 查看当前系统的时区情况
$ timedatectl status
Local time: Tue 2022-05-03 13:27:34 CST
Universal time: Tue 2022-05-03 05:27:34 UTC
RTC time: Tue 2022-05-03 05:27:39
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
# 设置时区
$ timedatectl set-timezone Asia/Shanghai
$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 Jul 11 2021 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
显示日历
# 显示当前月份的日历
$ cal
# 显示整一年的日历
$ cal -y
范例:
$ cal 9 1752
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
# 从1752年9月3日到1752年9月13日的11天并不存在。
# 抹掉这11天是由英国议会做出的决定。所以要计算某年每个月的天数的,除了要考虑是否是闰年以外,还要考虑1752年的9月。
关机:
重启:
关机或者重启:shutdown
shutdown [OPTIONS] ... [TIME] [MESSAGE]
-r : reboot 重启
-h :halt 关机
-c :cancel 取消 shutdown 选项
TIME :无指定,默认相当于 +1(CentOS 7)
$ uptime
13:46:43 up 7:38, 1 user, load average: 0.00, 0.00, 0.00
范例:创建登录提示文件 /etc/motd
$ yum install -y nano
$ nano /etc/motd
welcome to kubepshere.docker
参考网站:https://bootschool.net/ascii-art
# 登录后提示信息
$ cat /etc/motd
welcome to kubepshere.docker
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
# 登录前提示信息
$ cat /etc/issue
\S
Kernel \r on an \m
命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口”),在里面输入命令,用户与计算机的这种临时的交互,称为一次会话”(session)
会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完
一个典型的例子就是,SSH登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次SSH会话已经终止了,里面的进程也随之消失了。为了解决这个问题,会话与窗口可以’解绑︰窗口关闭时,会活并不终止,而是继续运行,等到以后需要的时候,再让会话^绑定"“其他窗口
终端复用器软件就是会话与窗口的"解绑”"工具,将它们彻底分离。
(1)它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
(2)它可以让新窗口"接入"已经存在的会话。
(3)它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
(4)它还支持窗口任意的垂直和水平拆分。
类似的终端复用器还有Screen,Tmux
利用 screen 可以实现会话管理,如:新建会话,共享会话
注意:CentOS 7来自于 base 源,CentOS 8 来自于 epel 源
范例:安装 screen
# CentOS7 安装 screen 软件
$ yum install -y screen
# CentOS8 安装 screen 软件
$ dnf install -y epel-release
$ dnf install -y screen
Tmux 是一个终端复用器(Terminal Multiplexer),类似 screen,但是要易用,也要强大。
Tmux就是会话与窗口的"解绑""工具,将它们彻底分离,功能如下
安装
# 安装Tmux
$ yum install -y tmux
启动与退出
$ tmux
$ exit
[exited]
Tmux 窗口有大量的快捷键,所有快捷键都要通过前缀唤起。默认的前缀是 Ctrl + B,即先按下 Ctrl + B,快捷键才会生效。帮助命令的快捷键是 Ctrl + B , 然后,按下 Q 键,就可以退出帮助。
新建会话
第一个启动的 Tmux 窗口,编号为 0,第二个窗口的编号为 1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。使用编号区分会话,不太直观,更好的方法是为会话起名。下面命令新建一个指定名称的会话。
tmux new -s <seesion-name>
Tmux ls 或者 Ctrl + B,S 可以查看所有的 Tmux 会话。
tmux ls
tmux list-session
分离会话
在 Tmux 窗口中,按下 Ctrl + B 或者输入 tmux detach 命令,就会将当前会话与窗口分离。
tmux detach
接入会话
tmux attach 命令用于重新接入某个已存在的会话。
tmux attach -t <seesion-name>
范例:
tmux attach -t 0
杀死会话
tmux kill-session 命令用于杀死某个会话。
tmux kill-session -t <session-name>
切换会话
tmux switch 命令用于切换会话。
tmux switch -t <session>
可以将窗口分成多个窗格(pane),每个窗格运行不同的命令
上下分窗格
tmux split-window
Ctrl + B , "
左右分窗格
tmux split-window -h
Ctrl + B , %
窗格快捷键
Ctrl + B %:划分左右两个窗格。
Ctrl + B ":划分上下两个窗格。
Ctrl + B :光标切换到其他窗格。 是指向要切换到下方窗格,就按方向键。
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 + :按箭头方向调整窗格大小。
Ctrl + B q :显示窗格编号。
窗口管理
除了将一个窗口划分成多个窗格,Tmux 也允许新建多个窗口。
新建窗口
tmux new-windows 命令用来创建新窗口。
tmux new-windows
新建一个指定名称的窗口
tmux new-windows -n <windows-name>
切换窗口
tmux select-windows 命令用来切换窗口
切换到指定编号的窗口
tmux select-windows -t <windows-number>
切换到指定名称的窗口
tmux select-windows -t <windows-name>
列出所有快捷键,及其对应的 Tmux 命令
tmux list-keys
列出所有 Tmux 命令及其参数
tmux list-commands
echo 命令可以将后面跟的字符进行输出
功能:显示字符,echo 会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行符号。
语法:
echo [-neE] [字符串]
选项:
显示变量
echo "$VAR_NAME":#变量会替换,弱引用
echo '$VAR_NAME':#变量不会替换,强引用
启用命令选项 -e,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出;
范例:
## 字体颜色
31:红色
32:绿色
33:黄色
34:蓝色
35:粉色
36:浅蓝色
37:白色
# ----- #
## 背景颜色
41:红色背景
42:绿色背景
43:黄色背景
44:蓝色背景
45:粉色背景
46:浅蓝色背景
47:白色背景
# ----- #
$ echo -e '\033[43;41;5m magedu \e[0m'
$ echo -e "\E[1;31mwww.kubesphere.com\E[0m"
$ echo -e '\033[31m hello \033[0m'
$ echo -e "\033[1;31mWarning\033[0m\a"
Warning
# 闪烁
$ echo -e "\033[1;5;31mWarning\033[0m\a"
Warning
# 举例:echo 基本用法
$ echo -e "a\x0Ab"
a
b
$ echo -e "\E[43;31;1;5mwww.kubesphere.com\E[0m"
$ echo -e "\x57\x41\x4E\x47"
WANG
$ echo \$PATH
$PATH
$ echo \
$ echo \\
$ echo \\\
$ echo \\\\
$ echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
$ echo '$PATH'
$PATH
在终端中,ANSI 定义了用于屏幕显示的 Escape 屏幕控制码
具有颜色的字符,其格式如下:
“\033[字符背景颜色;字体颜色m字符串\033[0m”
“\E[字符背景颜色;字体颜色m字符串\E[0m”
\033[30m — \033[37m 设置前景色
\033[40m — \033[37m 设置背景色
# 字符背景颜色范围:40 -- 47
40:黑色
41:红色
42:绿色
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色
# 字体颜色范围:30 -- 37
30:黑色
31:红色
32:绿色
33:黄色
34:蓝色
35:紫色
36:深绿
37:白色
加颜色只是以下控制码中的一种,下面是常见的一些ANSI 控制码:
033[Om 关闭所有属性
\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 保存光标位置
1033[u 恢复光标位嚣
\033[?25l 隐藏光标
\033[?25h 显示光标
\033[2J\033[0;0H 清屏且将光标置顶
许多场合下,字符集与编码这两个概念常被混为一谈,但两者是有差别的。字符集与字符集编码是两个不同是面的概念charset是character set的简写.即字特集,即二进利和字待的对应关系,不关注最终的存储形式
encoding是chaiset encoding的简写,即字将集编码,简称编码、实现如诃将字符转化为实际的二进制进行存佬或相反,编郅决定了空间的使用的大少
计算机内部,所有信息最终都是一个二进制值。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一的规定,即ASCII(American Standard Code for Information Interchange)码。ASCII 码一共规定了 128 个字符的编码,占用了一个字节的后面7位,最前面的一位统一规定为0。
范例:查看 ASCII 表
$ yum install -y man-pages
$ man ascii
一个字节由八个二进制组成,一个十六进制由四个二进制组成,一个八进制由三个二进制组成。
# 查看文本文件的格式
$ file test.txt
test.txt: ASCII text
$ file windows.txt
windows.txt: ASCII text, with CRLF line terminators
# 为了节约计算机空间
$ cat linux.txt
a
b
c
$ hexdump -C linux.txt
00000000 61 0a 62 0a 63 0a |a.b.c.|
00000006
$ cat windows.txt
a
b
c
$ hexdump -C windows.txt
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
# 可以使用工具将windows格式和linux格式进行相互转换
$ yum install -y dos2unix
# windows格式转换为linux格式
$ dos2unix windows.txt
dos2unix: converting file windows.txt to Unix format ...
$ hexdump -C windows.txt
00000000 61 0a 62 0a 63 |a.b.c|
00000005
# linux格式转换为windows格式
$ unix2dos windows.txt
unix2dos: converting file windows.txt to DOS format ...
$ hexdump -C windows.txt
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
用于表示世界上所有语言中的所有字符,称为万国码。每一个符号都给予了一个独一无二的编码数字,Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号。Unicode 仅仅只是一共字符集,规定了每个字符对应的二进制代码,至于这个二进制代码如何存储则没有规定。
由于计算机时美国人发明的,因此,最早只有127各字母被编码到计算机里,即ASCII编码,但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。全世界有上百种语言,日本把日文编到了Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免的出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
Unicode 编码方案:
UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,可变长存储,使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度,编码规则如下:
对于单个字节的字符,第一位设为 0,后面的 7位对应这个字符的 Unicode 码。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。这意味着 ASCII 码的文档可用 UTF-8 编码打开。
对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为 0,剩余的 N - 1个字节的前两位都设为10,剩下的二进制位则使用这个字符的 Unicode 码来填充。(1个十六进制需要4个二进制表示)
编码转换和查询参考连接:
http://www.chi2ko.com/tool/CJK.htm
https://javawind.net/tools/native2acsii.jsp?action=transform
http://tool.oschina.net/encode
http://home.unicode.org/
https://unicode.yunser.com/unicode
http://web.chacuo.net/charsetescape
https://www.bejson.com/convert/unicode_chinese/
Unicode 和 UTF-8
Unicode 符号范围(十六进制) | UTF-8 编码方式(二进制) |
---|---|
0000 0000-0000 007F | 0xxxxxxx |
0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
范例: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变量实现中文语言提示
$ echo $LANG
en_US.UTF-8
$ kubesphere
-bash: kubesphere: command not found
# 更改系统使用编码
$ LANG=zh_CN.UTF-8
$ kubesphere
-bash: kubesphere: 未找到命令
和$()把一个命令的输出打印给另一个命令的参数。
$(COMMAND) 或者 COMMAND
范例:比较 " "、’ ’ 、
三者区别
$ echo "echo $(hostname)"
echo docker.kubesphere.io
$ echo 'echo $(hostname)'
echo $(hostname)
$ echo `echo $(hostname)`
docker.kubesphere.io
$ echo "echo $HOSTNAME"
echo docker.kubesphere.io
$ echo 'echo $HOSTNAME'
echo $HOSTNAME
$ echo `echo $HOSTNAME`
docker.kubesphere.io
# 结论:
单引号:强引用,六亲不认,变量和命令都不识别,都当成了昔通的字符串,"最傻"
双引号:弱引用,不能识别给令,可以识别度量,"半慢不精"
反向单引号:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内容当成命令进行执行后,再交抬调用反向单引号的命令继续,"最聪明"
范例:
$ echo "This system"s name is $(hostname)"
This system"s name is docker.kubesphere.io
$ echo "I am `whoami`"
I am root
$ touch $(date +%F).log
$ ls -l
total 0
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
$ touch `hostname`-`date +%F`.log
$ ls -l
total 0
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
-rw-r--r-- 1 root root 0 May 3 18:02 docker.kubesphere.io-2022-05-03.log
$ touch `date +%F_%H-%M-%S`.log
$ touch `date -d '-1 day' +%F`.log
$ touch `hostname`_`date +%F_%T`.log
$ ls -l
total 0
-rw-r--r-- 1 root root 0 May 3 18:05 2022-05-02.log
-rw-r--r-- 1 root root 0 May 3 18:05 2022-05-03_18-05-18.log
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
-rw-r--r-- 1 root root 0 May 3 18:09 docker.kubesphere.io_2022-05-03_18:09:13.log
-rw-r--r-- 1 root root 0 May 3 18:02 docker.kubesphere.io-2022-05-03.log
范例:$() 和
$ ls -l `echo `date +%F`.txt`
-bash: .txt: command not found
ls: cannot access date: No such file or directory
ls: cannot access +%F: No such file or directory
$ ls -l $(echo $(date +%F).log)
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
$ ls -l `echo $(date +%F).log`
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
$ ls -l $(echo `date +%F`.log)
-rw-r--r-- 1 root root 0 May 3 18:02 2022-05-03.log
{ } 可以实现打印重复字符串的简化形式
{元素1,元素2,元素3}
{元素1…元素2}
范例:
$ echo file{1,3,5} 结果为:file1 file3 file5
$ rm -rf file{1,3,5}
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ echo {a..z}
$ echo {1..10..2}
1 3 5 7 9
$ echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020
$ ls -l /sys/class/scsi_host/host{0..2}/scan
--w------- 1 root root 4096 May 3 18:25 /sys/class/scsi_host/host0/scan
--w------- 1 root root 4096 May 3 18:25 /sys/class/scsi_host/host1/scan
--w------- 1 root root 4096 May 3 18:25 /sys/class/scsi_host/host2/scan
范例:
$ echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020
$ cho {a..z..2}
a c e g i k m o q s u w y
$ echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo {A..a}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a
范例:关闭和启用 {} 的扩展功能
$ echo $-
himBH
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ set +B
$ echo $-
himH
$ echo {1..10}
{1..10}
$ set -B
$ echo $-
himBH
Tab 键可以实现命令及路径等补全,提高输入效率,避免出错;
bash-completion
yum install -y bash-completion
注意:用户给定的字符串只有一条唯一对应的命令,直接补全,否则,再次 Tab 会给出列表
范例:
$ nmcli connection 2Tab键
add clone delete down edit export help
import load modify monitor reload show up
把用户给出的字符串当作路径开头,并在其指定的上级目录下搜索以指定的字符串开头的文件名
如果唯一:则直接补全
否则,再次 Tab 会给出列表。
当执行命令后,系统默认会在内存记录执行过的命令
当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是~/.bash_history
登录进 Shell 后新执行的命令只会记录在缓存中
登录进 Shell 后新执行的命令只会记录在内存的缓存区中; 这些命令会用户退出时“追加”至命令文件。
利用命令历史,可以用它来重复执行命令,提高输入效率
命令:history
history [-c] [-d offset] [n]
history -anrw [filename]
history -ps arg [arg...]
常见的选项:
命令历史相关环境变量
持久保存变量
范例:
$ 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 HISTSIZE=100000
export HISTTIMEFORMAT="%F %T "
# 重复前一个命令方法
重复前一个命令使用上方向键,并回车执行;
按!!并回车执行;
输入!-1并回车执行;
按Ctrl + P并回车执行。
!:0 :执行前一条命令(去除参数)
Ctrl + n:显示当前历史中的下一条命令,但是不执行
Ctrl + j:执行当前命令
!n:执行history命令输出对应序号n的命令
!-n:执行history历史中倒数第n个命令
!string:重复前一个以”string”开头的命令
!?string:重复前一个包含string的命令
! string:p:仅仅打印命令历史,而不执行
!$:p:打印输出!$(上一条命令的最后一个参数)的内容
!*:p:打印输出!*(上一条命令的所有参数)的内容
^string:删除上一条命令中的第一个string
^string1^string:将上一条命令中的第一个string1替换为string2
!:gs/string1/string2:将上一条命令中所有的string1都替换为string2
使用up(向上)和down(向下)键来上下浏览从前输入的命令
Ctrl + r来在命令历史中搜索命令:
(revese-i-search)`’:
Ctrl + g:从历史搜索模式退出
# 要重新调用前一个命令中的最后一个参数
!$: :表示
Esc,. :(点击Esc键后松开,然后点击.键)
Alt+. :(按住Alt键的同时点击.键)
# 调用历史参数
Command !^ (利用上一个命令的第一个参数做cmd的参数)
Command !$ (利用上一个命令的最后一个参数做cmd的参数)
Command !* (利用上一个命令的全部参数做cmd的参数)
Command!:n(利用上一个命令的第n个参数做cmd的参数)
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开头的命令,并获取它的所有参数)
* Ctrl + l :清屏,相当于clear命令
Ctrl + o :执行当前命令,并重新显示本命令
* Ctrl + s :阻止屏幕输出,锁定
* Ctrl + q :允许屏幕输出
* Ctrl + c :终止命令
* Ctrl + z :挂起命令
* Ctrl + a :光标移动到命令行首,相当于Home
* Ctrl + e :光标移动到命令行尾,相当于End
Ctrl + f :光标向右移动一个字符
Ctrl + b :光标向左移动一个字符
Alt + f :光标向右移动一个单词尾
Alt + b :光标向左移动一个单词首
Ctrl + xx :光标在命令行首和光标之间移动
* Ctrl + u :从光标处删除至命令行首
* Ctrl + k :从光标处删除至命令行尾
* Alt + r :删除当前整行
Ctrl + w :从光标处向左删除至单词首
Alt + d :从光标处向右删除至单词尾
Ctrl + d :删除光标处的一个字符
Ctrl + h :删除光标前的一个字符
Ctrl + y :将删除的字符粘贴至光标后
Alt + c :从光标处开始向右更改为首字母大写的单词
Alt + u :从光标处开始,将右边一个单词更改为大写
Alt + l :从光标处开始,将右边一个单词更改为小写
Ctrl + t :交换光标处和之前的字符位置
Alt + t :交换光标处和之前的单词位置
Alt + # :提示输入指定字符后,重复显示该字符 # 次
注意:Alt 组合快捷键经常和其他软件冲突
范例:Xshell 中启动 Alt 键
获取帮助的能力决定了技术的能力!
多层次的帮助
whatis 使用数据库来显示命令的简短描述
此工具在系统刚安装后,不可立刻使用,需要制作数据库
执行下面命令生成数据库
# CentOS7 版本以后
mandb
# CentOS6 版本之前
makewhatis
范例:
$ whatis cal
cal (1) - display a calendar
cal (1p) - print a calendar
$ man -f cal
cal (1) - display a calendar
cal (1p) - print a calendar
范例:
$ whatis ls
ls: nothing appropriate.
# 生成man相关数据库
$ mandb
Processing manual pages under /usr/share/man...
Updating index cache for path `/usr/share/man/man4'...Wait...done
Checking for stray cats under /usr/share/man...
...省略...
$ whatis ls
ls (1) - list directory contents
ls (1p) - list directory contents
范例:
$ type history
history is a shell builtin
$ help history
history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]
...
显示用法总结和参数列表,使用的大多数,但是并非所有的。
范例:
$ 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.
$ cal -h
Usage:
cal [options] [[[day] month] year]
$ strace --help
strace: invalid option -- '-'
Try 'strace -h' for more information.
$ openssl --help
openssl:Error: '--help' is an invalid command.
$ date -h
date: invalid option -- 'h'
Try 'date --help' for more information.
$ shutdown -h
Shutdown scheduled for Tue 2022-05-03 20:31:04 CST, use 'shutdown -c' to cancel.
格式说明:
# 1.显示当前时间,格式:2016-06-18 10:20:30
$ date +"%F %T"
2021-04-29 16:58:44
# 2.显示前天是星期几
$ date -d '-2 day' +%u
2
# 3.设置当前日期为 2019-08-07 06:05:10
$ date 080706052019.10
Wed Aug 7 06:05:10 CST 2019
man 提供命令帮助的文件,手册页存放在 /usr/share/man
几乎每个命令都有 man 的"页面"
中文 man 需要安装包
man 页面分组
不同类型的帮助成为不同的“章节”,统称为 Linux 手册,man 1 man
1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions within program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]
man 命令的配置文件
# CentOS6之前版 man的配置文件
/etc/man.config
# CentOS7之后版 man的配置文件
/etc/man_db.conf
# ubuntu man的配置文件
/etc/manpath.config
格式:
MANPATH /PATH/TO/SOMEWHERE # 指明man文件搜索位置
也可以指定位置下搜索COMMAND命令的手册页并显示
man -M /PATH/TO/SOMEWHERE COMMAND
查看man手册页
$ man --help
Usage: man [OPTION...] [SECTION] PAGE...
man [章节] keyword
man 帮助段落说明
man 命令的操作方法:使用 less 命令实现
常用选项
man -a keyword
# 列出所有匹配的页面,使用 whatis 数据库
man -k keyword
man -f keyword
# 举例:
$ man -f ls
ls (1) - list directory contents
ls (1p) - list directory contents
man -w [章节] keyword
范例:
$ yum install -y man-pages
$ man -w 1 passwd
/usr/share/man/man1/passwd.1.gz
$ whatis passwd
sslpasswd (1ssl) - compute password hashes
passwd (1) - update user's authentication tokens
passwd (5) - password file
$ man lssl openssl-passwd
$ man 7 ascii
$ man 7 utf8
范例:查看passwd 相关命令和文件,man帮助文件路径
$ whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
练习:
# 1.在本机字符终端登录时,除了显示原有信息外,再显示当前登录终端号,主机名和当前时间
# 可以使用软件将图形转换为字符,ASCIIGenerator
$ cat /etc/issue
The tty is \l
The hostname is \n
The time is \t
=================================================
\S
Kernel \r on an \m
# 2.今天18:30自动关机,并提示用户
$ shutdown 18:30 "The system will shutdown autocatically at 20:30 tonight,please save your file"
man 常用于命令参考,GNU 工具 info 适合通用文档参考;
没有参考,列出所有的页面;
info 页面的结构就像一个网站;
每一页分为“节点”;
链接节点之前 *
info 命令格式:
info [ 命令 ]
导航 info 页:
Applications → Documentation → help(CentOS 7)
System → help(CentOS 6)
/usr/share/doc
http://www.github.com
http://www.kernel.org/doc/html/latest/
http://httpd.apache.org
http://www.nginx.org/
https://mariadb.com/kb/en
https://dev.mysql.com/doc/
https://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
通过发行版官方的文档光盘或者网站可以获取安装指南,部署指南,虚拟化指南等。
rhn.redhat.com 或者本地卫星服务器 / 代理服务器
RHN 账号为及其注册和基于网络管理的 RHN 用户
sosreport 收集所有系统上的日志信息的工具,并自动打包压缩包,方便技术支持人员和红帽全球支持提供分析问题依据。
范例:
$ yum install -y sos
$ sosreport
Please note the 'sosreport' command has been deprecated in favor of the new 'sos' command, E.G. 'sos report'.
Redirecting to 'sos report '
sosreport (version 4.0)
This command will collect diagnostic and configuration information from
this CentOS system and installed applications.
An archive containing the collected information will be generated in
/var/tmp/sos.5rr_xr0d and may be provided to a CentOS support
representative.
Any information provided to CentOS will be treated in accordance with
the published support policies at:
https://www.centos.org/
...省略...
Finishing plugins [Running: selinux] ]ger]
Finished running plugins
Creating compressed archive...
Your sosreport has been generated and saved in:
/var/tmp/sosreport-CentOS8-Server-2022-05-03-gldmows.tar.xz
Size 15.74MiB
Owner root
md5 aa24e602e6582f2633126f73c14c863b
Please send this file to your support representative.
http://www.google.com
http://bing.com
http://www.baidu.com
http://www.slideshare.net
# 1.下载源码
源码网址 https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/
下载源码 wget https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/v1.5.2.tar.gz/1bbdc4f32272df0b95146518b27bf4be/v1.5.2.tar.gz
[root@localhost opt]# wget https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.1.tar.gz/13275fd039de8788b15151c896150bc4/manpages-zh-1.5.1.tar.gz
# 2.解压并安装
[root@localhost opt]# tar xf manpages-zh-1.5.1.tar.gz
[root@localhost opt]# cd manpages-zh-1.5.2/
[root@localhost manpages-zh-1.5.1]# ./configure --disable-zhtw --prefix=/usr/local/zhman
[root@localhost manpages-zh-1.5.1]# make && make install
# 3.为了不抵消man,我们新建cman命令作为中文查询
[root@localhost man1]# cd ~
[root@localhost ~]# echo "alias cman='man -M /usr/local/zhman/share/man/zh_CN' " >>.bash_profile
[root@localhost ~]# source .bash_profile
# 4.使用中文man查询命令
[root@localhost ~]# cman ls