Linux基础(三)——Bash基础

1、Bash基础

1.1 Bash简介

从前边操作系统的组成介绍中,我们可以知道操作系统为上层用户提供的与内核进行交互的接口称为shell ,其在系统中的位置如下图所示,shell作为内核和用户之间的中介,接收用户发送的指令,将其解析为内核可识别的指令(系统调用)下发给内核,并将执行结果返回给用户,从而实现用户的需求,所以shell也叫命令解析器。

shell按照其接口类型主要可以分两类:
图形界面shell(Graphical User Interface shell): 为用户提供图形化操作界面,用户通过图标、菜单、窗口等可视化元素与内核进行交互。如:Windows Explorer 和 Linux的 X window manager、GNOME、KDE 等都是典型的GUI Shell,这种 shell 对普通用户来说更加友好,但资源占用率较高。
**命令行式shell(Command Line Interface shell):**为用户提供字符操作界面,用户通过输入文本命令与内核进行交互。如 Windows 的 CMD 和 Linux 的 Bash 就是典型的 CLI Shell,这种 shell 对于维护和开发人员来说更加高效,且资源占用更低。

shell有两种工作模式:
交互式:用户登录shell的交互式界面,shell持续等待接收用户从标准输入设备(如键盘、鼠标等)输入的指令,执行完毕后将结果返回给标准输出设备(如显示屏),用户主动退出登录界面后,shell才会停止。

**非交互式:**shell自动读取并执行保存在文件中的指令(本质上也是一些命令组合),完成特定的任务,不需要与用户交互,读取和执行完毕后自动结束。

Linux系统下的 shell 一般指的是命令行式的 shell,当前主流的 shell 是 Bash,Bash 是现代 Unix/Linux 系统默认的 shell。

Linux系统下支持的 shell 主要有以下几种类型:

**1)Bourne Shell (sh):**Unix系统的原始Shell,特点是语法简洁,但缺乏命令历史、补全等交互式功能。

**2)C Shell (csh) & Tenex C Shell (tcsh):**csh和tcsh采用C语言语法风格,支持作业控制和历史命令,但csh由于设计存在缺陷后被tcsh取代,这两种 shell 适合熟悉C语言的用户,但脚本兼容性较差。

3)Korn Shell (ksh):结合了 sh 和 C Shell 优点,兼容POSIX,支持高级脚本特性,提供关联数组和浮点运算,性能优于bash,适合高性能场景。

4**)Bourne Again Shell(bash):**sh的增强版,融合了 csh、ksh 的特性,扩展了交互功能,支持命令历史、别名、脚本调试、数组等。

5)Z Shell (zsh):bash的扩展版本,注重用户体验和定制化,支持主题插件(如Oh My Zsh)、智能补全、拼写纠正等功能,适合使用交互式终端的开发者。

Bash拥有良好的兼容性和强大的功能,其主要特性如下:

**1)支持交互式操作:**用户可以直接输入命令对系统进行管理和维护,同时提供历史记录、命令补全、别名定义等交互特性。

**2)支持脚本编程能力(非交互式操作):**支持变量定义、条件判断语句、循环语句、函数定义等编程结构,用户可以使用这些元素编写自动化脚本来实现自己的需求。

3)支持管道、重定向、通配符等高级特性

Bash是我们操作Linux系统的基本工具,Linux系统的大多数管理和维护操作(如服务部署、脚本开发、文件批处理、定时任务、日志监控等)都是通过 Bash 来完成,所以了解Bash是我们熟悉Linux的第一步。

装完系统后,通过远程登录或者本地 terminal 打开的就是一个交互式的Bash界面,如下图所示,在这个界面用户就可以通过命令与系统进行交互:

1.2 Bash命令

1.2.1 命令提示符

登录到Bash交互界面后,用户可以输入各种命令对系统进行管理和维护,可以看到每一行输入光标前都会自动生成一串 [ ] 包起来的固定字符串,这个我们把它称为命令提示符。命令提示符一般由3部分组成:用户名/主机名和工作目录

root 表示当前登录的用户名

这个提示符的格式也可以通过修改环境变量进行自定义,暂时可以不需要关注,了解了环境变量之后再去研究。

1.2.2 命令格式

