首页 > 系统相关 >第二章 Linux基础入门和帮助

第二章 Linux基础入门和帮助

时间:2024-10-30 23:18:50浏览次数:6  
标签:... 入门 -- echo 命令 Linux 第二章 root rocky8

文章目录

第二章 Linux基础入门和帮助

内容概述

  • 用户
  • 终端
  • Shell介绍
  • 执行命令
  • 简单命令
  • Tab键补全
  • 命令行历史
  • bash快捷键
  • 帮助用法

本章首先我们先说一下什么是Linux的用户,包括终端的概念,以及在Linux中我们是如何执行命令的,它这个执行命令背后是怎么实现的,并且还会介绍一些简单命令,比方说怎么去查看主机名,设置主机名,怎么去查看当前系统的一些状态,比方说版本等等,在Linux中为了提供效率它有好多快捷键可以用,比方说有Tab键的补全等等,另外还可以利用历史提高我们的工作效率,在shell中我们还是要养成一个看帮助的习惯。

1.Linux 基础

1.1 用户类型

  • root 用户
    一个特殊的管理帐户
    也被称为超级用户
    root已接近完整的系统控制
    对系统损害几乎有无限的能力
    除非必要,不要登录为 root
  • 普通( 非特权 )用户
    权限有限
    造成损害的能力比较有限

在Linux中目前来讲咱们在安装系统的时候是不是有两个用户,一个是我们安装系统的时候指定了root用户,这个root用户实际上是安装系统就本身带的,但是在Ubuntu里面好像在安装系统的时候它并不是让我们对root做什么操作,而是创建了一个自己指定的用户;在Linux中系统有一个root账号,这个是超级管理员,这个权利很大,我们还可以创建一个普通用户,这个用户它的权限相对就小,好多事做不了,只能做一些简单的基本操作,比方说我看一看什么东西,但是要涉及到一些系统的配置那它是没有权限去做的,而root权限很大,这是个超级管理员,所以在生产中我们有的时候为了安全,通常都是不太建议用root直接登录,建议拿普通用户登录,登录以后权限比较小,不至于造成误破坏,当然要真的进行一些管理任务了你还得要么切换成root用户,因为普通用户权限不够,要么我们可以通过一些别的机制,比方说通过sudo机制来进行管理,在Ubuntu里面就用的sudo机制,这个问题我们稍后再给大家展开详细介绍,总之你记住在目前的当前系统中我们Linux里面只有两种账户,一种是超级管理员root,这个是超级用户权利很大,它的用户名默认就叫root,但事实上必须叫root吗,那倒也不一定,不过目前咱们先暂时不用去了解那么多,我们目前暂时就认为超级管理员必须叫root,普通用户你随便建一个,它的权限很小。

范例1:理解普通用户和root用户的概念

目前来讲我们装好系统以后,我们平常去使用Linux的话,我们不会说是坐在这个机器跟前这么去操作,装好系统后在图2-1上可以输入普通用户名和密码登录。

在这里插入图片描述

图2-1 Ubuntu登录界面

用装系统时设置的普通用户登录,下面就是登录后的界面,如图2-2所示。

在这里插入图片描述

图2-2 Ubuntu登录后的界面

raymond@ubuntu2204:~$ 
# 命令行raymond表示普通用户名,ubuntu2204表示主机名,$表示当前是普通用户登录。

Rocky我们装系统的时候它要求我们指定root口令,在Rocky里面默认root是可以直接登录的,Ubunntu默认root不能登录,只能拿装系统时创建的普通用户登录,我们需要执行一些管理任务,你像我想创建一个新账号或者是要改什么东西,这个作为普通用户权限是不够的,需要做一些切换才可以。

raymond@ubuntu2204:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
# cat是查看文件后面跟了一个文件,你会发现作为普通用户来讲它权限很小。

raymond@ubuntu2204:~$ sudo -i
[sudo] password for raymond: 
root@ubuntu2204:~# 
# 在Ubuntu里面想查看这个文件要执行下面操作,使用sudo -i命令,它可以来帮我们把权限变成另外一个人,这时候就切换成root了。

root@ubuntu2204:~# cat /etc/shadow
root:*:19579:0:99999:7:::
daemon:*:19579:0:99999:7:::
bin:*:19579:0:99999:7:::
sys:*:19579:0:99999:7:::
sync:*:19579:0:99999:7:::
games:*:19579:0:99999:7:::
man:*:19579:0:99999:7:::
lp:*:19579:0:99999:7:::
mail:*:19579:0:99999:7:::
news:*:19579:0:99999:7:::
uucp:*:19579:0:99999:7:::
proxy:*:19579:0:99999:7:::
www-data:*:19579:0:99999:7:::
backup:*:19579:0:99999:7:::
list:*:19579:0:99999:7:::
irc:*:19579:0:99999:7:::
gnats:*:19579:0:99999:7:::
nobody:*:19579:0:99999:7:::
_apt:*:19579:0:99999:7:::
systemd-network:*:19579:0:99999:7:::
systemd-resolve:*:19579:0:99999:7:::
messagebus:*:19579:0:99999:7:::
systemd-timesync:*:19579:0:99999:7:::
pollinate:*:19579:0:99999:7:::
sshd:*:19579:0:99999:7:::
syslog:*:19579:0:99999:7:::
uuidd:*:19579:0:99999:7:::
tcpdump:*:19579:0:99999:7:::
tss:*:19579:0:99999:7:::
landscape:*:19579:0:99999:7:::
fwupd-refresh:*:19579:0:99999:7:::
usbmux:*:19671:0:99999:7:::
raymond:$6$4iTw431hIiV2cKJq$zBbzG1Yw84uII4CIPKKK2IsWb/OQ6vtfbss7yzU5MSBWPCn14TBRlFZz4amujscJiTqamWLxvYTYz6Qt0fwKI.:19671:0:99999:7:::
lxd:!:19671::::::
# 切换成root用户以后,你再去执行上面的查看命令就可以,它不会提示权限拒绝,说明这个权限已经变过来了,大家可以看到当前的身份已经变成root了,这就是Ubuntu的一个用法,通过这个案例你先不用知道sudo -i这个命令是干嘛的,你先理解普通用户的权限很小,好多事它干不了,要想干它就得变成root才可以。

在Rocky里面默认root就可以登录,如图2-3所示。

在这里插入图片描述

图2-3 Rocky登录界面

在这里插入图片描述

图2-4 Rocky登录后界面

[root@rocky9 ~]# cat /etc/shadow
root:$6$ZjSfRJ3GBH4LVxUw$X7F4yfWcB1WikRHKSxsaXwLWGTedo0bB9SRhN2Nj0I/rbPwPMI1wqvPdDFom7x1ZRbg8p7TM.mL91tY0sKGGK.::0:99999:7:::
bin:*:19469:0:99999:7:::
daemon:*:19469:0:99999:7:::
adm:*:19469:0:99999:7:::
lp:*:19469:0:99999:7:::
sync:*:19469:0:99999:7:::
shutdown:*:19469:0:99999:7:::
halt:*:19469:0:99999:7:::
mail:*:19469:0:99999:7:::
operator:*:19469:0:99999:7:::
games:*:19469:0:99999:7:::
ftp:*:19469:0:99999:7:::
nobody:*:19469:0:99999:7:::
systemd-coredump:!!:19671::::::
dbus:!!:19671::::::
sssd:!!:19671::::::
tss:!!:19671::::::
sshd:!!:19671::::::
chrony:!!:19671::::::
systemd-oom:!*:19671::::::
# Rocky默认root可以登录,它什么权限都有。

1.2 远程连接工具

1.2.1 Windows PowerShell工具

范例2:用Windows里自带终端工具PowerShell工具连接Linux。

# windows 10以上系统才有PowerShell工具。
Windows PowerShell
版权所有(C) Microsoft Corporation。保留所有权利。

安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows

PS C:\Users\19661> ssh [email protected] # 在这里输入命令
The authenticity of host '172.31.7.1 (172.31.7.1)' can't be established.
ED25519 key fingerprint is SHA256:RtYGmv1MEHWFMjq3E0QFkoEAU8uopC/0DpcZ3TPVe8w.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes # 这里提示你是否要继续连接,输入“yes”
Warning: Permanently added '172.31.7.1' (ED25519) to the list of known hosts.
[email protected]'s password: # 在这里输入密码
Last login: Thu Nov 16 17:23:29 2023 from 172.31.0.1
[root@rocky9 ~]#

1.2.2 Xshell软件使用

Xshell是一个强大的安全终端模拟软件,支持SSH、SSH2,以及Microsoft Windows平台的TELNEL协议。使用Xshell登录的终端也是属于伪终端类型。可以免费下载安装,目前已经发布了Xshell 7版本了。

Xshell下载地址:https://www.xshell.com/zh/xshell/,在前面的网址下载Xshell软件,如图2-5所示。

在这里插入图片描述

图2-5 下载Xshell

Xshell的安装很简单,双击安装文件,直接点下一步就好,这里就不再演示,相信大家都会。

安装完成,双击xshell图标打开软件,如图2-6所示。

在这里插入图片描述

图2-6 打开Xshell的界面

在图2-6中点击新建,打开后如图2-8,在“”连接”里设置“名称”为:rocky9,“主机”请登录虚拟机如图2-7用hostname -I命令查看ip地址,可以看到ip地址是172.31.7.1,主机这里设置的就是172.31.7.1,然后勾选“连接异常关闭时自动重新连接”,“间隔”为:1秒。

在这里插入图片描述

图2-7 查看Rocky IP地址

在这里插入图片描述

图2-8 新建会话

然后选择“用户身份验证”,然后设置用户名和密码,如图2-9所示。

在这里插入图片描述

图2-9 设置用户名和密码

然后选择“终端”下面的“键盘”,设置“DELETE键序列”为:ASCII 127 (Ctrl+?)(A),设置"BACKSPACE键序列"为:ASCII 127 (Ctrl+?)(I),设置“元(Meta)键仿真”,勾选“将左ALT用作Meta键”和“将右ALT用作Meta键”,如图2-10所示。

在这里插入图片描述

图2-10 键盘设置

然后选择“外观”,设置“配色方案”为:XTerm,设置“字体”为:Courier New,“字体大小“为:14,然后点“确定”就设置完成了,如图2-11所示。

注意:这里为啥设置字体为Courier New,因为在Xshell使用中会出现输入反斜杠\ 显示成 W的问题,修改成Courier New即可,该字体是等宽字体。

在这里插入图片描述

图2-11 设置外观

弹出界面选择rocky9,单击“连接”,如图2-12所示。

在这里插入图片描述

图2-12 准备连接会话

弹出图2-13界面就是登录系统后的界面。

在这里插入图片描述

图2-13 登录系统

登录系统后,就可以进行linux学习了。

1.2.3 MobaXterm软件使用

MobaXterm和Xshell一样都是远程连接工具。

MobaXterm下载地址:https://mobaxterm.mobatek.net/download.html,可以去前面网址下载MobaXterm软件,如图2-14所示。

在这里插入图片描述

图2-14 MobaXterm下载

MobaXterm有Home Edition版是免费版本,Professional Edition版本是收费版本,如果不是特殊需求免费版本就够用了。

当然MobaXterm的安装很简单,双击安装文件,直接点下一步就好,这里就不再演示,相信大家都会。

安装完成,双击MobaXterm图标打开软件,如图2-15所示。

在这里插入图片描述

图2-15 打开MobaXterm的界面

在图2-15界面中点“Sesson”,弹出的界面选“SSH”,然后设置“Remote host(远程主机)”,如图2-16用hostname -I查看Ubuntu的IP地址,“Specify username(指定用户名)”,然后单击“OK”,如图2-17所示。

在这里插入图片描述

图2-16 查看Ubuntu ip地址

在这里插入图片描述

图2-17 设置主机和用户名

在弹出的窗口选择“Accept(同意)”,这个窗口就是安全警告,如图2-18所示。

在这里插入图片描述

图2-18 安全警告

在弹出的窗口输入密码,如图2-19所示。

在这里插入图片描述

图2-19 输入密码

弹出的窗口问你是否保存root密码,选择“No”,如图2-20所示。

在这里插入图片描述

图2-20 是否保存root密码

弹出的窗口就是登录后的界面,如图2-21所示。

在这里插入图片描述

图2-21 登录界面

1.3 终端 terminal

在这里插入图片描述

图2-22 终端

设备终端:键盘、鼠标、显示器。

1.3.1 终端类型

  • 控制台终端: /dev/console
  • 串行终端:/dev/ttyS#
  • 虚拟终端:tty:teletypewriters, /dev/tty#,tty 可有n个,Ctrl+Alt+F#
  • 图形终端:startx, xwindows
    CentOS 6: Ctrl + Alt + F7
    CentOS 7: 在哪个终端启动,即位于哪个虚拟终端
  • 伪终端:pty:pseudo-tty , /dev/pts/# 如:SSH远程连接

它这个终端在系统中都有一个对应的文件名,这些终端都是一些名称,这些名称在不同的连接方式下它的终端的名称是不一样的,在一个主机上我们是可以通过不同的终端窗口来进行连接的,在进行连接的时候我怎么区分到底在哪个终端连呢,可以在同一个主机上开多个终端的,什么意思呢,可以在一个主机上分别连多次到同一个主机。

双击图2-23的rocky9窗口可以同时打开多个窗口。

在这里插入图片描述

图1-23 同时开多个窗口

可以看到图2-24同时开了两个rocky9 的窗口。

在这里插入图片描述

图1-24 同时开多个窗口2

1.3.2 查看当前的终端设备

范例3:tty 命令可以查看当前所在终端

[root@rocky9 ~]# tty
/dev/pts/0

# 在重新开一个窗口
[root@rocky9 ~]# tty
/dev/pts/1
# 可以发现每个连接的窗口它们对应的设备名是不一样的。

1.4 交互式接口

交互式接口:启动终端后,在终端设备附加一个交互式应用程序。

1.4.1 交互式接口类型

  • GUI:Graphic User Interface
    X protocol, window manager, desktop
    Desktop:
    GNOME (C, 图形库gtk),
    KDE (C++,图形库qt)
    XFCE (轻量级桌面)
  • CLI:Command Line Interface
    shell程序

