要配置环境,首先要弄明白什么是环境。

Linux整体可以分为 三部分:内核、环境、服务。
服务可以理解为直接向用户提供服务的应用程序。那么环境的概念就很明显了,除了内核和服务,其他的都是环境。

再细分的话,环境可以分为两个类型,一种类型是跟配置有关的环境变量,一种类型是用来支撑其他服务运行的应用或者库文件。这两者是密不可分的。
环境变量负责告诉内核,需要的应用或者库文件在哪。而空有应用程序或者库文件,没有相对应的环境变量又毫无意义,因为内核根本不知道去哪取用。

Linux内包含很多配置文件,例如我们常用的环境变量文件 /etc/profile 它里面包含一段代码:

  1. if [ -d /etc/profile.d ]; then
  2. for i in /etc/profile.d/*.sh; do
  3. if [ -r $i ]; then # 枚举了文件夹内所有sh格式的可读文件
  4. . $i # 执行了那些可读文件
  5. fi
  6. done
  7. unset i
  8. fi

这段代码用来在 /etc/profile.d/文件夹内引入更多的文件来帮助定义环境变量。
从这里我们可以看出,

Linux鼓励你自己创建文件管理个性化的配置。

并且类似的例子数不胜数。
所以相应的,我们在定义环境变量的时候,每一个功能相关的内容都可以作为一个单独的文件放在 /etc/profile.d/ 下面,例如Java安装与配置

在后面的几篇文章中将会逐渐展开讲解其他环境相关的配置项。

我们在创建与配置环境变量的时候需要遵循以下几个原则:

  1. 创建独立的文件管理环境变量,尽量不要去更改系统的文件。
  2. 编写脚本时,在开头需要声明解释器。(这一条与下一条稍后进行解释。)
  3. 尽量不要使用类似sh这种可能会产生歧义的命令。
  4. 遵循 KISS 原则(Keep It Simple & Stupid)
  5. 环境变量中不必带版本号,这样便于日后升级,因为大多数应用在查询版本的时候会直接执行命令(例如 java —version),而不是echo $JAVA_HOME。

脚本为什么要声明解释器?

让我先来解释为什么要声明解释器,还有为什么尽量不要使用sh。
在Linux中,如果你想让一个可执行程序不需要进入目录并且直接输入名字就可以执行的时候,你只需要建立一个软连接就可以了。或者有的命令太长了,你想让他变得更短,也可以用软连接和alias。
那么我们经常见到的 sh 到底是什么呢?

  1. $ whereis sh
  2. sh: /usr/bin/sh /usr/share/man/man1/sh.1.gz
  3. $ ll /usr/bin/sh
  4. lrwxrwxrwx 1 root root 4 6 7 2021 /usr/bin/sh -> dash

在 Ubuntu 中,sh 只是 dash 的一个软连接。也就意味着我们在 Ubuntu 中使用sh去执行脚本的时候,如果没有声明解释器,默认使用dash执行。
而在CentOS7中:

  1. [root@localhost ~]# whereis sh
  2. sh: /usr/bin/sh /usr/share/man/man1/sh.1.gz
  3. [root@localhost ~]# ll /usr/bin/sh
  4. lrwxrwxrwx. 1 root root 4 12 3 15:46 /usr/bin/sh -> bash

可以看到在不同发行版本的 Linux 中,默认的 shell 解释器并不相同,他们之间在语法上多多少少都会有一些差异。所以为了不让你的脚本换个环境就报错,尽量不要使用容易混淆或有歧义的命令。
既然我们已经知道了,你所运行的 shell 可能不是你想象中的 shell 。那么

你所运行的命令,可能也不是你想象中的命令。

我们都知道使用 echo 命令可以直接在控制台输出字符串或者变量等等,那么 echo 是什么,向你显示内容的真的是内核么?

  1. $ whereis echo
  2. echo: /usr/bin/echo /usr/share/man/man1/echo.1.gz
  3. $ ll /usr/bin/echo
  4. -rwxr-xr-x 1 root root 39K 9 5 2019 /usr/bin/echo

是的,echo 是一个可以独立运行的应用程序,他的用途如你所见:

  1. $ man echo
  2. ECHO(1) User Commands ECHO(1)
  3. NAME
  4. echo - display a line of text
  5. SYNOPSIS
  6. echo [SHORT-OPTION]... [STRING]...
  7. echo LONG-OPTION
  8. DESCRIPTION
  9. Echo the STRING(s) to standard output.
  10. -n do not output the trailing newline
  11. -e enable interpretation of backslash escapes
  12. -E disable interpretation of backslash escapes (default)
  13. --help display this help and exit
  14. --version
  15. output version information and exit

大家都知道 ll 命令不仅可以显示文件,还可以查看大小、权限、修改时间等信息,而 la 则能显示包括隐藏文件在内的全部文件。那么这两个命令又是什么?

  1. $ whatis ls
  2. ls (1) - list directory contents
  3. $ whatis la
  4. la:没有合适结果。
  5. $ whatis ll
  6. ll:没有合适结果。

其实他们写在了你的环境变量配置文件里:

  1. $ cat .bashrc|grep alias | grep ls
  2. # enable color support of ls and also add handy aliases
  3. alias ls='ls --color=auto'
  4. # some more ls aliases
  5. alias ll='ls -alF'
  6. alias la='ls -A'
  7. alias l='ls -CF'

所以答案显而易见了,shell 根据环境变量的定义来决定如何执行你输入的内容,可能是别名,可能是应用程序。
shell 能做什么,几乎都写在了用户手册里。
shell 能决定的只有如何去做,至于做什么,由调用的应用决定。