Bash下的命令通常都遵循一定的规范,其通用格式如下:

命令关键字 [命令参数] [命令对象]

命令关键字:命令的名称,一般是对应可执行的二进制程序的名字或别名,是一个命令的必要组成部分。

命令参数:命令的入参,通过传入不同参数可以对命令的执行流程和输出内容进行调整,是一个命令的可选项,如果不指定以默认参数执行和输出。

命令对象:命令作用的对象,一般指要处理的字符串、文件、目录、用户等资源,是一个命令的可选项,如果不指定,以默认对象执行。

**注:**命令名称、命令参数、命令对象之间用空格作为分隔。

**注:**命令字符对大小写敏感。

交互界面输完命令后,回车表示输入结束,Bash会解析和执行输入的命令,执行完毕后将结果输出到Bash界面,如下为一些命令示例:

bash 复制代码
[root@localhost ~]# cat /etc/system-release  # 查看系统版本(携带命令对象)
CentOS Linux release 7.9.2009 (Core)     # 命令输出
[root@localhost ~]# uname -r    # 查看内核版本(携带一个命令参数)
3.10.0-1160.el7.x86_64    # 命令输出
[root@localhost ~]# arch   # 查看CPU架构(不携带参数)
x86_64    # 命令输出
[root@localhost ~]# cat -n /etc/shells    # 查看系统支持的shell类型(同时携带命令参数和命令对象)
     1  /bin/sh                # 命令输出
     2  /bin/bash
     3  /usr/bin/sh
     4  /usr/bin/bash
     5  /bin/tcsh
     6  /bin/csh

命令参数格式:不同命令支持的参数不同,一条命令可以同时携带多个参数,多个参数以空格分隔,有些参数本身也可以携带入参。

参数一般有两种表示格式(有些命令参数同时支持两种格式,有些命令参数只支持其中一种格式):

长格式-- 加完整的参数名称,这种格式可读性更高

短格式- 加参数单个字母的缩写,这种格式使用更加便捷

如 uname的短格式参数 -r,对应的长格式参数是 --kernel-release ,这两种是等价的

bash 复制代码
[root@localhost ~]# uname -r
3.10.0-1160.el7.x86_64
[root@localhost ~]# uname --kernel-release
3.10.0-1160.el7.x86_64

一般对命令参数比较熟悉之后,主要还是以使用短格式为主。

参数合并: 多个短格式参数可以进行合并(长格式不行),合并后仅保留一个 **-**号即可(参数合并时如果有要加操作对象的参数,这个参数必须放在最后)。

如查看当前目录下文件列表的命令 ls,携带两个参数 -l -h 可以合并为 -lh:

bash 复制代码
[root@localhost ~]# ls -l -h
total 8.0K
-rw-------. 1 root root 1.6K Jun 26 19:06 anaconda-ks.cfg
-rw-r--r--. 1 root root 1.6K Jun 26 19:14 initial-setup-ks.cfg
[root@localhost ~]# ls -lh  
total 8.0K
-rw-------. 1 root root 1.6K Jun 26 19:06 anaconda-ks.cfg
-rw-r--r--. 1 root root 1.6K Jun 26 19:14 initial-setup-ks.cfg

命令注释:添加 # 可以对Bash中输入的内容进行注释,# 到行尾之间的字符不会被解析和执行。

bash 复制代码
[root@localhost ~]# # uname -r this is a comment
[root@localhost ~]#

命令分隔 :一般一行只输入一条命令,Bash只有读到行尾的回车才会认为一次输入结束了,将所有输入内容作为一条命令进行解析执行,如果一行要输入多条命令,可以用 ; 进行分隔,Bash读到 **;**也会认为一次输入结束了,将前边的输入解析执行完之后再继续解析后边的输入。

bash 复制代码
[root@localhost ~]# cat /etc/system-release; uname -r; arch  
CentOS Linux release 7.9.2009 (Core)
3.10.0-1160.el7.x86_64
x86_64

命令换行 :如果命令太长要跨行输入,可以在行尾使用 **\**表示续行,回车后Bash会自动忽略本行尾的回车符,将 \ 后一行的内容跟前边的内容当做一次输入进行解析。

