Linux Shell总结
2024-04-16 09:55:41 # 技术

Linux Shell 介绍

Shell(壳或外壳)是操作系统提供给用户与操作系统内核进行交互的界面。用户可以通过 Shell 输入命令、运行程序以及进行文件操作等。在 Unix/Linux 系统中,Shell 是一个命令解释器,它解释用户输入的命令并将其转换成操作系统能够理解的指令,然后传递给内核执行。
Shell 的重要特点和功能如下:

  1. 命令解释器
    • Shell 是一个命令解释器,它解释用户输入的命令并将其转换成系统调用或者其他操作系统能够理解的指令。
  2. 交互式界面
    • Shell 提供了一个交互式界面,用户可以直接在 Shell 中输入命令并获取执行结果。
    • 这使得用户可以直接与系统进行交互,执行各种任务和操作。
  3. 脚本编程
    • Shell 还可以编写脚本文件,其中包含一系列的 Shell 命令,用于自动化任务和程序执行。
    • 这些脚本文件通常以 .sh 扩展名结尾,用户可以通过执行脚本文件来批量执行一系列命令。
  4. 环境变量和别名
    • Shell 提供了环境变量和别名的功能,用于配置用户的工作环境和简化命令输入。
    • 环境变量包括系统级别的变量和用户级别的变量,可以控制程序的行为和系统的配置。
    • 别名允许用户将长命令或者常用命令重命名为简短的别名,方便快速输入和执行。
  5. 管道和重定向
    • Shell 提供了管道和重定向的功能,用于将命令的输出发送到其他命令或者文件中。
    • 管道(|)可以将一个命令的输出作为另一个命令的输入,实现命令之间的串联。
    • 重定向(>>>< 等)可以将命令的输出重定向到文件中,或者从文件中读取输入。
  6. 多种 Shell 实现
    • 在 Unix/Linux 系统中,有多种 Shell 实现可供选择,如 Bash、Zsh、Ksh 等。
    • Bash(Bourne Again Shell)是最常用的 Shell,几乎所有的 Linux 发行版都默认使用它作为默认的 Shell。
    • sh (Bourne Shell): 更古老的 Shell,许多 Unix 系统的基础。
    • csh (C Shell) 和 tcsh (增强型 C Shell):提供了 C 语言风格的语法和命令历史管理。
    • zsh (Z Shell):具有丰富的扩展特性和高用户定制性,近年来也越来越受欢迎。
    • ksh (Korn Shell):结合了 Bourne Shell 和 C Shell 的特点,广泛应用于商业 Unix 系统。

启动和配置

Shell 的启动

系统启动时的 Shell 启动: 当 Linux 系统启动后,init 系统(早期的 System V init 或现代的 systemd)会启动一个或多个用户登录 Shell。在用户登录时,init 系统会根据/etc/passwd 文件中为该用户指定的默认 Shell 来启动一个进程。例如,大多数情况下,用户默认的 Shell 是 Bash,对应的条目可能类似于 username:x:UID:GID:User Info:/home/username:/bin/bash,最后的字段指定了 Shell 的路径。
终端模拟器启动 Shell: 用户通过终端模拟器(如 GNOME Terminal、Konsole、xfce4-terminal 等)打开一个新的终端窗口时,系统也会启动一个新的 Shell 进程。这个 Shell 进程继承了父 Shell(通常是 init 系统的 Shell)的环境,并根据用户个人配置文件进行初始化。
SSH 登录启动 Shell: 当用户通过 SSH 远程登录 Linux 系统时,SSH 服务器会为用户启动一个指定的 Shell 进程,同样参照 /etc/passwd 文件中用户的默认 Shell。