在管理Linux的时候主要是通过两种形式来管,一种是图形界面,图形界面需要在安装的时候选择图形窗口的组件安装,Linux和Windows有一个很大的差别就是Linux里面图形界面并不属于操作系统的核心组件,它的核心组件和你的图形和字符没有什么直接关系,图形界面属于Linux里面的相当于一个软件一样,这个软件自然就是可以装也可以不装,在Linux里面如果我们按照最小安装它只会安装字符界面,字符界面它的连接就是刚才说的那个命令行的方式来连接,我们叫CLI,图形化的叫GUI,GUI我们一般生产中用的不多,我们一般都是用字符界面,生产中图形界面装上以后可能会影响你的系统性能,所以我们平常工作中主要用的是CLI。

1.4.2 什么是shell

在这里插入图片描述

图2-25 shell

Shell 是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。

shell也被称为LINUX的命令解释器(command interpreter),Shell 本身是一个程序。将用户输入的命令行拆解为”命令名“与”参数“。接着,根据命令名找到对应要执行的程序,对被执行的程序进行初始化,然后将刚才解析出来的参数传给该程序并执行。

shell是一种高级程序设计语言,提供了变量,函数,条件判断,循环等开发语言的功能。

由于Shell本身是个程序,所以它可以被任何用户自己开发的各种Shell所代替。

在Linux里面我们目前来讲连过去我们可以执行命令了,比方说我们刚刚执行的tty命令,tty命令是可以显示你所在的终端的,tty实际上是teletypewriters的意思,实际上tty是来自于打字机,这个命令表示你是在哪个打字机的终端窗口来连接,另外刚才执行的hostname -I命令是查看你的ip地址,也可以不加-I显示你的主机名称,这时候我们执行用的就是Linux的各种命令,但是大家注意到没有,我们曾经给大家讲冯·诺依曼体系说过,在冯·诺依曼里面我们说计算机只能识别什么,是不是只能识别所谓的二进制,但是我们现在明明不是执行的二进制,明明写的是英语单词,那这个东西是不是有点矛盾呢,事实上早期的时候,大家记得我们在第一章讲计算机基础确实就是输入计算机的时候是输的什么,是不是输的打孔的纸带,那个纸带是不是0101,那时候确实是二进制的,但是话说回来目前来讲我们已经不用这种太古老的方式了,因为这种方式对用户太不友好了,目前来讲它可以通过另一种间接的手段,怎么间接呢,就是我们人不要这样面对二进制了,我们人敲英语单词,当然因为计算机大家都知道最早是美国人发明的,所以我们现在都是敲英语单词,而英语单词对应的就是一个命令,当然如果是中国人发明的那就应该是支持中国字了,可惜目前咱们用的都是美国人发明的,所以人家就是英语单词作为指令,这个英语单词写好以后当然计算机肯定是不支持,就是计算机不理解,不理解那背后就需要有一个这个程序,这个程序自动的把我们输入的英语单词,然后帮我们把它解释执行成机器可以识别的二进制,进而执行,也就是说背后有一个程序帮我们干的这个事,只不过就是我们人不用做,是程序帮我们干了,那这个事情谁来干呢,就叫所谓的shell;

shell翻译成壳,我们翻译成壳不伦不类的,所以我们一般就不翻译了,就直接叫shell就好了,shell是工作在用户和内核之间,什么意思,就是这个shell它是背后在默默执行的一个程序,我们现在感觉不到它的存在,但是它确实是运行着,shell在用户登录之后会自动的运行在你的计算机内部,这个内部的程序在后台执行,就是我们现在看不到它,但是看不到是看不到,但是它确实给我们默默提供服务,这个程序它可以把你输入的这个英文单词,转化成计算机能理解的机器码,然后最终执行它。

范例4:查看当前运行的shell

[root@rocky9 ~]# ps
    PID TTY          TIME CMD
   1274 pts/0    00:00:00 bash # 当前运行的shell
   1384 pts/0    00:00:00 ps
# ps命令可以列出你当前窗口里执行的程序,你看这里面有一个叫bash的东西,这个bash就是刚才说的shell。

shell就是连接用户和内核之间的一个桥梁,shell是个软件,而这个软件Linux是开源的,因此难道这个shell这个软件就是只有一种吗?当然不是了,我们可以把shell理解成一个翻译,把我们人类输入的这个英文单词,一些字符转化成计算机能执行的代码,这个转换这个程序叫shell,但是这个shell既然是程序那就可以有别的同样功能的程序,就像翻译一样,我找张三翻译,是不是也可以找李四翻译,比方说我去某个地方,我可以请不同的翻译去做不同的事,shell也是存在多种类型的。

1.4.3 各种Shell

在这里插入图片描述

图2-26 各种shell

  • sh:Steve Bourne
  • bash:Bourne-Again Shell,GPL,Rocky 和 Ubuntu 默认使用
  • csh:c shell , C 语言风格
  • tcsh
  • ksh :Korn Shell, AIX 默认 shell
  • zsh: MacOS默认shell

图2-26就是从历史上发展到现在出现了各种各样的shell,最早时候叫sh,后来还提供了一些它的衍生版本,比方说ksh、bash,我们现在用的就是bash,bash实际上是后来的版本,早期的时候用的是sh、csh、tcsh等等各种版本,MacOS用的是zsh,Linux主流的用的是bash。

1.4.4 bash shell

GNU Bourne-Again Shell(bash)是GNU计划中重要的工具软件之一,目前也是 Linux标准的shell,与sh兼容。

显示当前使用的shell

echo ${SHELL}

范例5:显示当前使用的shell

[root@rocky9 ~]# echo $SHELL
/bin/bash
[root@rocky9 ~]# echo ${SHELL}
/bin/bash

raymond@ubuntu2204:~$  echo $SHELL
/bin/bash
# Ubuntu用的也是bash shell

显示当前系统使用的所有shell

cat /etc/shells

**范例6:**显示当前系统中支持的shell