bash 复制代码
[root@localhost ~]# cat /etc/system-\
> release
CentOS Linux release 7.9.2009 (Core)

1.2.3 命令类型

Bash下可执行的命令分为两种类型:

内置命令:bash解释器自带的命令,可以直接执行,不需要调用外部程序,执行速度快

外部命令:外部可执行文件提供的命令,需要通过子进程执行,执行速度慢

内置命令优先级高于外部命令,如果一条命令同时有内置版本和外部版本,则优先执行内置的版本。

通过 typecommand 命令可以判断一条命令时内置命令还是外部命令

type判断命令类型:type <cmd-name>

bash 复制代码
[root@localhost ~]# type date
date is /usr/bin/date      # 显示二进制可执行文件路径表示是外部命令
[root@localhost ~]# type pwd
pwd is a shell builtin     # 显示shell builtin表示内置命令

command判断命令类型:command -V <cmd-name>

bash 复制代码
[root@localhost ~]# command -V echo
echo is a shell builtin             # 显示shell builtin表示内置命令
[root@localhost ~]# command -V uname
uname is hashed (/usr/bin/uname)    # 显示二进制可执行文件路径表示外部命令

外部命令显示hashed,表示这条命令执行过,bash会自动缓存其可执行文件路径,以便下次调用。

注:这个命令类型一般不需要关注,了解即可。

1.2.4 命令帮助

Bash下的命令繁多,好在Bash提供了多种命令帮助方式,可以帮助我们快速了解一个命令的基本功能和使用方法,而不需要纯靠钢铁记忆。常用的命令帮助有以下几种:

1)whatis---查看命令基本功能

whatis本身也是一个命令,用它可以查看指定命令的基本功能描述(但也只能看个功能描述),其用法如下:

格式:whatis [命令名称]

如查看 uname 命令的功能概述可知其作用是查看系统信息和内核信息:

bash 复制代码
[root@localhost ~]# whatis ls
ls (1)               - list directory contents
ls (1p)              - list directory contents

2)help ---查看内置命令使用帮助

通过help命令可以查看Bash内置命令的基本用法,其用法如下:

格式:help [命令名称]

如查看 history 命令的基本用法,可以看到其使用格式和参数说明:

bash 复制代码
[root@localhost ~]# help history 
history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]
    Display or manipulate the history list.
    
    Display the history list with line numbers, prefixing each modified
    entry with a `*'.  An argument of N lists only the last N entries.
    
    Options:
      -c        clear the history list by deleting all of the entries
      -d offset delete the history entry at offset OFFSET.
    
      -a        append history lines from this session to the history file
      -n        read all history lines not already read from the history file
      -r        read the history file and append the contents to the history
        list
      -w        write the current history to the history file
        and append them to the history list
......
    

help只能查看Bash内置的命令,不支持外部命令,直接输入help不带参数,可以看到其支持的内置命令。

3)--help或 -h 参数---查看命令使用帮助

--help或 -h是命令本身支持的帮助参数,大部分命令都支持(有些支持长格式有些支持短格式),通过该参数可以查看当前命令的基本用法以及其支持的参数列表,这是最实用的帮助方法,其用法如下:

格式:[命令名称] --help/-h

如查看 ls 命令的用法,可以看到其使用格式和支持的参数列表:

bash 复制代码
[root@localhost ~]# ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print C-style escapes for nongraphic characters
      --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                               '--block-size=M' prints sizes in units of
                               1,048,576 bytes; see SIZE format below
  -B, --ignore-backups       do not list implied entries ending with ~
......

4)man

如果-h/--help还不能满足你,就可以考虑man命令了,通过 man命令查看指定命令或配置文件的详细说明手册(前提是对应命令带了说明手册,如果没带的话看不到),其用法如下:

格式:man [命令关键字/配置文件]

如查看 ls 命令的说明手册 man ls:

bash 复制代码
LS(1)                                                  User Commands                                                  LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information about the FILEs (the current directory by default).  Sort entries alphabetically if none of -cftu‐
       vSUX nor --sort is specified.

       Mandatory arguments to long options are mandatory for short options too.

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..

       --author
              with -l, print the author of each file

       -b, --escape
              print C-style escapes for nongraphic characters

       --block-size=SIZE
              scale sizes by SIZE before printing them; e.g., '--block-size=M' prints sizes in units  of  1,048,576  bytes;
              see SIZE format below

       -B, --ignore-backups
              do not list implied entries ending with ~
......

man说明手册的内容结构一般包含以下几部分:

|-------------|---------|
| 结构名称 | 含义 |
| NAME | 命令名称 |
| SYNOPSIS | 命令使用格式 |
| DESCRIPTION | 命令的用法说明 |
| EXAMPLES | 命令使用示例 |
| OVERVIEW | 命令概述 |
| DEFAULTS | 默认操作 |
| OPTIONS | 选项说明 |
| ENVIRONMENT | 环境变量 |
| FILES | 涉及的文件 |
| Author | 命令手册作者 |
| COPYRIGHT | 版权信息 |
| SEE ALSO | 参考资料 |

通过man读取说明手册时会进入阅读模式,该模式下常用快捷键如下:

|--------------|----------------------|
| h | 帮助信息 |
| q | 退出阅读模式 |
| 空格/Page Down | 向下翻页 |
| Page Up | 向上翻页 |
| Home | 跳到首页 |
| End | 跳到尾页 |
| / | 从上至下搜索指定关键字,如 /hello |
| ? | 从下至上搜索指定关键字,如?hello |
| n | 跳到下一个搜索到的关键字 |
| N | 跳到上一个搜索到的关键字 |

空格键

上边的说明看看就行,用的时候再去了解。大部分场景使用 -h/--help就可以满足需求,但如果想知道一些参数细节或者想通过某个命令实现特殊的功能,网上又查不到相关资料时,不妨翻一翻man手册,可能会有意外的发现。

5)info/pinfo

info是Linux默认的标准文档浏览工具,用于查看GNU软件的详细文档,通常以超文本形式组织内容,支持超链接跳转和层次化导航。pinfo是info的增强版,提供了更友好的用户界面,支持颜色高亮、鼠标操作以及更直观的导航方式。跟man相比info/pinfo可以提供更加详细的结构化、超链接式手册,适用于学习一些复杂的GNU工具,如gcc、bash等。其用法如下:

格式:info/pinfo [命令关键字]

如查看bash的说明手册(q退出):pinfo bash

1.2.5 命令行快捷键

Bash命令行界面还支持很多快捷键,可以提升操作效率,这里列出一些常用的:

|----------------------------|-----------------------|
| 快捷键 | 作用 |
| Ctrl + A 或 Home | 光标移到当前行首 |
| Ctrl + E 或 End | 光标移到当前行尾 |
| Ctrl + U | 将当前光标处一直到行头的字符都删掉 |
| Ctrl + K | 将当前光标处一直到行尾的字符都删掉 |
| Alt + R | 删除整行 |
| Ctrl + Y | 粘贴最近删除的内容 |
| Up/Down | 查看历史缓存命令 |
| Esc松手(2s)后按 . 或 Alt+ . | 调用上一条命令最后一部分(空格作为分隔符) |
| Ctrl + R | 根据关键词搜索历史命令 |
| Tab | 根据当前输入补全命令、文件名或路径 |
| Ctrl + C | 终止当前正在执行的命令或取消本次输入 |
| Ctrl + Z | 将当前运行的命令挂起到后台 |
| Ctrl + L | 清除屏幕上所有内容 |

1.2.6 命令补全

命令补全是 Bash 提供的一个很方便的特性,使用 Tab 快捷键就可以轻松完成命令或文件路径补全,不需要记忆完整的命令名或文件名也行,提高操作效率,其基本用法如下:

1)不完整命令关键字或文件名+Tab

Tab x1:如果当前环境有跟对应关键字唯一匹配的命令或文件,则直接进行补全,如果没有匹配项或匹配项不唯一,则不进行补全。

Tab x2:列出当前环境下所有跟对应关键字匹配的命令或文件

如下图所示,直接输入 unam+Tab,由于系统中以 unam 开头的命令只有 uname,所以会自动进行补全,直接敲 un+Tab,由于以 un 开头的命令不唯一,所以不会进行补全,这种情况敲2次Tab 就会列出环境上所有以 un 开头的命令:

bash 复制代码
[root@localhost ~]# # unam + Tab
[root@localhost ~]# uname 
[root@localhost ~]# # un + Tab
[root@localhost ~]# un
[root@localhost ~]# # un + Tabx2
[root@localhost ~]# un
unalias         uncompress      unicode_stop    unix-lpr.sh     unlz4           unshare         unzip
uname           unexpand        uniq            unix_update     unpack200       until           unzipsfx

同样对于文件或目录名补全规则也是一样,如下图所示,cat 查看文件内容时,文件名输入 /etc/os+Tab,由于以 /etc/ 目录下以 os 开头的文件只有 os-release,所以会自动进行补全,而如果文件名只输入 /etc/o+Tab,/etc/ 目录下以 os 开头的文件不唯一,所以不会进行补全,再敲一次Tab则会列出 /etc/ 目录下所有以 o 开头的文件(或目录):

bash 复制代码
[root@localhost ~]# # cat /etc/os + Tab
[root@localhost ~]# cat /etc/os-release 
[root@localhost ~]# # cat /etc/o + Tab
[root@localhost ~]# cat /etc/o
[root@localhost ~]# # cat /etc/o + Tabx2
[root@localhost ~]# cat /etc/o
oddjob/         oddjobd.conf    oddjobd.conf.d/ openldap/       opt/            os-release

2)完整命令关键字或文件名+空格+Tabx2

直接在完整的命令关键字或文件名后空格,再敲2次 Tab 默认会列出当前目录下的所有文件或目录,相当于敲了一次 ls 命令,列出命令可操作的文件对象。

bash 复制代码
[root@localhost ~]# # cat + Tabx2
[root@localhost ~]# cat 
anaconda-ks.cfg       .config/              .esd_auth             .local/               Videos/
.bash_history         .cshrc                eth01.pcap            Music/                .xauthZAdD5o
.bash_logout          .dbus/                eth0.pcap             Pictures/             
.bash_profile         Desktop/              .ICEauthority         Public/               
.bashrc               Documents/            initial-setup-ks.cfg  .tcshrc               
.cache/               Downloads/            .lesshst              Templates/               

注:命令补全由 bash-completion 包支持,如果系统安装使用的是最小化安装方式,可能不会自带该包,需要自行补包。

1.2.7 历史命令

Bash会自动缓存命令行界面执行过的历史命令,默认保留最近100条命令,记录历史命令一方面可以回溯历史操作,另一方面可以方便再次调用,查看和调用历史命令的方法有如下几种:

1)history命令

通过 history 命令可以查看当前用户缓存中的所有历史命令,可以看到每条历史命令会从1开始编号,ID越小,命令越早,通过 !! 可以调用上一条命令,通过 !<key-word> 可以调用最近一条包含key-word的历史命令,通过 ! <ID> 就可以直接调用指定编号的历史命令,如这里调用第2条历史命令

bash 复制代码
[root@localhost ~]# history 
    1  uname -r
    2  arch 
    3  cat /etc/os-release 
    4  ls
    5  type date
    6  help
    7  whatis ls
    8  man ls
    9  pinfo bash
   10  cat /etc/system-release
   11  history 
[root@localhost ~]# !2
arch
x86_64

2)Up/Down方向键

命令行界面通过Up/Down 方向键可以逐条调出history缓存中的历史命令,Up是上一条,Down是下一条,如这里向上方向键翻3次就可以看到之前执行的命令,回车可以直接执行,:

bash 复制代码
[root@localhost ~]# cat /etc/system-release   
CentOS Linux release 7.9.2009 (Core)

3)Ctrl + R 快捷键

通过 Ctrl + R 快捷键可以使用指定的关键字从历史命令缓存中搜索匹配的命令,如下图所示,直接在命令行按 Ctrl + R 即可进入搜索模式,输入关键字 una,后边就显示了从历史命令缓存中搜索到的包含una的命令 uname -r,回车即可执行搜索到的命令:

bash 复制代码
[root@localhost ~]# 
(reverse-i-search)`una': uname -r
[root@localhost ~]# uname -r     
3.10.0-1160.el7.x86_64

