命令分类

  • 判断命令的类别
# 使用type命令

[Sat Oct 14 08:04:11 4] root@rocky9:~ #type type
type is a shell builtin 
# 出现这个提示,即可判断该命令是内部命令,type本身也是一个内部命令

[Sat Oct 14 08:04:21 5] root@rocky9:~ #type hostname
hostname is /usr/bin/hostname
# 上述提示,即可判断hostname是外部命令
  • 内部命令

    • 概述:指集成在特定shell中的命令,当用户登陆时,会自动启用shell,而对应的shell程序中包含一些常见工具。默认的/bin/bash shell中就集成了很多内部命令,可以通过enable命令查看所有内部命令
    # 通过enable命令查看所有内部命令
    [Sat Oct 14 08:07:33 8] root@rocky9:bin #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 -n <指定命令>
    # 禁用指定内部命令, enable -n是查看禁用的内部命令列表

扩展问题

  • echo是shell内置命令,但是/usr/bin/echo,也存在独立与shell的外部命令echo,存在这个现象的原因

独立的非内置的 echo 存在有几个原因,主要是为了提供兼容性、标准化以及在特定情况下的灵活性。以下是一些具体的原因:

1. 标准化和兼容性
POSIX 标准:/usr/bin/echo 程序通常会遵循 POSIX 或其他相关标准,确保在不同的 Unix-like 系统上有一致的行为。
脚本兼容性:在编写可移植的 shell 脚本时,依赖于标准的 /usr/bin/echo 可能比使用特定 shell 的内置 echo 更可靠。
2. 独立于 Shell
不依赖于特定的 shell:独立的 echo 可以在没有启动 shell 的情况下直接执行,这对于某些脚本或系统程序很有用,尤其是在资源有限或需要避免启动完整 shell 会话的环境中。
3. 特定功能的需要
功能差异:不同的 shell 可能会在其内置的 echo 中实现不同的功能或选项。独立的 /usr/bin/echo 程序提供了一个统一的选项集,这可能在跨不同 shell 环境工作时非常有用。
4. 历史原因
遗留系统:在早期的 Unix 系统中,很多现在被认为是内置命令的工具最初是作为独立的程序存在的。随着时间的推移,为了性能和便利性,许多这样的程序被内置到了 shell 中。但是,独立的版本仍然被保留,以保证兼容性和符合标准。

POSIX标准

POSIX 标准的主要内容包括:
系统调用和库:定义了一系列的 API,包括文件操作、进程控制、线程管理、输入/输出等。

Shell 和工具:规定了 shell 的行为和一些基本的命令行工具,如 ls、echo 和 grep 等。

程序编程接口(API):为 C 语言提供了一套标准的库函数接口,用于实现系统服务。

用户和软件环境:包括了用户环境的配置、软件包管理等方面的标准。

POSIX 标准的意义:
兼容性:POSIX 标准化了 UNIX 系统的核心接口,使得开发者可以编写可在不同 UNIX 系统之间移植的程序。

一致性:通过遵循 POSIX 标准,操作系统厂商可以确保他们的系统提供一致的行为和服务。

可移植性:对于软件开发者来说,POSIX 提供了一套稳定的、不依赖于特定系统的接口,大大提高了代码的可移植性。

在实际应用中,虽然大多数类 UNIX 系统都遵循 POSIX 标准的大部分内容,但很少有系统是完全符合所有 POSIX 规范的。许多系统提供了超出 POSIX 标准的额外功能和扩展,但核心接口和服务通常保持一致。因此,POSIX 标准是理解和使用 UNIX 系统的基础,并且对于确保不同系统之间软件的兼容性和可移植性至关重要。

指令执行过程

1. 先判断是内部命令还是外部命令
2. 如果是内部命令:直接执行
   如果是外部命令:先去hash里找,是否有该命令记录,如果没有,去PATH路径下找,如果还没有,则报错,command not found;如果找到,则直接执行,并将可执行文件的路径记录到hash中