[root@rocky9 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

raymond@ubuntu2204:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/sh
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen

1.5 设置主机名

hostname NAME

范例7:设置主机名

# hostname默认查看主机名
[root@rocky9 ~]# hostname
rocky9

# 临时生效,重启系统后就无效了
[root@rocky9 ~]# hostname bj-yz-k8s-node1-100-10.raymond.cc
[root@rocky9 ~]# hostname
bj-yz-k8s-node1-100-10.raymond.cc
# 可以看到已经设置过了,但是没有变

# 需要把当前登录终端退出来重登一下
[root@rocky9 ~]# exit
logout

Connection closed.

Disconnected from remote host(rocky9) at 21:42:22.

Type `help' to learn how to use Xshell prompt.
[C:\~]$ 
Reconnecting in 1 seconds. Press any key to exit local shell.
.

Connecting to 172.31.7.1:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Thu Nov 16 19:04:15 2023 from 172.31.0.1
[root@bj-yz-k8s-node1-100-10 ~]#
# 现在就可以看到主机名已经变了。

[root@bj-yz-k8s-node1-100-10 ~]# reboot
[root@rocky9 ~]# hostname
rocky9
# 临时修改重启之后又不生效了。

# Rocky8/9、CentOS 7、CentOS Stream 8/9和Ubuntu永久生效
[root@rocky9 ~]# hostnamectl set-hostname bj-yz-k8s-node1-100-10.raymond.cc 
# 什么是永久生效,就是机器重启之后它不会丢失,而用hostname命令设置主机名虽然现在它可以生效,但是一重启就会丢掉,就是存不住,实际上所谓的存不住原因就是因为它在执行的时候,如果它仅仅是把它修改了,但是是在内存中修改,内存断电就会丢失,像这种临时性的都是在内存中修改,而永久就是因为它不仅在内存中改了,而且它重要的是把磁盘文件改了,而磁盘文件断电是不丢失的,所以下次计算机启动的话它是可以从磁盘中得到你改的设置,从而保证信息可以永久生效,总结就是要想临时生效就在内存中,要想永久保存就得写到文件中。

# CentOS 6设置主机名
[root@centos6 ~]# sed -i.bak -r '/^HOSTNAME/s#^(HOSTNAME=).*#\1'centos6'#' /etc/sysconfig/network 

注意:主机名不支持使用下划线,但支持横线

一般在生产中建议大家把每个机器都有一定的含义,保证我们将来可以通过主机名判断出这个机器的一些状态,所以我们起名字的时候都是有一些特殊的命名方案的,“bj-yz-k8s-node1-100-10.raymond.cc”这个是一种命名方案,这种方案生产中大家可以参考,但并不强制,这里面需要注意的就是作为主机名来讲,我们可以选择用英文单词,用英文字母大小写,当然一般建议小写字母,还有数字,还有横线,但是不支持下划线,如果你用下下划线很有可能出现一个问题,虽然你表面上设了,但是将来你的系统可能会因为这个下划线导致一些服务出现故障,所以大家不要用下划线。

“bj-yz-k8s-node1-100-10.raymond.cc”这个名字是怎么起的,这个是企业里面的一个命名方案,比方说bj表示我们当前主机在北京,因为有些公司的机房可能在全国各地,甚至是在全球各地都有自己的机房,所以我们为了表示这个机器的位置,我们可能会加这样的一个缩写,yz表示亦庄IDC机房,k8s表示上面跑的什么服务,然后k8s里面涉及到好多的主机,我们主机称为节点,说白了一台计算机就是一个节点,其中k8s里面是由多个主机组成的,其中有一个主机叫node1,后面跟的“100-10”是一个ip地址的后两位,比方说生产中我们的ip地址可能都在某一个网段里面,假如我们现在的环境ip地址是172.31.7.1,这时候因为前几个数字一般都是一样的,所以我们在命名的时候就取100-10这两个数,这就表示我们这个机器的地址,后面“raymond.cc”是公司的域名。

1.6 命令提示符

命令提示符:prompt

范例8:root用户和普通用户的命令提示符

[root@rocky9 ~]#
[raymond@rocky9 ~]$

# 管理员

$ 普通用户

root用户登录和普通用户登录提示符是不一样的,如果是普通用户它显示的是$,如果是root用户显示的是#。

显示提示符格式

范例9:echo $PS1显示提示符格式

[root@rocky9 ~]# echo $PS1
[\u@\h \W]\$

提示符格式说明:

那么[\u@\h \W]$分别代表如下介绍:

左中括号即“[”、右中括号“]”、@和空格等是没有什么特殊意思按原样显示。

\u表示当前用户;

\h表示主机名简称;

\W表示当前工作目录基名,即用basename命令取得工作目录的名称;

$表示提示符(普通用户显示为字符$,root用户显示为字符#);

还有一些符号,表示意义如下:

\H表示完整的主机名;

\w表示完整的工作目录,家目录以~(波浪符)表示;

\t表示24小时时间格式为时:分:秒;

\T表示12小时时间格式为时:分:秒;

\A表示24小时时间格式为时:分;

!表示命令历史数;

#表示开机命令历史数;

\d表示日期,格式为星期 月 日;

\v表示BASH的版本信息;

\e 表示控制符\033;

还可以给字符设置颜色,格式为[\e[F;B;Sm],其中“F”为字体颜色,编号30-37;“B”为背景色,编号40-47,说明下,e可以用033代替,功能完全一样,功能都是引导非常规显示提示符字体颜色和背景色的颜色号码分别表示如下:

字体颜色背景色颜色
3040黑色
3141红色
3242绿色
3343黄色
3444蓝色
3545紫色
3646青色
3747白色

表2-1 提示符字体颜色和背景色的颜色号码代表含义

“S”为显示的样式,常见代码如下:

0:表示关闭颜色设置;

1:表示粗体;

4:表示加下划线;

5:表示闪烁;

7:表示字体颜色和背景色互换;

8:表示隐藏。

范例10:修改提示符格式

PS1="\[\e[1;5;41;33m\][\u@\h \W]\\$\[\e[0m\]"
# 1表示高亮,5表示闪烁,41表示背景色为红色,33表示字体颜色为黄色。

PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"

范例11:Rocky和CentOS系统持久保存提示符格式相关变量 PS1

[root@rocky9 ~]# echo 'PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"' > /etc/profile.d/env.sh

[root@rocky9 ~]# cat /etc/profile.d/env.sh
PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"

# 设置之后需要退出重登才能生效
[root@rocky9 ~]# exit
logout
[21:50:43 root@rocky9 ~]#

在这里插入图片描述

图2-27 Rocky永久修改提示符

范例12:ubuntu 修改提示符

raymond@ubuntu2204:~$ echo 'PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"' >> .bashrc

# 设置之后需要退出重登才能生效
raymond@ubuntu2204:~$ exit
logout
...
[13:53:34 raymond@ubuntu2204 ~]$

在这里插入图片描述

图2-28 Ubuntu永久修改提示符

1.7 执行命令

1.7.1 执行命令过程

输入命令后回车,提请shell程序找到键入命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来。

1.7.2 shell中可执行的两类命令

  • 内部命令:由shell自带的,而且通过某命令形式提供,用户登录后自动加载并常驻内存中。
  • 外部命令:在文件系统路径下有对应的可执行程序文件,当执行命令时才从磁盘加载至内存中,执行完毕后从内存中删除。

区别指定的命令是内部或外部命令

type COMMAND

范例13:查看是否存在对应内部和外部命令

[root@rocky8 ~]# echo $SHELL
/bin/bash
[root@rocky8 ~]# ll /bin/bash
-rwxr-xr-x. 1 root root 1219248 Nov  9  2019 /bin/bash
[root@rocky8 ~]# echo hello
hello

# 查看所有内部命令帮助
[root@rocky8 ~]# help		
GNU bash, version 4.4.19(1)-release (x86_64-redhat-linux-gnu)
These shell commands are defined internally.  Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.

A star (*) next to a name means that the command is disabled.

 job_spec [&]                                            history [-c] [-d offset] [n] or history -anrw [filen>
 (( expression ))                                        if COMMANDS; then COMMANDS; [ elif COMMANDS; then CO>
 . filename [arguments]                                  jobs [-lnprs] [jobspec ...] or jobs -x command [arg>
 :                                                       kill [-s sigspec | -n signum | -sigspec] pid | jobsp>
 [ arg... ]                                              let arg [arg ...]
 [[ expression ]]                                        local [option] name[=value] ...
 alias [-p] [name[=value] ... ]                          logout [n]
 bg [job_spec ...]                                       mapfile [-d delim] [-n count] [-O origin] [-s count]>
 bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] >  popd [-n] [+N | -N]
 break [n]                                               printf [-v var] format [arguments]
 builtin [shell-builtin [arg ...]]                       pushd [-n] [+N | -N | dir]
 caller [expr]                                           pwd [-LP]
 case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]...>  read [-ers] [-a array] [-d delim] [-i text] [-n ncha>
 cd [-L|[-P [-e]] [-@]] [dir]                            readarray [-n count] [-O origin] [-s count] [-t] [-u>
 command [-pVv] command [arg ...]                        readonly [-aAf] [name[=value] ...] or readonly -p
 compgen [-abcdefgjksuv] [-o option] [-A action] [-G g>  return [n]
 complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A >  select NAME [in WORDS ... ;] do COMMANDS; done
 compopt [-o|+o option] [-DE] [name ...]                 set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg >
 continue [n]                                            shift [n]
 coproc [NAME] command [redirections]                    shopt [-pqsu] [-o] [optname ...]
 declare [-aAfFgilnrtux] [-p] [name[=value] ...]         source filename [arguments]
 dirs [-clpv] [+N] [-N]                                  suspend [-f]
 disown [-h] [-ar] [jobspec ... | pid ...]               test [expr]
 echo [-neE] [arg ...]                                   time [-p] pipeline
 enable [-a] [-dnps] [-f filename] [name ...]            times
 eval [arg ...]                                          trap [-lp] [[arg] signal_spec ...]
 exec [-cl] [-a name] [command [arguments ...]] [redir>  true
 exit [n]                                                type [-afptP] name [name ...]
 export [-fn] [name[=value] ...] or export -p            typeset [-aAfFgilnrtux] [-p] name[=value] ...
 false                                                   ulimit [-SHabcdefiklmnpqrstuvxPT] [limit]
 fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep>  umask [-p] [-S] [mode]
 fg [job_spec]                                           unalias [-a] name [name ...]
 for NAME [in WORDS ... ] ; do COMMANDS; done            unset [-f] [-v] [-n] [name ...]
 for (( exp1; exp2; exp3 )); do COMMANDS; done           until COMMANDS; do COMMANDS; done
 function name { COMMANDS ; } or name () { COMMANDS ; >  variables - Names and meanings of some shell variabl>
 getopts optstring name [arg]                            wait [-n] [id ...]
 hash [-lr] [-p pathname] [-dt] [name ...]               while COMMANDS; do COMMANDS; done
 help [-dms] [pattern ...]                               { COMMANDS ; }

[root@rocky8 ~]# who
root     pts/0        2021-10-06 14:15 (172.31.0.1)
[root@rocky8 ~]# which who
/usr/bin/who
[root@rocky8 ~]# ll /usr/bin/who
-rwxr-xr-x. 1 root root 55064 Mar 15  2021 /usr/bin/who
[root@rocky8 ~]# ll /bin/bash
-rwxr-xr-x. 1 root root 1150672 Jun 17 07:44 /bin/bash

[root@rocky8 ~]#  hostname
rocky8

# type查看文件类型
[root@rocky8 ~]# type hostname
hostname is hashed (/usr/bin/hostname)	#如果显示文件路径就是外部命令
[root@rocky8 ~]# type help
help is a shell builtin	#如果显示shell builtin就是内部命令

[root@rocky8 ~]# type xxx
-bash: type: xxx: not found	#如果写错,找不到
[root@rocky8 ~]# type type
type is a shell builtin	# type命令本身是一个内部命令

[root@rocky8 ~]# which echo
/usr/bin/echo
[root@rocky8 ~]# ll /usr/bin/echo
-rwxr-xr-x. 1 root root 38440 Mar 15  2021 /usr/bin/echo
[root@rocky8 ~]# type echo
echo is a shell builtin
[root@rocky8 ~]# type -a echo	#type -a 显示对应的内部和外部命令
echo is a shell builtin
echo is /usr/bin/echo

[root@rocky8 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin		#$PATH变量定义了外部命令的搜索顺序,从前往后搜索

[root@rocky8 ~]# xxxx
bash: xxxx: command not found...	#如果不在$PATH变量路径里就提示找不到
1.7.2.1 内部命令相关

help 内部命令列表

enable 管理内部命令

  • enable cmd 启用内部命令
  • enable –n cmd 禁用内部命令
  • enable –n 查看所有禁用的内部命令

范例14:enable命令默认显示所有的内部命令

# 默认显示所有的内部命令
[root@rocky8 ~]# enable	
enable .
enable :
enable [
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
enable command
enable compgen
enable complete
enable compopt
enable continue
enable declare
enable dirs
enable disown
enable echo
enable enable
enable eval
enable exec
enable exit
enable export
enable false
enable fc
enable fg
enable getopts
enable hash
enable help
enable history
enable jobs
enable kill
enable let
enable local
enable logout
enable mapfile
enable popd
enable printf
enable pushd
enable pwd
enable read
enable readarray
enable readonly
enable return
enable set
enable shift
enable shopt
enable source
enable suspend
enable test
enable times
enable trap
enable true
enable type
enable typeset
enable ulimit
enable umask
enable unalias
enable unset
enable wait

[root@rocky8 ~]# enable |wc -l
61
1.7.2.2 执行外部命令

查看外部命令路径:

which -a |--skip-alias
whereis

Hash缓存表
系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率。

hash 命令常见用法

  • hash 显示hash缓存
  • hash -l 显示hash缓存,可作为输入使用
  • hash -p path name 将命令全路径path起别名为name
  • hash -t name 打印缓存中name的路径
  • hash -d name 清除name缓存
  • hash -r 清除全部缓存

范例15:hash命令常见用法

[root@rocky8 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@rocky8 ~]# who
root     pts/0        2021-10-06 14:15 (172.31.0.1)

# 查看被hash表缓存的命令
[root@rocky8 ~]# hash	
hits	command
   1	/usr/bin/who		

[root@rocky8 ~]# hash
hits	command
   2	/usr/bin/who
[root@centos8 ~]# exit
logout
[root@rocky8 ~]# hash
hash: hash table empty		#退出重新登陆hash缓存表就清空了

1.7.3 命令别名

对于经常执行的较长的命令,可以将其定义成较短的别名,以方便执行

显示当前shell进程所有可用的命令别名

alias

定义别名NAME,其相当于执行命令VALUE

alias NAME='VALUE'

撤消别名:unalias

unalias [-a] name [name ...]
unalias -a #取消所有别名

注意:在命令行中定义的别名,仅对当前shell进程有效。

范例16:命令别名详解

[root@rocky8 ~]# alias cdnet="cd /etc/sysconfig/network-scripts/"
[root@rocky8 ~]# cdnet
[root@rocky8 network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@rocky8 network-scripts]# type cdnet
cdnet is aliased to `cd /etc/sysconfig/network-scripts/'

[root@rocky8 network-scripts]# alias echo=hostname
[root@rocky8 network-scripts]# type echo
echo is aliased to `hostname'
[root@rocky8 network-scripts]# echo
rocky8
[root@rocky8 network-scripts]# unalias echo
[root@rocky8 network-scripts]# type echo
echo is a shell builtin

[root@rocky8 network-scripts]# alias
alias cdnet='cd /etc/sysconfig/network-scripts/'
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 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 which='(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot'
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'

#添加一块20G磁盘
[root@rocky8 ~]# echo '- - -' > /sys/class/scsi_host/host0/scan 	#加载刚添加的磁盘
[root@rocky8 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  200G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0  100G  0 part /
├─sda3   8:3    0   50G  0 part /data
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0    4G  0 part [SWAP]
sr0     11:0    1  7.7G  0 rom  
[root@rocky8 ~]# echo '- - -' > /sys/class/scsi_host/host1/scan 
[root@rocky8 ~]# sblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  200G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0  100G  0 part /
├─sda3   8:3    0   50G  0 part /data
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0    4G  0 part [SWAP]
sr0     11:0    1  7.7G  0 rom  
[root@rocky8 ~]#  echo '- - -' > /sys/class/scsi_host/host2/scan 
[root@rocky8 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  200G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0  100G  0 part /
├─sda3   8:3    0   50G  0 part /data
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0    4G  0 part [SWAP]
sdb      8:16   0   20G  0 disk 	#新添加的磁盘已经加载了
sr0     11:0    1  7.7G  0 rom  

[root@rocky8 ~]# echo '- - -' > /sys/class/scsi_host/host0/scan;echo '- - -' > /sys/class/scsi_host/host1/scan;echo '- - -' > /sys/class/scsi_host/host2/scan	#用;分号可以把多个命令隔开一次执行

[root@rocky8 ~]# alias scandisk="echo '- - -' > /sys/class/scsi_host/host0/scan;echo '- - -' > /sys/class/scsi_host/host1/scan;echo '- - -' > /sys/class/scsi_host/host2/scan"	#alias定义别名
[root@rocky8 ~]# alias scandisk		#查看定义的别名
alias scandisk='echo '\''- - -'\'' > /sys/class/scsi_host/host0/scan;echo '\''- - -'\'' > /sys/class/scsi_host/host1/scan;echo '\''- - -'\'' > /sys/class/scsi_host/host2/scan'

# 命令执行顺序:别名 内部命令 hash  外部命令

[root@rocky8 ~]#  alias help="echo '- - -' > /sys/class/scsi_host/host0/scan;echo '- - -' > /sys/class/scsi_host/host1/scan;echo '- - -' > /sys/class/scsi_host/host2/scan"	#注意不要把别名定义成和命令同名,如果把别名定义成了命令同名优先执行别名
[root@rocky8 ~]# alias help
alias help='echo '\''- - -'\'' > /sys/class/scsi_host/host0/scan;echo '\''- - -'\'' > /sys/class/scsi_host/host1/scan;echo '\''- - -'\'' > /sys/class/scsi_host/host2/scan'
[root@rocky8 ~]# help
[root@rocky8 ~]#  unalias help	#unalias 取消定义的别名
[root@rocky8 ~]# help
GNU bash, version 4.4.19(1)-release (x86_64-redhat-linux-gnu)
These shell commands are defined internally.  Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.

A star (*) next to a name means that the command is disabled.

 job_spec [&]                                            history [-c] [-d offset] [n] or history -anrw [filen>
 (( expression ))                                        if COMMANDS; then COMMANDS; [ elif COMMANDS; then CO>
 . filename [arguments]                                  jobs [-lnprs] [jobspec ...] or jobs -x command [arg>
 :                                                       kill [-s sigspec | -n signum | -sigspec] pid | jobsp>
 [ arg... ]                                              let arg [arg ...]
 [[ expression ]]                                        local [option] name[=value] ...
 alias [-p] [name[=value] ... ]                          logout [n]
 bg [job_spec ...]                                       mapfile [-d delim] [-n count] [-O origin] [-s count]>
 bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] >  popd [-n] [+N | -N]
 break [n]                                               printf [-v var] format [arguments]
 builtin [shell-builtin [arg ...]]                       pushd [-n] [+N | -N | dir]
 caller [expr]                                           pwd [-LP]
 case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]...>  read [-ers] [-a array] [-d delim] [-i text] [-n ncha>
 cd [-L|[-P [-e]] [-@]] [dir]                            readarray [-n count] [-O origin] [-s count] [-t] [-u>
 command [-pVv] command [arg ...]                        readonly [-aAf] [name[=value] ...] or readonly -p
 compgen [-abcdefgjksuv] [-o option] [-A action] [-G g>  return [n]
 complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A >  select NAME [in WORDS ... ;] do COMMANDS; done
 compopt [-o|+o option] [-DE] [name ...]                 set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg >
 continue [n]                                            shift [n]
 coproc [NAME] command [redirections]                    shopt [-pqsu] [-o] [optname ...]
 declare [-aAfFgilnrtux] [-p] [name[=value] ...]         source filename [arguments]
 dirs [-clpv] [+N] [-N]                                  suspend [-f]
 disown [-h] [-ar] [jobspec ... | pid ...]               test [expr]
 echo [-neE] [arg ...]                                   time [-p] pipeline
 enable [-a] [-dnps] [-f filename] [name ...]            times
 eval [arg ...]                                          trap [-lp] [[arg] signal_spec ...]
 exec [-cl] [-a name] [command [arguments ...]] [redir>  true
 exit [n]                                                type [-afptP] name [name ...]
 export [-fn] [name[=value] ...] or export -p            typeset [-aAfFgilnrtux] [-p] name[=value] ...
 false                                                   ulimit [-SHabcdefiklmnpqrstuvxPT] [limit]
 fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep>  umask [-p] [-S] [mode]
 fg [job_spec]                                           unalias [-a] name [name ...]
 for NAME [in WORDS ... ] ; do COMMANDS; done            unset [-f] [-v] [-n] [name ...]
 for (( exp1; exp2; exp3 )); do COMMANDS; done           until COMMANDS; do COMMANDS; done
 function name { COMMANDS ; } or name () { COMMANDS ; >  variables - Names and meanings of some shell variabl>
 getopts optstring name [arg]                            wait [-n] [id ...]
 hash [-lr] [-p pathname] [-dt] [name ...]               while COMMANDS; do COMMANDS; done
 help [-dms] [pattern ...]                               { COMMANDS ; }

如果想永久有效,要定义在配置文件中

  • 仅对当前用户:~/.bashrc
  • 对所有用户有效:/etc/bashrc

编辑配置给出的新配置不会立即生效,bash进程重新读取配置文件。

source /path/to/config_file
. /path/to/config_file

范例17:定义命令别名

[root@rocky8 ~]# cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/sysconfig/network-scripts/"
alias scandisk="echo '- - -' > /sys/class/scsi_host/host0/scan;echo '- - -' > /sys/class/scsi_host/host1/scan;echo '- - -' > /sys/class/scsi_host/host2/scan"
EOF

如果别名同原命令同名,如果要执行原命令,可使用。

\ALIASNAME
“ALIASNAME”
‘ALIASNAME’
command ALIASNAME
/path/commmand #只适用于外部命令

范例18:命令别名详解2

[root@rocky8 ~]# 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'			#ls定义了别名
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias scandisk='echo '\''- - -'\'' > /sys/class/scsi_host/host0/scan;echo '\''- - -'\'' > /sys/class/scsi_host/host1/scan;echo '\''- - -'\'' > /sys/class/scsi_host/host2/scan'
alias which='(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot'
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@rocky8 ~]# \ls /boot	#命令前加\反斜杠它就使用原始命令,不使用别名
config-4.18.0-193.el8.x86_64				 loader
efi							 lost+found
grub2							 System.map-4.18.0-193.el8.x86_64
initramfs-0-rescue-2427c8e67a2349b89d9f80037054bb24.img  vmlinuz-0-rescue-2427c8e67a2349b89d9f80037054bb24
initramfs-4.18.0-193.el8.x86_64.img			 vmlinuz-4.18.0-193.el8.x86_64
initramfs-4.18.0-193.el8.x86_64kdump.img

[root@rocky8 ~]# 'ls' /boot	#命令前加’’单引号它就使用原始命令,不使用别名
config-4.18.0-193.el8.x86_64				 loader
efi							 lost+found
grub2							 System.map-4.18.0-193.el8.x86_64
initramfs-0-rescue-2427c8e67a2349b89d9f80037054bb24.img  vmlinuz-0-rescue-2427c8e67a2349b89d9f80037054bb24
initramfs-4.18.0-193.el8.x86_64.img			 vmlinuz-4.18.0-193.el8.x86_64
initramfs-4.18.0-193.el8.x86_64kdump.img

[root@rocky8 ~]# "ls" /boot	#命令前加””双引号它就使用原始命令,不使用别名
config-4.18.0-193.el8.x86_64				 loader
efi							 lost+found
grub2							 System.map-4.18.0-193.el8.x86_64
initramfs-0-rescue-2427c8e67a2349b89d9f80037054bb24.img  vmlinuz-0-rescue-2427c8e67a2349b89d9f80037054bb24
initramfs-4.18.0-193.el8.x86_64.img			 vmlinuz-4.18.0-193.el8.x86_64
initramfs-4.18.0-193.el8.x86_64kdump.img

1.7.4 命令格式

COMMAND [OPTIONS...] [ARGUMENTS...]

选项:用于启用或关闭命令的某个或某些功能

  • 短选项:UNIX 风格选项,-c 例如:-l, -h
  • 长选项:GNU风格选项,–word 例如:–all, --human
  • BSD风格选项: 一个字母,例如:a,使用相对较少

参数:命令的作用对象,比如:文件名,用户名等

范例19:命令格式详解

[root@rocky8 ~]# ls -a		#短选项风格
.   anaconda-ks.cfg  .bash_logout   .bashrc  .config  .dbus      initial-setup-ks.cfg  .Xauthority
..  .bash_history    .bash_profile  .cache   .cshrc   .esd_auth  .tcshrc
[root@rocky8 ~]# ls –all	#长选项风格
.   anaconda-ks.cfg  .bash_logout   .bashrc  .config  .dbus      initial-setup-ks.cfg  .Xauthority
..  .bash_history    .bash_profile  .cache   .cshrc   .esd_auth  .tcshrc
[root@rocky8 ~]# ps a		#BSD风格
    PID TTY      STAT   TIME COMMAND
   1448 tty1     Ssl+   0:00 /usr/libexec/gdm-wayland-session gnome-session --autostart /usr/share/gdm/greeter/a
   1490 tty1     Sl+    0:00 /usr/libexec/gnome-session-binary --autostart /usr/share/gdm/greeter/autostart
   1615 tty1     Sl+    0:07 /usr/bin/gnome-shell
   1765 tty1     Sl+    0:00 /usr/bin/Xwayland :1024 -rootless -terminate -accessx -core -listen 4 -listen 5 -di
   1788 tty1     Sl     0:00 ibus-daemon --xim --panel disable
   1791 tty1     Sl     0:00 /usr/libexec/ibus-dconf
   1795 tty1     Sl     0:00 /usr/libexec/ibus-x11 --kill-daemon
   1845 tty1     Sl+    0:00 /usr/libexec/gsd-xsettings
   1847 tty1     Sl+    0:00 /usr/libexec/gsd-a11y-settings
   1849 tty1     Sl+    0:00 /usr/libexec/gsd-clipboard
   1852 tty1     Sl+    0:00 /usr/libexec/gsd-color
   1854 tty1     Sl+    0:00 /usr/libexec/gsd-datetime
   1856 tty1     Sl+    0:00 /usr/libexec/gsd-housekeeping
   1860 tty1     Sl+    0:00 /usr/libexec/gsd-keyboard
   1862 tty1     Sl+    0:00 /usr/libexec/gsd-media-keys
   1865 tty1     Sl+    0:00 /usr/libexec/gsd-mouse
   1870 tty1     Sl+    0:00 /usr/libexec/gsd-power
   1881 tty1     Sl+    0:00 /usr/libexec/gsd-print-notifications
   1887 tty1     Sl+    0:00 /usr/libexec/gsd-rfkill
   1894 tty1     Sl+    0:00 /usr/libexec/gsd-screensaver-proxy
   1900 tty1     Sl+    0:00 /usr/libexec/gsd-sharing
   1905 tty1     Sl+    0:01 /usr/libexec/gsd-smartcard
   1908 tty1     Sl+    0:00 /usr/libexec/gsd-sound
   1912 tty1     Sl+    0:00 /usr/libexec/gsd-wacom
   1944 tty1     Sl     0:00 /usr/libexec/ibus-engine-simple
   2101 tty3     Ss+    0:00 -bash
   2323 tty2     Ss+    0:00 -bash
  33726 pts/0    Ss     0:00 -bash
  34488 pts/0    R+     0:00 ps a

注意:

  • 多个选项以及多参数和命令之间使用空白字符分隔
  • 取消和结束命令执行:Ctrl+c,Ctrl+d
  • 多个命令放在一行,每个命令之间可以用 “;” 符号分开
  • 一个命令可以用\分成多行

范例20:命令格式详解2

[root@rocky8 ~]# bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
^C		#ctrl+c 终止命令
(interrupt) Exiting bc.


[root@rocky8 ~]# logout		#按ctrl+d 退出终端

[root@rocky8 ~]# ls;hostname;pwd;echo xx;type help	#每个命令用;分号隔开可以一次执行
anaconda-ks.cfg  initial-setup-ks.cfg
rocky
/root
xx
help is a shell builtin

[root@rocky8 ~]# ho\ # 一个命令可以用\分成多行
> st\
> name
rocky8

1.8 常见命令

1.8.1 查看硬件信息

1.8.1.1 查看cpu

lscpu命令可以查看cpu信息

cat /proc/cpuinfo也可看查看到

范例21:查看cpu

[root@rocky8 ~]# lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              1
On-line CPU(s) list: 0
Thread(s) per core:  1 #每个core 有几个线程
Core(s) per socket:  1 #每个槽位有4个core
Socket(s):           1 #服务器面板上有2个cpu 槽位
NUMA node(s):        1 #nodes的数量
Vendor ID:           AuthenticAMD
BIOS Vendor ID:      AuthenticAMD
CPU family:          23
Model:               96
Model name:          AMD Ryzen 5 4600H with Radeon Graphics
BIOS Model name:     AMD Ryzen 5 4600H with Radeon Graphics         
Stepping:            1
CPU MHz:             2994.379
BogoMIPS:            5988.75
Hypervisor vendor:   VMware
Virtualization type: full
L1d cache:           32K
L1i cache:           32K
L2 cache:            512K
L3 cache:            4096K
NUMA node0 CPU(s):   0 #对应的core
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero wbnoinvd arat umip rdpid overflow_recov succor

[root@rocky8 ~]# cat /proc/cpuinfo
processor	: 0
vendor_id	: AuthenticAMD
cpu family	: 23
model		: 96
model name	: AMD Ryzen 5 4600H with Radeon Graphics
stepping	: 1
microcode	: 0x8600103
cpu MHz		: 2994.379
cache size	: 512 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 16
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero wbnoinvd arat umip rdpid overflow_recov succor
bugs		: fxsave_leak sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass
bogomips	: 5988.75
TLB size	: 3072 4K pages
clflush size	: 64
cache_alignment	: 64
address sizes	: 45 bits physical, 48 bits virtual
power management:
1.8.1.2 查看内存大小

范例22:查看内存大小

[root@rocky8 ~]# free
              total        used        free      shared  buff/cache   available
Mem:         801164      160356      437544        5676      203264      513708
Swap:       2097148           0     2097148

[root@rocky8 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          782Mi       158Mi       377Mi       5.0Mi       246Mi       499Mi
Swap:         2.0Gi          0B       2.0Gi

[root@rocky8 ~]# cat /proc/meminfo 
MemTotal:         801164 kB
MemFree:          437544 kB
MemAvailable:     513744 kB
Buffers:            5212 kB
Cached:           170304 kB
SwapCached:            0 kB
Active:            63292 kB
Inactive:         159644 kB
Active(anon):        492 kB
Inactive(anon):    52604 kB
Active(file):      62800 kB
Inactive(file):   107040 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         47428 kB
Mapped:            75680 kB
Shmem:              5676 kB
KReclaimable:      27748 kB
Slab:              58368 kB
SReclaimable:      27748 kB
SUnreclaim:        30620 kB
KernelStack:        4412 kB
PageTables:         4980 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2497728 kB
Committed_AS:     184956 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:            65024 kB
HardwareCorrupted:     0 kB
AnonHugePages:      8192 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      102272 kB
DirectMap2M:      946176 kB
DirectMap1G:           0 kB
1.8.1.3 查看硬盘和分区情况

范例23:查看磁盘和分区情况

[root@rocky8 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  200G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0  100G  0 part /
├─sda3   8:3    0    2G  0 part [SWAP]
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0   50G  0 part /data
sr0     11:0    1  1.9G  0 rom 

[root@rocky8 ~]# cat /proc/partitions
major minor  #blocks  name

   8        0  209715200 sda
   8        1    1048576 sda1
   8        2  104857600 sda2
   8        3    2097152 sda3
   8        4          1 sda4
   8        5   52428800 sda5
  11        0    1934336 sr0

1.8.2 查看系统版本信息

1.8.2.1 查看内核版本

范例24:查看内核版本

[root@rocky8 ~]# uname -r
4.18.0-305.3.1.el8_4.x86_64

[root@centos8 ~]# uname -r
4.18.0-147.el8.x86_64

[root@centos7 ~]# uname -r
3.10.0-1062.el7.x86_64

[root@centos6 ~]# uname -r
2.6.32-754.el6.x86_64

[root@ubuntu1804 ~]# uname -r
4.15.0-29-generic
1.8.2.2 查看操作系统发行版本

范例25:查看操作系统发现版本

[root@rocky8 ~]# cat /etc/redhat-release
Rocky Linux release 8.4 (Green Obsidian)

[root@rocky8 ~]# cat /etc/os-release 
NAME="Rocky Linux"
VERSION="8.4 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel fedora"
VERSION_ID="8.4"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Rocky Linux 8.4 (Green Obsidian)"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:rocky:rocky:8.4:GA"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky Linux"
ROCKY_SUPPORT_PRODUCT_VERSION="8"

#如果没有lsb_release命令,可以安装下面包
[root@rocky8 ~]# yum -y install redhat-lsb-core

[root@rocky8 ~]# lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch
Distributor ID:	Rocky
Description:	Rocky Linux release 8.4 (Green Obsidian)
Release:	8.4
Codename:	GreenObsidian

[root@rocky8 ~]# cat /etc/issue
\S
Kernel \r on an \m

root@ubuntu1804:~# cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.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=bionic
UBUNTU_CODENAME=bionic

root@ubuntu1804:~# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.6 LTS
Release:	18.04
Codename:	bionic

root@ubuntu1804:~# cat /etc/issue
Ubuntu 18.04.6 LTS \n \l

1.8.3 日期和时间

Linux的两种时钟

  • 系统时钟:由Linux内核通过CPU的工作频率进行的
  • 硬件时钟:主板

相关命令

  • date 显示和设置系统时间

  • clock,hwclock: 显示硬件时钟

-s, --hctosys 以硬件时钟为准,校正系统时钟
-w, --systohc 以系统时钟为准,校正硬件时钟

范例26:date命令使用

[root@rocky8 ~]# date
Fri Oct  1 04:38:04 CST 2021
[root@rocky8 ~]# clock
2021-10-01 13:25:15.006307+08:00

[root@rocky8 ~]# date +%s #%s 自1970-01-01 00:00:00 UTC 以来的秒数 
1633001318

[root@rocky8 ~]# date -d @`date +%s`  #将(1970-01-01 UTC)时代以来的秒数转换为日期 
Thu Sep 30 19:28:54 CST 2021

[root@rocky8 ~]# date -d @1633001318 +%F_%T #将自1970-01-01 00:00:00 UTC 以来的秒数转换成日期时间格式显示
2021-09-30_19:28:38

[root@rocky8 ~]# date -s '1 year' # 设置一年后的时间
Thu Oct  6 14:37:38 CST 2022
[root@rocky8 ~]# clock
2021-10-06 14:37:52.212175+08:00

[root@rocky8 ~]# clock -s #以硬件时钟为准,校正系统时钟
[root@rocky8 ~]# date
Wed Oct  6 14:38:36 CST 2021

[root@rocky8 ~]# date -s '1 year'
Thu Oct  6 14:39:06 CST 2022
[root@rocky8 ~]# clock
2021-10-06 14:39:23.524037+08:00
[root@rocky8 ~]# clock -w #以系统时钟为准,校正硬件时钟
[root@rocky8 ~]# clock
2022-10-06 14:39:45.399964+08:00

[root@rocky8 ~]# date -s '-1 year'
Wed Oct  6 14:40:24 CST 2021
[root@rocky8 ~]# clock -w
[root@rocky8 ~]# clock
2021-10-06 14:40:38.712219+08:00

时区文件:

/etc/localtime

范例27:设置时区

[root@rocky8 ~]# timedatectl set-timezone Asia/Shanghai

[root@rocky8 ~]# ll /etc/localtime
lrwxrwxrwx. 1 root root 35 Sep 28 18:34 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

# 查看所有时区
[root@rocky8 ~]# 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

显示日历:

cal –y

范例28:查看日历

[root@rocky8 ~]# 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

1.8.4 关机和重启

关机:

  • halt
  • poweroff

重启:reboot

-f #强制,不调用shutdown
-p #切断电源

关机或重启:shutdown

范例29:shutdown命令使用

[root@rocky8 ~]# shutdown --help
shutdown [OPTIONS...] [TIME] [WALL...]

Shut down the system.

     --help      Show this help
  -H --halt      Halt the machine
  -P --poweroff  Power-off the machine
  -r --reboot    Reboot the machine
  -h             Equivalent to --poweroff, overridden by --halt
  -k             Don't halt/power-off/reboot, just send warnings
     --no-wall   Don't send wall message before halt/power-off/reboot
  -c             Cancel a pending shutdown

TIME:无指定,默认相当于+1(CentOS7)
    now: 立刻,相当于+0
    +#: 相对时间表示法,几分钟之后;例如 +3
    hh:mm: 绝对时间表示,指明具体时间

1.8.5 用户登录信息查看命令

  • whoami: 显示当前登录有效用户
  • who: 系统当前所有的登录会话
  • w: 系统当前所有的登录会话及所做的操作

范例30:whoami、who和w命令使用

[root@rocky8 ~]# whoami #当前终端运行用户
root
[root@rocky8 ~]# who am i #更详细的显示
root     pts/0        2021-10-06 14:15 (172.31.0.1)
[root@rocky8 ~]# who is nb #也可以这样写
root     pts/0        2021-10-06 14:15 (172.31.0.1)

[root@rocky8 ~]# who #查看登录信息
root     pts/0        2021-10-06 14:15 (172.31.0.1)

[root@rocky8 ~]# w #查看谁在登录,它在干什么
 14:49:48 up 34 min,  1 user,  load average: 0.03, 0.23, 0.26
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    172.31.0.1       14:15    0.00s  0.01s  0.00s w

[root@rocky8 ~]# sleep 100

[root@rocky8 ~]# w
 14:50:24 up 35 min,  2 users,  load average: 0.09, 0.22, 0.25
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    172.31.0.1       14:15    5.00s  0.01s  0.00s sleep 100 #可以看到这个终端用户正在执行sleep 100
root     pts/1    172.31.0.1       14:50    0.00s  0.00s  0.00s w

1.8.6 文本编辑

  • nano 工具可以实现文本的编辑,上手容易,适合初学者
  • gedit 工具是图形工具

1.8.7 会话管理

命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命令。用户与计算机的这种临时的交互,称为一次"会话"(session)

会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完

一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。为了解决这个问题,会话与窗口可以"解绑":窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话"绑定"其他窗口

终端复用器软件就是会话与窗口的"解绑"工具,将它们彻底分离。
(1)它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
(2) 它可以让新窗口"接入"已经存在的会话。
(3)它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
(4)它还支持窗口任意的垂直和水平拆分。

类似的终端复用器还有 Screen,Tmux

1.8.7.1 screen

利用screen 可以实现会话管理,如:新建会话,共享会话等

注意:CentOS7 来自于base源,CentOS8 来自于epel源

范例31:安装 screen

#CentOS7 安装screen
[root@centos7 ~]# yum -y install screen

#CentOS Stream 8/9、Rocky 8/9 安装screen
[root@rocky8 ~]# dnf -y install epel-release
[root@rocky8 ~]# 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]

范例32:screen命令使用

[root@rocky8 ~]# sleep 100
[root@rocky8 ~]# ps aux|grep sleep
root        1604  0.0  0.1 217072   896 pts/0    S+   04:59   0:00 sleep 100
root        1630  0.0  0.1 221928  1104 pts/1    R+   04:59   0:00 grep --color=auto sleep

# 关闭xshell窗口,sleep进程就没有了 
[root@rocky8 ~]# ps aux|grep sleep
root        1633  0.0  0.1 221928  1104 pts/1    R+   05:00   0:00 grep --color=auto sleep 

# centos8、rocky8需要先安装epel源
[root@rocky8 ~]# yum -y install epel-release
[root@rocky8 ~]# yum -y install screen

[root@rocky8 ~]# screen
[root@rocky8 ~]# sleep 100
[root@rocky8 ~]# ps aux|grep sleep
root        2011  0.0  0.1 217072   904 pts/0    S+   05:02   0:00 sleep 100
root        2037  0.0  0.1 221928  1148 pts/2    R+   05:03   0:00 grep --color=auto sleep

# 关闭xshell窗口,sleep进程依然在运行
[root@rocky8 ~]# ps aux|grep sleep
root        2011  0.0  0.1 217072   904 pts/0    S+   05:02   0:00 sleep 100
root        2037  0.0  0.1 221928  1148 pts/2    R+   05:03   0:00 grep --color=auto sleep
[root@rocky8 ~]# screen -ls
There is a screen on:
	1780.pts-0.rocky8	(Detached)
1 Socket in /run/screen/S-root.
# Detached 分离

#恢复窗口
[root@rocky8 ~]# screen -r
[root@rocky8 ~]# sleep 100
1.8.7.2 tmux

在这里插入图片描述

图2-29 tumx

Tmux 是一个终端复用器(terminal multiplexer),类似 screen,但是更易用,也更强大

Tmux 就是会话与窗口的"解绑"工具,将它们彻底分离,功能如下

  • 它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
  • 它可以让新窗口"接入"已经存在的会话。
  • 它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
  • 它还支持窗口任意的垂直和水平拆分

安装

yum install tmux

启动与退出

[root@rocky8 ~]# tmux
[root@rocky8 ~]# exit
logout

mux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是Ctrl+b ,即先按下Ctrl+b ,快捷键才会生效。帮助命令的快捷键是Ctrl+b ? 然后,按下q 键,就可以退出帮助

新建会话

第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会话,就是 0号会话、1 号会话。使用编号区分会话,不太直观,更好的方法是为会话起名。下面命令新建一个指定名称的会话。

tmux new -s <session-name>

tmux ls或Ctrl+b,s 可以查看当前所有的 Tmux 会话

tmux ls
tmux list-session

分离会话

在 Tmux 窗口中,按下Ctrl+b d或者输入tmux detach命令,就会将当前会话与窗口分离。

tmux detach

接入会话

tmux attach 命令用于重新接入某个已存在的会话。

tmux attach -t <session-name>

范例:

tmux attach -t 0

杀死会话

tmux kill-session命令用于杀死某个会话。

tmux switch -t <session-name>

可以将窗口分成多个窗格(pane),每个窗格运行不同的命令

上下分窗格

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

新建一个指定名称的窗口

tmux new-window -n <window-name>

切换窗口

tmux select-window命令用来切换窗口

切换到指定编号的窗口

tmux select-window -t <window-number>

切换到指定名称的窗口

tmux select-window -t <window-name>

窗口快捷键

Ctrl+b c:创建一个新窗口,状态栏会显示多个窗口的信息。
Ctrl+b p:切换到上一个窗口(按照状态栏上的顺序)。
Ctrl+b n:切换到下一个窗口。
Ctrl+b <number>:切换到指定编号的窗口,其中的<number>是状态栏上的窗口编号
Ctrl+b w:从列表中选择窗口
Ctrl+b ,:窗口重命名

列出所有快捷键,及其对应的 Tmux 命令

tmux list-keys

列出所有 Tmux 命令及其参数

tmux list-commands

1.8.8 输出信息 echo

1.8.8.1 echo 基本用法

echo 命令可以将后面跟的字符进行输出

功能:显示字符,echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号

语法:

echo [-neE][字符串]

选项:

  • -E (默认)不支持 \ 解释功能
  • -n 不自动换行
  • -e 启用 \ 字符的解释功能

显示变量

echo "$VAR_NAME” #用变量值替换,弱引用
echo '$VAR_NAME’ #变量不会替换,强引用

范例33:echo命令使用

[root@rocky8 ~]# echo hello
hello

[root@rocky8 ~]# echo $PATH		#输出变量
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@rocky8 ~]# echo PATH
PATH	#不加$就是打印字符串

[root@rocky8 ~]# echo -n hello	#-n不换行
hello[root@rocky8 ~]# 

启用命令选项-e,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出

  • \a 发出警告声
  • \b 退格键
  • \c 最后不加上换行符号
  • \e escape,相当于\033
  • \n 换行且光标移至行首
  • \r 回车,即光标移至行首,但不换行
  • \t 插入tab
  • \ 插入\字符
  • \0nnn 插入nnn(八进制)所代表的ASCII字符
  • \xHH插入HH(十六进制)所代表的ASCII数字(man 7 ascii)

范例34:echo命令使用2

[root@rocky8 ~]# echo '\a'	#不加-e输出字符串
\a
[root@rocky8 ~]# echo -e '\a'		#加-e,\a发出声音

[root@rocky8 ~]# sleep 100;echo -e '\a'		#等待100秒后,发出声音

[root@rocky8 ~]# echo \
> ^C	#echo \  它表示以为后面的命令没有输入完

[root@rocky8 ~]# echo \\
\		#要显示\斜线,必须在前面再加上一个\斜线进行转义

[root@rocky8 ~]# echo '\'
\		#也可以用’’ 单引号

[root@rocky8 ~]# echo "\"
> ^C	#双引号不行

> ^C
[root@rocky8 ~]# echo "$PATH"	#双引号可以执行变量
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@rocky8 ~]# echo '$PATH'	#单引号把它当作字符串
$PATH
1.8.8.2 echo 高级用法

在终端中,ANSI定义了用于屏幕显示的Escape屏幕控制码

具有颜色的字符,其格式如下:

"\033[字符背景颜色;字体颜色m字符串\033[0m"
\033[30m -- \033[37m 设置前景色
\033[40m -- \033[47m 设置背景色

字符背景颜色范围: 40--49
40: 黑
41:红
42:绿
43:黄
44:蓝
45:紫
46:深绿
47:白色

字体颜色: 30--39
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[y;xH 设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
\033[2J\033[0;0H 清屏且将光标置顶

范例35:echo命令高级用法

[root@centos8 ~]# echo -e '\033[1;31mraymond'
raymond

1.9 字符集和编码

许多场合下,字符集与编码这两个概念常被混为一谈,但两者是有差别的。字符集与字符集编码是两个不同层面的概念

charset是character set的简写,即字符集,即二进制和字符的对应关系,不关注最终的存储形式encoding是charset encoding的简写,即字符集编码,简称编码,实现如何将字符转化为实际的二进制进行存储或相反,编码决定了空间的使用的大小

在这里插入图片描述

图2-30 字符集编码层级

1.9.1 ASCII码

计算机内部,所有信息最终都是一个二进制值。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定,即ASCII(American Standard Code for Information Interchange) 码

ASCII 码一共规定了128个字符的编码,占用了一个字节的后面7位,最前面的一位统一规定为 0

在这里插入图片描述

图2-31 ASCII字符代码表

范例36:查看 ascii 表

[root@rocky8 ~]# dnf -y install man-pages
[root@rocky8 ~]# man ascii

在这里插入图片描述

图2-32 使用man ascii查看字符编码表

范例37:ASCII码讲解

[root@rocky8 ~]# cat >test.txt <<EOF
> Aa
> EOF
[root@rocky8 ~]# cat test.txt 
Aa
[root@rocky8 ~]# hexdump -C test.txt 
00000000  41 61 0a                                          |Aa.|
00000003	#16进制的41转换成10进制是65,对应的ASCII码就是A。
			#16进制的61转换成10进制是97,对应的ASCII码就是a。
[root@rocky8 ~]# echo "ibase=16;41"|bc
65
[root@rocky8 ~]# echo "ibase=16;61"|bc
97

1.9.2 Unicode

由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,即ASCII编码,但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。

全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码

为了表示世界上所有语言中的所有字符。每一个符号都给予一个独一无二的编码数字,Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号。Unicode 仅仅只是一个字符集,规定了每个字符对应的二进制代码,至于这个二进制代码如何存储则没有规定

Unicode编码方案:

  • UTF-8:变长,1到4个字节,当前最主流的方案
  • UTF-16:变长,2或4个字节
  • UTF-32:固定长度,4个字节

在这里插入图片描述

图2-33 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 码来填充

编码转换和查询参考链接:
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符号范围(十六进制)UTF-8编码方式二进制)
0000 0000-0000 007F0xxxxxxx
0000 0080-0000 07FF110xxxxx 10xxxxxx
0000 0800-0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

范例38:Unicode讲解

“汉”的 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

范例39:修改LANG变量实现中文语言提示

[root@rocky8 ~]# echo $LANG
en_US.UTF-8 #默认是英文
[root@rocky8 ~]# raymond
-bash: raymond: command not found #提示信息也是英文

[root@rocky8 ~]# LANG=zh_CN.UTF-8 #改为中文
[root@rocky8 ~]# echo $LANG 
zh_CN.UTF-8
[root@rocky8 ~]# raymond
-bash: raymond: 未找到命令 #提示信息就是中文

1.10 命令行扩展和被括起来的集合

1.10.1 命令行扩展:`` 和 $()

把一个命令的输出打印给另一个命令的参数

$(COMMAND) 或 `COMMAND`

#COMMAND必须是一个有标出信息的命令

范例40:比较 “ ” ,‘ ’, ``三者区别

[root@rocky8 ~]# echo "echo $HOSTNAME"
echo rocky8
[root@rocky8 ~]# echo 'echo $HOSTNAME'
echo $HOSTNAME
[root@rocky8 ~]# echo `echo $HOSTNAME`
rocky8

#结论:
单引号:六亲不认,变量和命令都不识别,都当成了普通的字符串
反向单引号:变量和命令都识别,并且会将反向单引号的内容当成命令进行执行后,再交给调用反向单引号的命令继续
双引号:不能识别命令,可以识别变量

范例41:单引号和$()区别1

[root@rocky8 ~]# hostname
rocky8
[root@rocky8 ~]# echo My hostname is rocky8
My hostname is rocky8
[root@rocky8 ~]# echo My hostname is hostname
My hostname is hostname
[root@rocky8 ~]# echo My hostname is `hostname`		#使用``反向单引号执行命令
My hostname is rocky8

[root@rocky8 ~]# echo My hostname is $(hostname)		#$()和``反向单引号功能一样
My hostname is rocky8

#当一个命令需要被另一个命令调用时,就需要使用反向单引号
[root@rocky8 ~]# touch a.txt
[root@rocky8 ~]# ls
anaconda-ks.cfg a.txt
[root@rocky8 ~]# touch b.txt
[root@rocky8 ~]# ls
anaconda-ks.cfg b.txt a.txt
[root@rocky8 ~]# touch `hostname`.log		#创建一个主机名.log的空文件
[root@rocky8 ~]# ls
anaconda-ks.cfg  b.txt a.txt rocky8.log	#rocky8.log就是刚创建的文件

[root@rocky8 ~]# date +%F
2021-10-06
[root@rocky8 ~]# touch `date +%F`.log #创建一个日期.log文件
[root@rocky8 ~]# ls
2021-10-06.log  anaconda-ks.cfg #2020-11-16.log 这个就是刚创建的文件

范例42:$( ) 和 ``区别2

[root@rocky8 ~]# touch `date +%F`.txt
[root@rocky8 ~]# ll `echo `date +%F`.txt`
-bash: .txt: command not found
-rw-r--r-- 1 root root 0 Oct  6 14:59 date
-rw-r--r-- 1 root root 0 Oct  6 14:59 +%F

[root@rocky8 ~]# ll $(echo $(date +%F).txt)
-rw-r--r-- 1 root root 0 Oct  6 14:59 2021-10-06.txt

[root@rocky8 ~]# ll `echo $(date +%F).txt`
-rw-r--r-- 1 root root 0 Oct  6 14:59 2021-10-06.txt

[root@rocky8 ~]# ll $(echo `date +%F`.txt)
-rw-r--r-- 1 root root 0 Oct  6 14:59 2021-10-06.txt

范例43:$( ) 和 ``的区别3

[root@rocky8 ~]# echo `echo \\\\\\\w`
\\w
[root@rocky8 ~]# echo $(echo \\\\\\\w)
\\\w
#为什么输出的不一样?

#这就引申出了另一个问题:反引号与$()有没有区别?
#这是一个非常有意思的问题,但要解释这个问题确比较困难,我来换一个简单一点的例子,通俗的解释一下。
#比如我们有一个shell脚本名为test.sh有一下两行

[root@rocky8 ~]# vim test.sh
#!/bin/bash
#
#**********************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2021-10-01
#FileName:      test.sh
#URL:           raymond.blog.csdn.net
#Description:   The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
echo  `echo \$HOSTNAME`
echo $(echo \$HOSTNAME)

[root@rocky8 ~]# bash -x test.sh 
++ echo rocky8
+ echo rocky8
rocky8
++ echo '$HOSTNAME'
+ echo '$HOSTNAME'
$HOSTNAME

#通过上图我们可以得出两个结论:
1.	反引号中\$并没有将$的特殊意义转换 反引号包含的内容 echo \$hostname 仍然被解释为一个echo $HOSTNAME 取到了这个变量的值并输出所以反引号返回的值为 rocky8
2.	$()则正好相反,$明显被\转义成了一个普通字符,所以并没有取到变量值,而是返回了字符串本身的意思,故而返回了$HOSTNAME
  这说明反引号对反斜杠(\)有特殊的转化,至少我们看到当我们直接用1个\时,它本身并不会起到转义的作用。现在我们将脚本的内容做一些修改:
[root@rocky8 ~]# vim test.sh
#!/bin/bash
# 
#**********************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2021-10-01
#FileName:      test.sh
#URL:           raymond.blog.csdn.net
#Description:   The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
echo  `echo \\$HOSTNAME`
echo $(echo \\$HOSTNAME) 

[root@rocky8 ~]# bash -x test.sh 
++ echo '$HOSTNAME'
+ echo '$HOSTNAME'
$HOSTNAME
++ echo '\rocky8'
+ echo '\rocky8'
\rocky8

这次看起来似乎反转了:
1.	反引号反而输出了$HOSTNAME的字面意思
2.	$()如我们所愿的取到了变量值,并理所应当的输出了一个被转义的字符串\
  我们再来做一个实验,再建立一个脚本名为a.sh:
[root@rocky8 ~]# vim a.sh
#!/bin/bash
#
#**********************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2021-10-01
#FileName:      a.sh
#URL:           raymond.blog.csdn.net
#Description:   The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
echo    `echo \\\\ `
echo  $(echo \\\\ )

注意:最后一个反引号和)的前面都有一个空格,否则最后一个反引号和)都将被注释,不会被当做结束的替换符号。

使用bash -x a.sh的结果如下:
[root@rocky8 ~]# bash -x a.sh 
++ echo '\'
+ echo '\'
\
++ echo '\\'
+ echo '\\'
\\

通过我们可以看到:
1.	反引号中4个\被输出为1个\
2.	$()中4个\被输出为2个\
  我们将脚本修改为8个\:
[root@rocky8 ~]# vim a.sh
[root@rocky8 ~]# cat a.sh
#!/bin/bash
#
#**********************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2021-10-01
#FileName:      a.sh
#URL:           raymond.blog.csdn.net
#Description:   The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
echo   `echo \\\\\\\\ `
echo  $(echo \\\\\\\\ )

[root@rocky8 ~]# bash -x a.sh 
++ echo '\\'
+ echo '\\'
\\
++ echo '\\\\'
+ echo '\\\\'
\\\\

由此,我们可以得出结论:
1.	反引号齐本身就对\进行了转义,保留了齐本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。
所以我们可以简单的想象成反引号中: \\ = \
2.	$()中则不需要考虑\的问题,与我们平常使用的一样:\ = \
题外话: 反引号是老的用法,$()是新的用法,不管是在学习测试中,还是在实际工作中,$()的用法都是被推荐的。

[root@rocky8 ~]# C_PS1=`echo "PS1='\[\e[1;31m\][\u@\h \W]\\$ \[\e[0m\]'"`
[root@rocky8 ~]# echo $C_PS1
PS1='\[\e[1;31m\][\u@\h \W]$ \[\e[0m\]'  #使用反向单引号,这里$前面没有\
[root@rocky8 ~]# C_PS1=$(echo "PS1='\[\e[1;31m\][\u@\h \W]\\$ \[\e[0m\]'")
[root@rocky8 ~]# echo $C_PS1
PS1='\[\e[1;31m\][\u@\h \W]\$ \[\e[0m\]' #使用$(),$前面有\

1.10.2 括号扩展:{ }

{} 可以实现打印重复字符串的简化形式

范例44:中括号用法

[root@rocky8 ~]# echo file{1,3,5}
file1 file3 file5

[root@rocky8 ~]# rm -f file{1,3,5}
[root@rocky8 ~]# ls
anaconda-ks.cfg  anaconda-screenshots

[root@rocky8 ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10

[root@rocky8 ~]# 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

[root@rocky8 ~]# echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020

[root@rocky8 ~]# echo {a..z..2}
a c e g i k m o q s u w y

[root@rocky8 ~]# 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

1.11 tab 键补全

tab 键可以实现命令及路径等补全,提高输入效率,避免出错

1.11.1 命令补全

  • 内部命令:
  • 外部命令:bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻以给定命令名命名的文件,第一次找到的命令即为要执行的命令
  • 命令的子命令补全,需要安装 bash-completion

注意:用户给定的字符串只有一条惟一对应的命令,直接补全,否则,再次Tab会给出列表

范例45:命令补全基本用法

[root@rocky8 ~]# yum -y install bash-completion
[root@centos7 ~]# exit # 装完退出
logout

[root@rocky8 ~]# nmcli connection 2TAB
add delete edit help load monitor show
clone down export import modify reload up

1.11.2 路径补全

把用户给出的字符串当做路径开头,并在其指定上级目录下搜索以指定的字符串开头的文件名

如果惟一:则直接补全

否则:再次Tab给出列表

1.11.3 双击Tab键

  • command 2Tab 所有子命令或文件补全
  • string2Tab 以string开头命令
  • /2Tab 显示所有根目录下一级目录,包括隐藏目录
  • ./2Tab 当前目录下子目录,包括隐藏目录
  • *2Tab 当前目录下子目录,不包括隐藏目录
  • ~2Tab 所有用户列表
  • $2Tab 所有变量
  • @2Tab /etc/hosts记录 (centos7 不支持)
  • =2Tab 相当于ls –A (centos7不支持)

1.12 命令行历史

当执行命令后,系统默认会在内存记录执行过的命令

当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是~/.bash_history

登录shell时,会读取命令历史文件中记录下的命令加载到内存中

登录进shell后新执行的命令只会记录在内存的缓存区中;这些命令会用户正常退出时“追加”至命令历史文件中

利用命令历史。可以用它来重复执行命令,提高输入效率

命令: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: 展开历史参数成一行,附加在历史列表后

范例46:history命令基本用法

[root@rocky8 ~]# type history 
history is a shell builtin
[root@rocky8 ~]# history 
    1  shutdown -h now
    2  ip a
    3  pidof tail
    4  ll /proc/`pidof tail`/fd
    5  pidof tail
...
  192  hostname
  193  echo My hostname is rocky8
  194  echo My hostname is hostname
  195  echo My hostname is `hostname`
  196  echo My hostname is $(hostname)
  197  date +%F
  198  touch `date +%F`.log
  199  ls
  200  rm *.log
  201  rm test.conf 
  202  touch `date +%F`.log
  203  ls
  204  ll `echo `date +%F`.txt`
  205  ll $(echo $(date +%F).txt)
  206  ll `echo $(date +%F).txt`
  207  ll $(echo `date +%F`.txt)
  208  ls
  209  touch `echo `date +%F`.txt`
  210  touch `date +%F`.txt
  211  ll `echo `date +%F`.txt`
  212  ll $(echo $(date +%F).txt)
  213  ll `echo $(date +%F).txt`
  214  ll $(echo `date +%F`.txt)
  215  history 
[root@rocky8 ~]# !197 #!数字 执行历史命令
date +%F
2021-10-06

[root@rocky8 ~]# history 
    1  shutdown -h now
    2  ip a
    3  pidof tail
    4  ll /proc/`pidof tail`/fd
...
  216  date +%F
  217  touch `echo `date +%F`.txt`
  218  history 
[root@rocky8 ~]# !-3 #!-数字  执行倒数第几个命令
date +%F
2021-10-06

[root@rocky8 ~]# mysql -uroot -p123456
bash: mysql: command not found...
Packages providing this file are:
'mariadb'
'mysql'
[root@rocky8 ~]# history
    1  tty
    2  who
    3  whoami
…
  230  mysql -uroot -p123456
  231  history
[root@rocky8 ~]#  history -c	# history -c 清空历史命令
[root@rocky8 ~]# history 
1	history

[root@rocky8 ~]# exit
logout
[root@centos8 ~]# history 
    1  tty
    2  who
    3  whoami
…
  187  tty
  188  history 
  189  exit
  190  history
#退出重新登陆,还有历史命令
[root@rocky8 ~]# ls -a .bash_history 
.bash_history		#因为之前的历史命令存在了这个文件里,清空命令只是清空了内存中的记录

命令历史相关环境变量

HISTSIZE:命令历史记录的条数

HISTFILE:指定历史文件,默认为~/.bash_history

HISTFILESIZE:命令历史文件记录历史的条数

HISTTIMEFORMAT="%F %T `whoami` " 显示时间和用户

HISTIGNORE="str1:str2*:…" 忽略str1命令,str2开头的历史

HISTCONTROL:控制命令历史的记录方式
    ignoredups 是默认值,可忽略重复的命令,连续且相同为“重复”
    ignorespace 忽略所有以空白开头的命令
    ignoreboth 相当于ignoredups, ignorespace的组合
    erasedups 删除重复命令

范例47:设置历史命令格式

[root@rocky8 ~]# HISTTIMEFORMAT="%F %T `whoami` " #设置历史命令格式
[root@rocky8 ~]# history 
    1  2021-10-06 14:50:23 root shutdown -h now
    2  2021-10-06 14:50:23 root ip a
    3  2021-10-06 14:50:23 root pidof tail
    4  2021-10-06 14:50:23 root ll /proc/`pidof tail`/fd
    5  2021-10-06 14:50:23 root pidof tail
...
  217  2021-10-06 15:03:38 root touch `echo `date +%F`.txt`
  218  2021-10-06 15:03:47 root history 
  219  2021-10-06 15:03:57 root date +%F
  220  2021-10-06 15:05:24 root HISTTIMEFORMAT="%F %T `whoami` "
  221  2021-10-06 15:05:27 root history 

持久保存变量
以上变量可以 export 变量名=“值” 形式存放在 /etc/profile 或 ~/.bash_profile

范例48:持久保存变量

[root@rocky8 ~]# echo "export EDITOR=vim" >> /etc/profile.d/env.sh 
[root@rocky8 ~]# echo 'export HISTTIMEFORMAT="%F %T "' >> /etc/profile.d/env.sh 
[root@rocky8 ~]# cat /etc/profile.d/env.sh 
PS1='\[\e[1;31m\][\u@\h \W]\$ \[\e[0m\]'
export EDITOR=vim
export HISTTIMEFORMAT="%F %T " 

[root@rocky8 ~]# exit
logout

[root@rocky8 ~]# history 
    1  2021-10-01 07:08:55 shutdown -h now
    2  2021-10-01 07:08:55 ip a
    3  2021-10-01 07:08:55 tty
    4  2021-10-01 07:08:55 w
    5  2021-10-01 07:08:55 echo ${SHELL}

1.13 调用命令行历史

#重复前一个命令方法
重复前一个命令使用上方向键,并回车执行
按 !! 并回车执行
输入 !-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 开头的命令,并获取它的所有参数

范例49:调用历史行命令

[root@rocky8 ~]# cat > a.txt <<EOF
> a
> b
> c
> EOF

[root@rocky8 ~]# cat > b.txt <<EOF
> hello
> EOF

[root@rocky8 ~]# ls a.txt b.txt
a.txt  b.txt
[root@rocky8 ~]# ls !* # !* 上一个命令的所有参数
ls a.txt b.txt
a.txt  b.txt

[root@rocky8 ~]# ls a.txt b.txt
a.txt  b.txt
[root@rocky8 ~]# ls b.txt  # Esc, . 点击Esc键后松开,然后点击 . 键,表示上一个命令的最后一个参数
b.txt

[root@rocky8 ~]# ls a.txt b.txt
a.txt  b.txt
[root@rocky8 ~]# ls !$ # !$ 表示上一个命令的最后一个参数
ls b.txt
b.txt

1.14 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 + # 提示输入指定字符后,重复显示该字符#次

注意:Alt组合快捷键经常和其它软件冲突

范例:xshell中启动 alt 键

如图2-10 键盘设置界面启动xshell中的alt键。

2.获得帮助

获取帮助的能力决定了技术的能力!

多层次的帮助

  • whatis
  • command --help
  • man and info
  • /usr/share/doc/
  • Red Hat documentation 、Ubuntu documentation
  • 软件项目网站
  • 其它网站
  • 搜索

2.1 whatis

whatis 使用数据库来显示命令的简短描述

此工具在系统刚安装后,不可立即使用,需要生成数据库后才可使用

#CentOS 7 版本以后
mandb
#CentOS 6 版本之前
makewhatis

范例50:whatis命令帮助

[root@rocky8 ~]# whatis cal
cal (1)              - display a calendar
cal (1p)             - print a calendar

[root@rocky8 ~]# man -f cal
cal (1)              - display a calendar
cal (1p)             - print a calendar

范例51:whatis命令基本用法

[root@rocky8 ~]# whatis ls
ls: nothing appropriate.

#生成man相关数据库
[root@rocky8 ~]# mandb
Purging old database entries in /usr/share/man/overrides...
Processing manual pages under /usr/share/man/overrides...
Purging old database entries in /usr/share/man...
Processing manual pages under /usr/share/man...
Purging old database entries in /usr/share/man/ru...
Processing manual pages under /usr/share/man/ru...
Purging old database entries in /usr/share/man/fr...
Processing manual pages under /usr/share/man/fr...
Purging old database entries in /usr/share/man/ja...
Processing manual pages under /usr/share/man/ja...
Purging old database entries in /usr/share/man/ko...
Processing manual pages under /usr/share/man/ko...
Purging old database entries in /usr/share/man/pl...
Processing manual pages under /usr/share/man/pl...
Purging old database entries in /usr/share/man/sk...
Processing manual pages under /usr/share/man/sk...
Purging old database entries in /usr/share/man/cs...
Processing manual pages under /usr/share/man/cs...
Purging old database entries in /usr/share/man/da...
Processing manual pages under /usr/share/man/da...
Purging old database entries in /usr/share/man/de...
Processing manual pages under /usr/share/man/de...
Purging old database entries in /usr/share/man/hu...
Processing manual pages under /usr/share/man/hu...
Purging old database entries in /usr/share/man/id...
Processing manual pages under /usr/share/man/id...
Purging old database entries in /usr/share/man/it...
Processing manual pages under /usr/share/man/it...
Purging old database entries in /usr/share/man/pt_BR...
Processing manual pages under /usr/share/man/pt_BR...
Purging old database entries in /usr/share/man/sv...
Processing manual pages under /usr/share/man/sv...
Purging old database entries in /usr/share/man/tr...
Processing manual pages under /usr/share/man/tr...
Purging old database entries in /usr/share/man/zh_CN...
Processing manual pages under /usr/share/man/zh_CN...
Purging old database entries in /usr/share/man/zh_TW...
Processing manual pages under /usr/share/man/zh_TW...
Purging old database entries in /usr/share/man/es...
Processing manual pages under /usr/share/man/es...
Purging old database entries in /usr/share/man/nl...
Processing manual pages under /usr/share/man/nl...
Purging old database entries in /usr/share/man/uk...
Processing manual pages under /usr/share/man/uk...
Purging old database entries in /usr/share/man/ca...
Processing manual pages under /usr/share/man/ca...
Purging old database entries in /usr/share/man/overrides...
Processing manual pages under /usr/share/man/overrides...
Purging old database entries in /usr/local/share/man...
Processing manual pages under /usr/local/share/man...
0 man subdirectories contained newer manual pages.
0 manual pages were added.
0 stray cats were added.
0 old database entries were purged.

[root@rocky8 ~]# whatis ls
ls (1) - list directory contents

[root@centos6 ~]# makewhatis

2.2 查看命令的帮助

2.2.1 内部命令帮助

  • help COMMAND
  • man bash

范例52:内部命令帮助

[root@rocky8 ~]# type enable
enable is a shell builtin
[root@rocky8 ~]# help enable
enable: enable [-a] [-dnps] [-f filename] [name ...]
    Enable and disable shell builtins.
    
    Enables and disables builtin shell commands.  Disabling allows you to
    execute a disk command which has the same name as a shell builtin
    without using a full pathname.
    
    Options:
      -a	print a list of builtins showing whether or not each is enabled
      -n	disable each NAME or display a list of disabled builtins
      -p	print the list of builtins in a reusable format
      -s	print only the names of Posix `special' builtins
    
    Options controlling dynamic loading:
      -f	Load builtin NAME from shared object FILENAME
      -d	Remove a builtin loaded with -f
    
    Without options, each NAME is enabled.
    
    To use the `test' found in $PATH instead of the shell builtin
    version, type `enable -n test'.
    
    Exit Status:
Returns success unless NAME is not a shell builtin or an error occurs.


[root@rocky8 ~]# type hostname
hostname is /usr/bin/hostname
[root@rocky8 ~]# man hostname
HOSTNAME(1)                               Linux Programmer's Manual                               HOSTNAME(1)

NAME
       hostname - show or set the system's host name
       domainname - show or set the system's NIS/YP domain name
       ypdomainname - show or set the system's NIS/YP domain name
       nisdomainname - show or set the system's NIS/YP domain name
       dnsdomainname - show the system's DNS domain name

SYNOPSIS
       hostname  [-a|--alias]  [-d|--domain] [-f|--fqdn|--long] [-A|--all-fqdns] [-i|--ip-address] [-I|--all-
       ip-addresses] [-s|--short] [-y|--yp|--nis]
       hostname [-b|--boot] [-F|--file filename] [hostname]
       hostname [-h|--help] [-V|--version]

       domainname [nisdomain] [-F file]
       ypdomainname [nisdomain] [-F file]
       nisdomainname [nisdomain] [-F file]

       dnsdomainname


[root@rocky8 ~]# whatis passwd
openssl-passwd (1ssl) - compute password hashes
passwd (1)           - update user's authentication tokens
passwd (5)           - password file
[root@rocky8 ~]# man 5 passwd
PASSWD(5)                                 Linux Programmer's Manual                                 PASSWD(5)

NAME
       passwd - password file

DESCRIPTION
       The /etc/passwd file is a text file that describes user login accounts for the system.  It should have
       read permission allowed for all users (many utilities, like ls(1) use it to  map  user  IDs  to  user‐
       names), but write access only for the superuser.

       In  the  good  old days there was no great problem with this general read permission.  Everybody could
       read the encrypted passwords, but the hardware was too slow to crack a well-chosen password, and more‐
       over  the  basic  assumption used to be that of a friendly user-community.  These days many people run
       some version of the shadow password suite, where /etc/passwd has an  'x'  character  in  the  password
       field, and the encrypted passwords are in /etc/shadow, which is readable by the superuser only.

       If  the  encrypted  password,  whether  in /etc/passwd or in /etc/shadow, is an empty string, login is
       allowed without even asking for a password.  Note that this functionality may  be  intentionally  dis‐
       abled  in  applications,  or  configurable  (for  example  using the "nullok" or "nonull" arguments to
       pam_unix.so).

[root@rocky8 ~]# man bash

2.2.2 外部命令和软件帮助

  • COMMAND --help 或 COMMAND -h
  • 使用 man 手册(manual): man COMMAND
  • 信息页:info COMMAND
  • 程序自身的帮助文档:README、INSTALL、ChangeLog
  • 程序官方文档
  • 相关网站
  • 搜索引擎

2.3 --help 或 -h 选项

显示用法总结和参数列表,大多数命令使用,但并非所有的

范例53:–help和-h的基本用法

[root@rocky8 ~]# 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.

Mandatory arguments to long options are mandatory for short options too.
  -d, --date=STRING          display time described by STRING, not 'now'
      --debug                annotate the parsed date,
                              and warn about questionable usage to stderr
  -f, --file=DATEFILE        like --date; once for each line of DATEFILE
  -I[FMT], --iso-8601[=FMT]  output date/time in ISO 8601 format.
                               FMT='date' for date only (the default),
                               'hours', 'minutes', 'seconds', or 'ns'
                               for date and time to the indicated precision.
                               Example: 2006-08-14T02:34:56-06:00
  -R, --rfc-email            output date and time in RFC 5322 format.
                               Example: Mon, 14 Aug 2006 02:34:56 -0600
      --rfc-3339=FMT         output date/time in RFC 3339 format.
                               FMT='date', 'seconds', or 'ns'
                               for date and time to the indicated precision.
                               Example: 2006-08-14 02:34:56-06:00
  -r, --reference=FILE       display the last modification time of FILE
  -s, --set=STRING           set time described by STRING
  -u, --utc, --universal     print or set Coordinated Universal Time (UTC)
      --help     display this help and exit
      --version  output version information and exit

FORMAT controls the output.  Interpreted sequences are:

  %%   a literal %
  %a   locale's abbreviated weekday name (e.g., Sun)
  %A   locale's full weekday name (e.g., Sunday)
  %b   locale's abbreviated month name (e.g., Jan)
  %B   locale's full month name (e.g., January)
  %c   locale's date and time (e.g., Thu Mar  3 23:05:25 2005)
  %C   century; like %Y, except omit last two digits (e.g., 20)
  %d   day of month (e.g., 01)
  %D   date; same as %m/%d/%y
  %e   day of month, space padded; same as %_d
  %F   full date; same as %Y-%m-%d
  %g   last two digits of year of ISO week number (see %G)
  %G   year of ISO week number (see %V); normally useful only with %V
  %h   same as %b
  %H   hour (00..23)
  %I   hour (01..12)
  %j   day of year (001..366)
  %k   hour, space padded ( 0..23); same as %_H
  %l   hour, space padded ( 1..12); same as %_I
  %m   month (01..12)
  %M   minute (00..59)
  %n   a newline
  %N   nanoseconds (000000000..999999999)
  %p   locale's equivalent of either AM or PM; blank if not known
  %P   like %p, but lower case
  %q   quarter of year (1..4)
  %r   locale's 12-hour clock time (e.g., 11:11:04 PM)
  %R   24-hour hour and minute; same as %H:%M
  %s   seconds since 1970-01-01 00:00:00 UTC
  %S   second (00..60)
  %t   a tab
  %T   time; same as %H:%M:%S
  %u   day of week (1..7); 1 is Monday
  %U   week number of year, with Sunday as first day of week (00..53)
  %V   ISO week number, with Monday as first day of week (01..53)
  %w   day of week (0..6); 0 is Sunday
  %W   week number of year, with Monday as first day of week (00..53)
  %x   locale's date representation (e.g., 12/31/99)
  %X   locale's time representation (e.g., 23:13:48)
  %y   last two digits of year (00..99)
  %Y   year
  %z   +hhmm numeric time zone (e.g., -0400)
  %:z  +hh:mm numeric time zone (e.g., -04:00)
  %::z  +hh:mm:ss numeric time zone (e.g., -04:00:00)
  %:::z  numeric time zone with : to necessary precision (e.g., -04, +05:30)
  %Z   alphabetic time zone abbreviation (e.g., EDT)

By default, date pads numeric fields with zeroes.
The following optional flags may follow '%':

  -  (hyphen) do not pad the field
  _  (underscore) pad with spaces
  0  (zero) pad with zeros
  ^  use upper case if possible
  #  use opposite case if possible

After any flags comes an optional field width, as a decimal number;
then an optional modifier, which is either
E to use the locale's alternate representations if available, or
O to use the locale's alternate numeric symbols if available.

Examples:
Convert seconds since the epoch (1970-01-01 UTC) to a date
  $ date --date='@2147483647'

Show the time on the west coast of the US (use tzselect(1) to find TZ)
  $ TZ='America/Los_Angeles' date

Show the local time for 9AM next Friday on the west coast of the US
  $ date --date='TZ="America/Los_Angeles" 09:00 next Fri'

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation at: <https://www.gnu.org/software/coreutils/date>
or available locally via: info '(coreutils) date invocation'

[root@rocky8 ~]# date -d yesterday
Thu Sep 30 17:04:45 CST 2021

[root@rocky8 ~]# date -d yesterday +%F
2021-09-30

[root@rocky8 ~]# date -d "-1 day" +%F
2021-09-30

[root@rocky8 ~]# date -d "2 day" +%F
2021-10-03

[root@rocky8 ~]# cal -h

Usage:
 cal [options] [[[day] month] year]
 cal [options] <timestamp|monthname>

Display a calendar, or some part of it.
Without any arguments, display the current month.

Options:
 -1, --one             show only a single month (default)
 -3, --three           show three months spanning the date
 -n, --months <num>    show num months starting with date's month
 -S, --span            span the date when displaying multiple months
 -s, --sunday          Sunday as first day of week
 -m, --monday          Monday as first day of week
 -j, --julian          use day-of-year for all calendars
     --reform <val>    Gregorian reform date (1752|gregorian|iso|julian)
     --iso             alias for --reform=iso
 -y, --year            show the whole year
 -Y, --twelve          show the next twelve months
 -w, --week[=<num>]    show US or ISO-8601 week numbers
     --color[=<when>]  colorize messages (auto, always or never)
                         colors are enabled by default

 -h, --help            display this help
 -V, --version         display version

For more details see cal(1).

[root@rocky8 ~]# openssl --help
Invalid command '--help'; type "help" for a list.


[root@rocky8 ~]# date -h
date: invalid option -- 'h'
Try 'date --help' for more information.

[root@rocky8 ~]# shutdown -h
Shutdown scheduled for Wed 2021-10-06 15:09:04 CST, use 'shutdown -c' to cancel.

格式说明:

  • [] 表示可选项
  • CAPS或 <> 表示变化的数据
  • … 表示一个列表
  • x |y| z 的意思是“ x 或 y 或 z ”
  • -abc的 意思是 -a -b –c
  • { } 表示分组

2.3.1 练习:

1、显示当前时间,格式:2016-06-18 10:20:30

2、显示前天是星期几

3、设置当前日期为2019-08-07 06:05:10

2.4 man 命令

man 提供命令帮助的文件,手册页存放在/usr/share/man

几乎每个命令都有man的“页面”

中文man需安装包

  • man-pages
  • man-pages-zh-CN

man 章节

man 页面分组为不同的“章节”,统称为Linux手册,man 1 man

  • 1:用户命令
  • 2:系统调用
  • 3:C库调用
  • 4:设备文件及特殊文件
  • 5:配置文件格式
  • 6:游戏
  • 7:杂项
  • 8:管理类的命令
  • 9:Linux 内核API

man命令的配置文件:

#CentOS 6 之前版 man 的配置文件
/etc/man.config
#CentOS 7 之后版 man 的配置文件
/etc/man_db.conf
#ubuntu man 的配置文件
/etc/manpath.config

格式:

MANPATH /PATH/TO/SOMEWHERE #指明man文件搜索位置

也可以指定位置下搜索COMMAND命令的手册页并显示

man -M /PATH/TO/SOMEWHERE COMMAND

查看man手册页

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: 回到文件首部
  • G:翻至文件尾部
  • /KEYWORD
    以KEYWORD指定的字符串为关键字,从当前位置向文件尾部搜索;不区分字符大小写
    n:下一个
    N:上一个
  • ?KEYWORD
    以KEYWORD指定的字符串为关键字,从当前位置向文件首部搜索;不区分字符大小写
    n:跟搜索命令同方向,下一个
    N:跟搜索命令反方向,上一个

man 常用选项

  • 列出所有帮助
man -a keyword
  • 搜索man手册
#列出所有匹配的页面,使用 whatis 数据库
man -k keyword
  • 相当于 whatis
man -f keyword
  • 打印man帮助文件的路径
man -w [章节] keyword

范例54:最小化安装时需要安装 man 包

[root@rocky8 ~]# yum install man-pages

[root@rocky8 ~]# whatis passwd
openssl-passwd (1ssl) - compute password hashes
passwd (1)           - update user's authentication tokens
passwd (5)           - password file

[root@rocky8 ~]# man 5 passwd

[root@rocky8 ~]# man -w 1 passwd
/usr/share/man/man1/passwd.1.gz

[root@rocky8 ~]# man 1ssl openssl-passwd

[root@rocky8 ~]# man 7 ascii
[root@rocky8 ~]# man 7 utf8

2.4.1 练习:

1、在本机字符终端登录时,除显示原有信息外,再显示当前登录终端号,主机名和当前时间

2、今天18:30自动关机,并提示用户

2.5 info

man常用于命令参考 ,GNU工具 info 适合通用文档参考

没有参数,列出所有的页面

info 页面的结构就像一个网站

每一页分为“节点”

链接节点之前 *

info 命令格式

info [ 命令 ]

导航info页

  • 方向键,PgUp,PgDn 导航
  • Tab键 移动到下一个链接
  • d 显示主题目录
  • Home 显示主题首部
  • Enter进入 选定链接
  • n/p/u/l 进入下/前/上一层/最后一个链接
  • s 文字 文本搜索
  • q 退出 info

2.6 命令自身提供的官方使用指南

/usr/share/doc 目录

多数安装了的软件包的子目录,包括了这些软件的相关原理说明

常见文档:README INSTALL CHANGES

不适合其它地方的文档的位置

配置文件范例

HTML/PDF/PS 格式的文档

授权书详情

2.7 系统及第三方应用官方文档

2.7.1 通过在线文档获取帮助

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

2.7.2 Linux官方在线文档和知识库

通过发行版官方的文档光盘或网站可以获得安装指南、部署指南、虚拟化指南等

https://help.ubuntu.com/
http://kbase.redhat.com
http://www.redhat.com/docs
http://access.redhat.com
https://help.ubuntu.com/lts/serverguide/index.html
http://tldp.org

2.7.3 红帽全球技术支持服务

rhn.redhat.com或者本地卫星服务器/代理服务器

RHN账户为及其注册和基于网络管理的RHN用户

sosreport 收集所有系统上的日志信息的工具,并自动打成压缩包,方便技术支持人员和红帽全球支持

提供分析问题依据

范例55:sosreport用法

[root@rocky8 ~]# dnf -y install sos
[root@rocky8 ~]# 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 Rocky system and installed applications.

An archive containing the collected information will be generated in
/var/tmp/sos.37730i48 and may be provided to a Rocky support
representative.

Any information provided to Rocky will be treated in accordance with the
published support policies at:

  https://rockylinux.org/

The generated archive may contain data considered sensitive and its
content should be reviewed by the originating organization before being
passed to any third party.

No changes will be made to system configuration.

Press ENTER to continue, or CTRL-C to quit.

Please enter the case id that you are generating this report for []: 2

 Setting up archive ...
 Setting up plugins ...
[plugin:firewalld] skipped command 'nft list ruleset': required kmods missing: nf_tables, nfnetlink.  Use '--allow-system-changes' to enable collection.
[plugin:networking] skipped command 'ip6tables -t nat -nvL': required kmods missing: nf_tables, ip6table_nat. 
[plugin:networking] skipped command 'ip6tables -t mangle -nvL': required kmods missing: ip6table_mangle, nf_tables. 
[plugin:networking] skipped command 'ip6tables -t filter -nvL': required kmods missing: nf_tables, ip6table_filter. 
[plugin:networking] skipped command 'nft list ruleset': required kmods missing: nf_tables. 
[plugin:networking] skipped command 'ip -s macsec show': required kmods missing: macsec.  Use '--allow-system-changes' to enable collection.
[plugin:networking] skipped command 'ss -peaonmi': required kmods missing: udp_diag, af_packet_diag, netlink_diag, inet_diag, tcp_diag, unix_diag.  Use '--allow-system-changes' to enable collection.
[plugin:networking] skipped command 'iptables -vnxL': required kmods missing: iptable_filter, nf_tables. 
[plugin:networking] skipped command 'ip6tables -vnxL': required kmods missing: nf_tables, ip6table_filter. 
[plugin:systemd] skipped command 'systemd-resolve --status': required services missing: systemd-resolved. 
[plugin:systemd] skipped command 'systemd-resolve --statistics': required services missing: systemd-resolved. 
 Running plugins. Please wait ...

  Finishing plugins              [Running: processor]                                     
  Finished running plugins                                                               
Creating compressed archive...

Your sosreport has been generated and saved in:
	/var/tmp/sosreport-rocky8-2-2021-10-01-qjcljmg.tar.xz

 Size	11.56MiB
 Owner	root
 md5	77bd1bbd4fc642a4a01abca70ce59ac6

Please send this file to your support representative.
[root@rocky8 ~]# ll /var/tmp/sosreport-rocky8-2-2021-10-01-qjcljmg.tar.xz
-rw------- 1 root root 12122240 Oct  1 17:27 /var/tmp/sosreport-rocky8-2-2021-10-01-qjcljmg.tar.xz

2.8 网站和搜索

http://www.google.com

Openstack filetype:pdf
rhca site:redhat.com/docs

http://bing.com
http://www.baidu.com
https://www.dogedoge.com/
http://www.slideshare.net

球技术支持服务

rhn.redhat.com或者本地卫星服务器/代理服务器

RHN账户为及其注册和基于网络管理的RHN用户

sosreport 收集所有系统上的日志信息的工具,并自动打成压缩包,方便技术支持人员和红帽全球支持

提供分析问题依据

范例55:sosreport用法

[root@rocky8 ~]# dnf -y install sos
[root@rocky8 ~]# 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 Rocky system and installed applications.

An archive containing the collected information will be generated in
/var/tmp/sos.37730i48 and may be provided to a Rocky support
representative.

Any information provided to Rocky will be treated in accordance with the
published support policies at:

  https://rockylinux.org/

The generated archive may contain data considered sensitive and its
content should be reviewed by the originating organization before being
passed to any third party.

No changes will be made to system configuration.

Press ENTER to continue, or CTRL-C to quit.

Please enter the case id that you are generating this report for []: 2

 Setting up archive ...
 Setting up plugins ...
[plugin:firewalld] skipped command 'nft list ruleset': required kmods missing: nf_tables, nfnetlink.  Use '--allow-system-changes' to enable collection.
[plugin:networking] skipped command 'ip6tables -t nat -nvL': required kmods missing: nf_tables, ip6table_nat. 
[plugin:networking] skipped command 'ip6tables -t mangle -nvL': required kmods missing: ip6table_mangle, nf_tables. 
[plugin:networking] skipped command 'ip6tables -t filter -nvL': required kmods missing: nf_tables, ip6table_filter. 
[plugin:networking] skipped command 'nft list ruleset': required kmods missing: nf_tables. 
[plugin:networking] skipped command 'ip -s macsec show': required kmods missing: macsec.  Use '--allow-system-changes' to enable collection.
[plugin:networking] skipped command 'ss -peaonmi': required kmods missing: udp_diag, af_packet_diag, netlink_diag, inet_diag, tcp_diag, unix_diag.  Use '--allow-system-changes' to enable collection.
[plugin:networking] skipped command 'iptables -vnxL': required kmods missing: iptable_filter, nf_tables. 
[plugin:networking] skipped command 'ip6tables -vnxL': required kmods missing: nf_tables, ip6table_filter. 
[plugin:systemd] skipped command 'systemd-resolve --status': required services missing: systemd-resolved. 
[plugin:systemd] skipped command 'systemd-resolve --statistics': required services missing: systemd-resolved. 
 Running plugins. Please wait ...

  Finishing plugins              [Running: processor]                                     
  Finished running plugins                                                               
Creating compressed archive...

Your sosreport has been generated and saved in:
	/var/tmp/sosreport-rocky8-2-2021-10-01-qjcljmg.tar.xz

 Size	11.56MiB
 Owner	root
 md5	77bd1bbd4fc642a4a01abca70ce59ac6

Please send this file to your support representative.
[root@rocky8 ~]# ll /var/tmp/sosreport-rocky8-2-2021-10-01-qjcljmg.tar.xz
-rw------- 1 root root 12122240 Oct  1 17:27 /var/tmp/sosreport-rocky8-2-2021-10-01-qjcljmg.tar.xz

2.8 网站和搜索

http://www.google.com

Openstack filetype:pdf
rhca site:redhat.com/docs

http://bing.com
http://www.baidu.com
https://www.dogedoge.com/
http://www.slideshare.net

标签:...,入门,--,echo,命令,Linux,第二章,root,rocky8
From: https://blog.csdn.net/qq_25599925/article/details/143376976

相关文章

  • stm32入门教程-- DMA数据转运
    目录简介原理实验示例1、DMA数据转运实现代码实验效果原理实验示例1、DMA数据转运接线图存储器映像 我们在开始代码之前,可以看下我们定义的数据,到底是不是真的存储在了这个相应的地址区间里,我们看代码:uint8_taa=0x66;intmain(void){OLED_Init();......
  • 采用gpio-mio的sdk文档编译petalinux
    其余步骤都ok到下面生成boot.bin文件时失败 在网上找到了类似的  部署运行petalinux系统镜像_defaultbitsreamisnotfound,pleasespecifyabi-CSDN博客 经发现为该文件为纯PS端 未用到pl端  所以在生成时需要去除--fpga 这样就成功了......
  • Linux系统基础-多线程超详细讲解(3)_线程互斥同步和条件变量
    个人主页:C++忠实粉丝欢迎点赞......
  • Linux Centos7 同步服务器时钟为北京时间
    Linux服务器时间不准确,容易造成日志时间错误、数据统计时间不准确等问题,因此需要将服务器时间设置准确并实时更新。操作步骤如下:1、安装ntp使用date命令查看时间是否准确:date如果不准确,使用ntp同步最新网络时间,安装ntp:yuminstall-yntp2、启动ntp服务执行命令:systemctl......
  • 大模型项目实战零基础入门到精通,非常详细收藏我这一篇就够了!
    Part.1什么是生成式AI?**“所有产品都值得用大模型重做一次。”**是近几年在AI圈子非常火爆的观点。当大家都在热议大模型和生成式AI时,怎么让这些炫酷的技术快速落地,真正帮到商业和社会,成了个大难题。不过,AWS已经把大模型和生成式AI的门槛大大降低了。什么是生成式AI?生......
  • 海外联盟营销入门:2024最新指南
    在联盟营销(AffiliateMarketing)过程中,人们往往会在项目所需的电商、博客、社媒等平台上推广产品或服务以获得佣金收入,有数据显示联盟营销为数字媒体行业带来了15%的增长收入。然而,在联盟营销带来利润丰厚的同时,他也存在一个难题:有效的多账户管理。如果没有合适的工具,联盟营销很......
  • Cocos Creator引擎开发:Cocos Creator基础入门_CocosCreator物理引擎
    CocosCreator物理引擎物理引擎简介CocosCreator内置的物理引擎是基于Box2D的2D物理引擎,它可以帮助开发者轻松地在游戏场景中实现物理效果,如碰撞检测、刚体运动、重力、关节等。物理引擎的使用可以大大提升游戏的真实感和互动性,使得游戏更加生动有趣。物理引擎的主......
  • 【Linux】————进程间通信(匿名管道)
                                 作者主页:   作者主页                           本篇博客专栏:Linux                ......
  • Linux安装Tomcat
    Linux安装Tomcat下载Tomcat打开浏览器,进入Tomcat官网选择要下载的Tomcat版本,下载.tar.gz安装Tomcat将下载的.tar.gz上传至linux服务器,并进行解压tarxzfapache-tomcat-9.0.XX.tar.gz-C/opt/tomcat配置环境变量编辑环境变量文件:vim/etc/profile在文件末尾添加以下......
  • Linux 常用命令笔记
    Linux命令行常用快捷键Ctrl+a:移到行首Ctrl+e:移到行尾ctrl+u:光标处往前删除ctrl+k:光标处往后删除Linux常用命令汇总vim:dd:删除游标所在的一整行(常用)网络相关命令汇总netstat:打印网络连接、路由表、接口统计、伪装连接和多播成员关系lsof:lsof(listopenfiles)是一个列出当......