history中记录的历史命令都保存在内存中,为了使其持久化保存,Bash会在用户退出登录后,自动将 history 缓存中的历史命令追加到用户家目录的 .bash_history文件中,用户下次登录时Bash会自动将该文件中的所有命令重新加载到 history 缓存中。

bash 复制代码
[root@localhost ~]# cat .bash_history
uname -r
arch 
cat /etc/os-release 
ls
type date
help
whatis ls
man ls
pinfo bash
cat /etc/system-release
history 
arch 
cat /etc/system-release
uname -r

history命令缓存管理:

清除历史命令缓存(不影响 .bash_history 中的记录):history -c

清除历史命令缓存中指定记录:history -d <ID>

将当前历史命令缓存追加到 .bash_history文件:history -a

将当前历史命令缓存写入 .bash_history文件(覆盖):history -w

history缓存和 .bash_history 文件可记录的最大历史命令条数可以通过 HISTSIZEHISTFILESIZE 环境变量来进行设置,这个可以后续再环境变量部分了解。

1.2.8 命令别名

命令别名是Bash的另一个特性,顾名思义,就是为指定的命令设置一个别名,通过别名可以直接调用对应的命令,设置别名的方式如下:

定义别名:alias <命令别名>="实际命令"

取消别名:unalias <命令别名>

