在与Linux打交道的过程中经常会遇到配置shell环境的情况,以往总是莫名遇到各种问题反复查资料,现理清原理思路,总结配置方法,避免再遇到类似情况处理起来低效无绪。

1.shell环境分类

首先从是否交互是否登录两个方向区分shell环境:

是否交互是否登录
shell等待用户输入,根据输入实时返回运行结果在命令中需要输入用户和密码,或者参数指定login条件
以脚本方式执行命令,逐行执行后即退出shell环境无需输入用户和密码就可以进入的shell

以此可以将shell环境分为四种:

  • 交互式登录
    eg:
    ssh远程连接获取shell
    bash --login运行的shell
    su -l user输入密码后进入的shell

  • 非交互式登录
    eg:
    以脚本文件方式登录的shell

  • 交互式非登录
    eg:
    在gnome、kde等桌面环境直接打开shell
    su user输入密码后进入的shell

  • 非交互式非登录
    eg:
    以脚本文件方式直接执行shell命令

2.shell初始化脚本

shell环境初始化脚本分为profilebashrc两类,不同的shell环境执行的初始化脚本有所不同,具体如下:

  • 交互式登录 / 非交互式登录
    1./etc/profile:为系统的所有用户设置环境信息,存在则执行/etc/bashrc 或 /etc/bash.bashrc脚本。
    2.~/.profile 或 ~/.bash_profile:配置特定用户的环境信息,存在则执行~/.bashrc 或 ~/bash.bashrc脚本。
    profile初始化文件用于配置系统环境,如系统路径PATH、自定义环境变量、alias命令别名等。当用户重新登录后生效,也可以用source.执行脚本,这样配置会在当前shell环境生效。

  • 交互式非登录
    1./etc/bashrc 或 /etc/bash.bashrc:为系统所有运行bash shell的用户配置运行环境
    2.~/.bashrc:配置专属用户的bash shell运行环境,交互式非登录条件下执行
    rc意为run command,即运行一个软件的初始化命令,vimrc即用于配置vim的运行环境,bashrc即用于配置bash shell的运行环境,rc和profile本质上都是脚本文件,设置的内容可以相同,只是应用于不同的交互和登录shell环境。重新打开一个shell即可生效,也可以用source.执行脚本生效。

  • 非交互式非登录
    不执行初始化文件,子shell和新建shell默认都不会继承当前父shell的环境变量,父shell中配置的环境变量要想在子shell中生效,变量定义时要用export限定(export只影响子shell的环境信息)

3.执行命令区分

不同的命令执行环境不同,相应的环境变量、传递参数也不一样,在执行命令时要加以区分。

在当前shell中执行的命令:

  • source script
  • . script
  • bash -c command
  • $(command)
  • `command`

开启子shell运行的命令:

  • ./script
  • bash script

开启新shell运行的命令:

  • 在gnome、kde等桌面环境新打开的shell
Logo

更多推荐