3. 如果hash中有该指令路径,但是该指令路径已经转移,即使转移到了PATH路径下,仍然会报错,不存在该文件/目录,此时应清空hash值,重新执行指令
4. 清空hash值的方法
    更新(更改)PATH路径:会自动清空hash记录
    bash: hash -r
          hash -d <指定路径>
          hash -l 查看hash表详细数据
    csh: rehash
  • 外部命令

    • 概述;所谓外部命令,就是没有集成在shell程序中。具体表现为一个独立的可执行文件。所以外部命令都能在磁盘中找到对应文件
    • 系统查找外部命令的方式:
    • 在系统中有一个叫PATH的变量,里面保存外部命令存放的路径。具体路径可以通过下面命令查看,当执行一个外部命令时,系统会按PATH中存放的目录路径顺序来查找,一旦在某个目录中找到,就停止继续往下找,并执行此外部命令
    [Sat Oct 14 08:15:25 9] root@rocky9:bin #echo $PATH
    /root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
    • 查看外部命令存放路径
    • which
    • whereis:除了命令外,还显示和命令相关的帮助文档等文件路径
    [Sat Oct 14 08:21:50 29] root@rocky9:bin #which gcc
    /usr/bin/gcc
    
    [Sat Oct 14 08:23:59 30] root@rocky9:bin #whereis gcc
    gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz /usr/share/info/gcc.info.gz
    • which和where命令的区别
      which命令找到相关的二进制程序是否已经在搜索路径中
      whereis, 该命令会搜索shell的搜索路径之外更大范围的系统目录
    • 当第一次执行外部命令后,系统会自动将外部的路径记录到内存缓存区中,下次再执行此外部命令,将会从缓存区中找到路径,直接到对应的磁盘路径找到此命令并执行。通过hash命令可以查看到已执行过的外部命令及路径
      [Sat Oct 14 08:24:24 31] root@rocky9:bin #hash
      hits  command
      7      /usr/bin/ls
      3      /usr/bin/whereis
    • shell 的 hash 表机制主要用于跟踪和缓存 $PATH 环境变量指定的目录中找到的命令的位置。非$PATH记录的路径下的程序,执行后也不会记录在hash中
  • 别名

    • 概述:所谓别名,就是将一些常用的内部或外部命令,起一个较短的名称,这样每次执行这些常用命令时,就可以用别名替代
    • 管理和查看别名
    # 查看所有别名
    $ alias
    
    # 查看指定别名
    $ alias 别名
    
    # 定义别名
    $ alias 别名="命令"
    
    # 取消别名
    $ unlias 别名
    • 上述命令都是使别名临时生效,如果要使别名永久生效,需要写入配置文件(.bashrc)中
    • 仅对当前用户有效,写入 ~/.bashrc
    • 对所有人有效,写入 /etc/.bashrc
    • 启用配置文件
      • source 文件名. 文件名
    • 执行和别名相同的命令时,需要 \别名'别名'"别名"command 别名

命令的使用帮助

  • Whatis-查看命令简要说明

    • 概述:Whatis可以快速查看到命令或相关内容的简短功能
    • 注意:在使用whatis之前,需要先使用mandb创建数据库
  • 内部命令的使用帮助

    • help COMMAND
  • 外部命令的使用帮助

    • COMMAND --help | COMMAND -h
  • man帮助

    • 大部分命令对应的手册通常存储在/usr/share/man里,几乎每个外部命令都有man手册
    • man命令的配置文件
    • /etc/man_db.conf
    • man命令的语法格式
    man 命令语法格式;
    man [section] WORD
    格式说明:
    section: 表示1-9的章节数
    1 - 用户命令
    2 - 系统调用
    3 - C库调用
    4 - 设备文件及特殊文件
    5 - 配置文件格式
    6 - 游戏
    7 - 杂项
    8 - 管理类命令
    9 - Linux内核API
    
    WORD:查看帮助的关键字,如:命令,文件名,函数名
    
    man -f COMMAND
    # 如果有多个相同的命令的话,可以使用-f分别进行查看
    # 比如查看C语言的printf和bash命令的printf
    
    man -k [keyword]
    # 查找man手册里的关键词
    • 使用彩色man手册
    sudo apt install most # 使用most打开man
    .bashrc配置文件中,添加
    export MANPAGER="most -s"
    
    # 之后执行source ./.bashrc

less

  • less 也可以实现分页查看文件或STDIN输出,less 命令是man命令使用的分页器

  • 配置(.bashrc)

# 默认man指令分页器
# 配置彩色man页面,使用使用less和groff
# 确保man命令使用less作为分页器。这通常是默认配置,但你可以通过设置MANPAGER或PAGER环境变量来明确指定
export MANPAGER='less -R'
export PAGER='less -R' 
# -R选项告诉less解释颜色编码,这是显示颜色输出的关键

# 指定颜色样式
export LESS_TERMCAP_mb=$(printf '\e[01;31m')       # 开始闪烁
export LESS_TERMCAP_md=$(printf '\e[01;38;5;74m')  # 开始粗体
export LESS_TERMCAP_me=$(printf '\e[0m')           # 结束模式
export LESS_TERMCAP_se=$(printf '\e[0m')           # 结束强调模式
export LESS_TERMCAP_so=$(printf '\e[38;5;246m')    # 开始强调模式
export LESS_TERMCAP_ue=$(printf '\e[0m')           # 结束下划线
export LESS_TERMCAP_us=$(printf '\e[04;38;5;146m') # 开始下划线
  • 命令选项
    • 类似与VIM中的操作

发表评论