命令行界面通过 alias 命令可以为当前用户设置命令别名,不过这种方式只有临时生效,如果需要永久生效,需要将其写入用户的环境配置文件中(这个后边讲解到环境变量的时候再说明)。

使用 alias 命令可以看到当前用户环境下已经定义的别名或指定命令是否有别名,如下为当前用户已经默认设置的别名:

bash 复制代码
[root@localhost ~]# alias 
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'

注:如果别名跟已有的系统命令名称相同,则会覆盖已有的系统命令(这个覆盖不是指系统命令不存在了,而是在调用时如果发现该命令有别名,就会直接调用别名指定的命令了,相当于绕过了系统命令)。

注:如果为一个已有的别名定义了一个名字相同的别名命令,后边定义的会把前边的覆盖掉。

命令别名一般有以下几种使用场景:

1)为比较长或比较复杂的命令设置一个较短的别名,方便记忆和调用

如我们为之前查看系统版本的命令 cat /etc/os-relase 设置一个别名 os_ver,这样直接执行os_ver 就可以查看对应的系统版本了

bash 复制代码
[root@localhost ~]# alias os_ver="cat /etc/os-release"
[root@localhost ~]# os_ver 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"

2)为一些系统命令设置别名,修改默认参数,使其执行更加安全

系统命令 rm 是用来删除文件的,以默认参数执行时,不会对用户进行提示直接删除,而加了 -i 参数后,会在用户进行删除操作时进行提示,待用户确认后再删除。

如前边看到的,系统自带的别名 alias rm='rm -i',覆盖了系统命令 rm,所以用户执行 rm 命令时,就会默认执行带 -i 参数的 rm 命令,从而增加了操作的安全性,防止误删,而我们取消这个别名后,可以看到执行 rm 删除文件时没有任何提示。

bash 复制代码
[root@localhost ~]# alias rm
alias rm='rm -i'
[root@localhost ~]# rm anaconda-ks.cfg 
rm: remove regular file 'anaconda-ks.cfg'? n
[root@localhost ~]# unalias rm
[root@localhost ~]# rm anaconda-ks.cfg 
[root@localhost ~]# 

3)篡改系统命令

这种场景一般是为系统命令设置了别名,在原有命令的基础上增加了一些处理流程,甚至直接执行一些跟原始命令无关的内容。

如病毒程序或流氓软件可以通过设置别名篡改系统命令,实现破坏或病毒植入的目的,比如将系统命令 ls 命令设置成执行一段恶意代码,用户执行该命令时就会变成执行一段恶意代码,如下例所示(echo是一个可以将指定内容输出到终端的命令)

bash 复制代码
[root@localhost ~]# ls
Desktop    Downloads   initial-setup-ks.cfg  Pictures  sudo-1.9.17-2.el7.x86_64.rpm  Videos
Documents  eth01.pcap  Music                 Public    Templates
[root@localhost ~]# alias ls="echo 'do something bad'" 
[root@localhost ~]# ls
do something bad