Shell 的配置

  1. 全局配置文件: 全局 Shell 配置文件通常位于 /etc 目录下,如 /etc/profile(对于大多数 Shell),用于设置所有用户登录时的全局环境变量、别名和启动脚本。另外,还有针对不同 Shell 的全局配置,如 Bash 的 /etc/bash.bashrc,Zsh 的 /etc/zsh/zprofile/etc/zsh/zshrc 等。
  2. 用户级配置文件: 用户级 Shell 配置文件存储在用户的家目录(~)中,用于个性化每个用户的 Shell 环境(环境变量、别名、函数):
    • Bash Shell:
      • ~/.bash_profile 或 ~/.bash_login 或 ~/.profile(这三个文件按照顺序查找并执行第一个存在的文件,主要用于交互式非登录 Shell 的环境配置)
      • ~/.bashrc(每当打开一个新的交互式Bash Shell时都会读取,用于设置别名、环境变量等)
    • Zsh Shell:
      • ~/.zshenv(总是会被执行,适合设置不受登录状态影响的环境变量)
      • ~/.zprofile(对于登录 Shell,类似 Bash 的 .profile
      • ~/.zshrc(对于所有的交互式 Shell,不论是否登录)
      • ~/.zlogin(在 .zprofile 之后执行,用于登录 Shell 的附加配置)
  3. 配置文件加载顺序: Shell 启动时,会按照特定的顺序加载这些配置文件。例如,在 Bash 中,登录 Shell 会先加载 /etc/profile,接着加载用户家目录下的个人配置文件(.bash_profile 或 .bash_login 或 .profile),最后加载 .bashrc(如果执行了 Bash 内部命令 bashsource .bashrc)。非登录交互式 Shell 只会加载 .bashrc
  4. 修改默认 Shell: 要更改用户的默认 Shell,可以使用 chsh 命令,如 chsh -s /bin/zsh(将默认 Shell 更改为 Zsh)。更改后,用户下次登录时会启动新的默认 Shell。

source 命令

在 Linux 和类 Unix 操作系统中,source 命令( .,也被称为点命令)是一个用于在当前 Shell 环境中执行脚本或命令文件的工具。当你运行一个 Shell 脚本通常会创建一个新的子 Shell 进程去执行其中的命令,而 source 命令则是直接在当前 Shell 进程中执行脚本里的所有命令,这意味着:

  • 脚本中定义的变量、函数和环境变量变更将会直接影响到当前 Shell 会话。
  • 不需要新开进程,因此不会产生子 Shell 的开销,且执行效率更高。
  • 适用于需要在当前环境下持久化配置更改的情况,比如设置环境变量、alias(别名)或加载shell初始化文件。

使用方法如下:

1
2
source filename.sh
. filename.sh

两种形式的效果是一样的,.source命令的别名。假设有一个名为my_config.sh的脚本,其中包含了一些环境变量设置和函数定义,若想让这些设置生效于当前shell会话,就可以使用source命令:

1
source my_config.sh

这样,my_config.sh 中的所有命令就如同直接在命令行中逐条手动键入一样被执行,并影响当前 Shell 的环境。

export 命令

在 Linux 系统中,export 命令是一个用于设置或更新环境变量的关键命令。环境变量是在系统中全局可用的变量,它们对当前 Shell 及其派生的所有子 Shell 都是可见的。环境变量在执行 Shell 脚本、运行程序和执行命令时提供了一种配置系统行为的方法。
export 命令的基本用途和语法:

  • 设置环境变量: 使用 export 命令,你可以创建一个新的环境变量或将现有的 Shell 变量提升为环境变量。语法如下 export VARNAME=value
  • 修改环境变量: 已经存在的环境变量也可以通过 export 命令修改其值:export VARNAME=new_value
  • 删除环境变量: 要从环境中移除(或取消导出)一个环境变量,可以将其值设为空:export VARNAME= 或使用 -n 参数,例如 export -n VARNAME
  • 显示所有环境变量: 要查看当前 shell 环境中所有已导出的环境变量,可以使用 export -p 命令
  • 持久化环境变量在当前 Shell 会话中设置的环境变量仅对该会话有效。==如果你想让环境变量在每次登录时都自动生效,可以将 export 命令添加到适当的 Shell 配置文件中==,例如对 Bash shell 来说,可以添加到 ~/.bashrc 或 ~/.bash_profile 文件中(Shell 启动时会自动加载这些配置文件)。

注意事项:

  • 子进程会继承父进程的环境变量,也就是说,当你在一个 Shell 中设置了环境变量并通过 fork 创建新的进程时,新进程也将能看到这个环境变量。
  • 环境变量通常以大写字母命名,以区别于普通的 Shell 本地变量。
  • export 命令的影响范围局限于当前 Shell 及其派生的子 Shell。如果你希望改变全局(系统级)的环境变量,通常需要编辑全局配置文件(如 /etc/environment 或者特定服务的启动脚本)。