但这种篡改在某些故障排查的场景也能发挥一些用处,比如我们发现系统中毒了,老是有进程调用 rm命令去乱删东西,但又不知道是哪个进程调的,就可以自定义一个 rm 别名,直接将命令改为打印调用该命令的进程号和父进程号,这样一方面可以阻止 rm 被实际执行,一方面也可以追踪调用 rm 的进程信息:

bash 复制代码
[root@localhost ~]# alias rm="echo 'hit rm! PID=$$,PPID=$PPID'"                           
[root@localhost ~]# rm .bash_history  
hit rm! PID=32414,PPID=32409 .bash_history

总结一下,别名的使用比较灵活,但需要慎用,自定义的别名一般没有明确规范,不方便维护,而为系统命令设置别名会导致命令功能或输出与默认不符,影响应用程序或其它用户的正常调用,需要在明确其使用目的和使用场景的情况下使用。

1.3 几个开胃命令

通过上一节我们大概知道了Bash命令的格式、用法和一些基本特性,下边就再通过几个简单的命令进一步熟悉一下Bash命令的使用。

1.3.1 logout/exit---退出登录

logout 命令可以退出Bash交互界面,退出之后需要重新登录。

exit 命令也有退出登录的功能,但是如果当前是在子Bash进程里,不会直接退出登录,而是退到父Bash进程。

1.3.2 clear---清屏

clear 命令可以将当前终端界面之前输入的命令和输出都清除掉,返回一个干净的Bash交互界面。

1.3.3 shutdown/reboot---关机/重启

shutdown是最常用的关机命令,可以用于关机、定时关机、重启,关机前会自动向所有终端用户发送提醒。通过 --help 参数可以查看其使用帮助:

复制代码
[root@localhost ~]# 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

shutdown常见用法:

复制代码
shutdown          # 安全关机,待所有进程和服务安全退出后关机
shutdown -h now   # 立即关机
shutdown -r now   # 立即重启
shutdown -H       # 调用halt进行关机 
shutdown -P       # 调用poweroff进行断电关机
shutdown -h [hh:mm|+m]   # 定时关机

poweroff 和 halt 命令也可以用于关机,区别是 poweroff 会断电,而且不一定会等待所有进程退出,所以安全性较差,halt 命令关机不一定会断电。

reboot命令则常用于重启系统,也可以添加额外参数,通过 --help 参数查看帮助。

1.3.4 hostname/hostnamectl---查看主机名

每个Linux系统都有一个名称标识,称为主机名,在 Bash 命令提示符中也可以看到(可能不会显示完整的主机名),正常情况下就把它当做一个便于识别的名字就好,在域名服务中会有特殊的用处,通过 hostname 命令可以进行主机名相关的配置。

通过不加参数的 hostname 命令即可看到当前系统的主机名:

复制代码
[root@localhost ~]# hostname 
localhost.localdomain

通过 hostname <name> 可以修改主机名,修改之后重新登录 Bash终端生效,但这种修改方式只是修改了环境变量,临时生效,重启后会失效。

复制代码
[root@localhost ~]# hostname localhost.localdomain
[root@localhost ~]# hostname myserver             
[root@localhost ~]# logout

Last login: Tue Jul 29 17:19:33 2025 from 10.54.15.100
[root@myserver ~]# hostname
myserver

通过 hostnamectl 命令可以永久修改主机名。主机名的配置实际是保存在 /etc/hostname 配置文件中,通过 hostnamectl set-hostname <name> 命令可以把修改后的主机名写入该文件(hostname不会),从而使其在系统重启后仍旧生效。

复制代码
[root@myserver ~]# cat /etc/hostname 
localhost.localdomain
[root@myserver ~]# hostnamectl set-hostname centos7
[root@myserver ~]# cat /etc/hostname               
centos7
[root@myserver ~]# logout

Last login: Tue Jul 29 19:37:20 2025 from 10.54.15.100
[root@centos7 ~]# hostname
centos7

hostname 和 hostnamectl 也支持额外的参数,有需要的话可以通过 -h 参数查看帮助信息。

1.3.5 date/timedatectl---查看和修改系统时间

date 命令可以查看或修改系统的本地时间(标准时间+时区时差)。

date常见用法(--help查看其它用法):

复制代码
[root@localhost ~]# date            # 1、以默认格式输出时间
Tue Jul 29 20:27:53 CST 2025
[root@localhost ~]# date "+%F %T"   # 2、以 [年-月-日 时:分:秒] 的格式输出时间
2025-07-29 20:30:05
[root@localhost ~]# date "+%Y/%m/%d %H:%M:%S"    # 3、以指定的格式输出时间
2025/07/29 20:30:41
[root@localhost ~]# date -s "20250918 10:10:10"  # 4、修改本地时间,输入格式为 [年月日 时:分:秒]
Thu Sep 18 10:10:10 CST 2025

date 命令修改的时间只是临时生效,系统重启后会丢失,要永久修改系统时间可以通过timedatectl 命令实现,

timdatectl 常见用法(-h查看帮助):

复制代码
[root@localhost ~]# timedatectl      # 1、查看时间状态
      Local time: Thu 2025-09-18 10:50:51 CST    # 本地时间
  Universal time: Thu 2025-09-18 02:50:51 UTC    # 标准时间
        RTC time: Tue 2025-07-29 21:30:29        # RTC时间
       Time zone: Asia/Shanghai (CST, +0800)     # 时区
     NTP enabled: yes  
NTP synchronized: no     
 RTC in local TZ: no
      DST active: n/a
[root@localhost ~]# timedatectl set-timezone Asia/Tokyo   # 2、设置时区
[root@localhost ~]# timedatectl set-time "2050-12-24 20:00:00"  # 3、输入格式为 [年-月-日 时:分:秒]
[root@localhost ~]# timedatectl      # 4、查看时间状态
      Local time: Sat 2050-12-24 20:01:57 JST    # 本地时间
  Universal time: Sat 2050-12-24 11:01:57 UTC    # 标准时间
        RTC time: Sat 2050-12-24 11:01:57    # RTC时间
       Time zone: Asia/Tokyo (JST, +0900)    # 时区信息
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

cal 命令还可以查看日历:

1.3.6 echo ---打印字符串或变量值

echo是一个很常用的命令,可以将指定字符串或变量值打印到屏幕(标准输出)上,也可以通过输出重定向将输出内容写入到文件中。

命令格式:echo [参数] [字符串或变量]

常用参数:

**-n:**输出结束后不进行换行

**-e:**对字符串中的转义符进行解析(默认不解析转义字符)

复制代码
[root@localhost ~]# echo "Hello Linux"      # 打印字符串到屏幕
Hello Linux
[root@localhost ~]# echo -e "Hello\nLinux"  # \n 是转义字符,表示换行,添加-e参数解析转义字符
Hello
Linux
[root@localhost ~]# echo "$SHELL"    # 打印变量值,$SHELL是系统的环境变量,记录了当前的shell类型           
/bin/bash
[root@localhost ~]# echo "this is a test" > test.log    # > 是输出重定向符,表示将输出重定向到指定的文件 test.log
[root@localhost ~]# cat test.log    # cat 查看文件中的内容 
this is a test

注:echo 打印的字符串或变量值如果是连续的,可以不加引号,但是如果字符串或变量值中间有空格时必须加双引号,否则解析会有问题。

注:echo 默认不解析字符串中的转义字符(当做普通字符处理),如果需要解析转义字符,务必添加 -e 参数

环境变量和重定向会在后续Bash进阶中进行详细介绍。

相关推荐
dessler14 分钟前
RabbitMQ-镜像队列(Mirrored Queues)
linux·运维·rabbitmq
瑾曦18 分钟前
Docker相关命令
linux
发抖吧小喵喵21 分钟前
rpm包直接安装新系统缺少依赖问题处理
linux·运维·服务器
Asuicao1 小时前
最新docker国内镜像源地址大全
运维·docker·容器
xhdll1 小时前
embodied复现所需docker环境配置粗略流程
运维·docker·容器
码农101号1 小时前
Linux中Docker Swarm介绍和使用
linux·spring cloud·docker
Nazi61 小时前
dockerfile基础
linux·运维·docker·容器·云计算
所念皆为东辞1 小时前
elk部署加日志收集
linux·elk·elasticsearch·centos
TLucas2 小时前
Centos 7部署.NET 8网站项目
linux·nginx·postgresql·centos·.net