一、  Linux环境变量

   Linux系统中,当系统启动后会将一些系统信息赋值给一些特定的字符并保存到内存中,这些特定的字符被称为环境变量,因为很多系统程序在执行过程中要读取这些变量信息,如环境变量PATHPATH环境变量中保存着可执行命令的目录位置,当我们在命令行执行一个命令时,系统会根据PATH指定的目录去找这个命令,如果找到接着会执行,如果没有做配置,系统会提示错误信息。

1.1   环境变量的概念

    环境变量用来保存系统环境信息和用户工作环境中一些特定的信息,使用环境变量可以将我们需要的信息保存到内存,在系统生命周期内运行的程序或脚本都可以访问到。环境变量按定义者可以分为两类,一类是系统默认设置的环境变量,如:PATH。另一类是用户特定的环境变量,如:JAVA_HOME。环境变量通常使用大写字母并且变量名不能重复,如果重复,后面变量的赋值会覆盖前面的赋值。

另外,环境变量按可见性也可以分为两类:一类是全局变量,也就是声明全局变量的脚本和此脚本所有子脚本都可以访问。另一类是局部变量,只在创建变量的脚本中是可见的,当脚本执行结束,变量也同时销毁。这里需要注意的是系统环境变量中也分为全局环境变量和局部环境变量,与后面章节讲到的用户全局环境变量和用户局部变量还是有一些区别的。

对于Linux系统默认设置的全局环境变量可以通过命令printenv查看:

命令:

printenv

 

控制台显示:

HOSTNAME=YARN

SHELL=/bin/bash

HADOOP_HOME=/usr/local/hadoop

HISTSIZE=1000

JRE_HOME=/usr/local/jdk1.8.0_51/jre

USER=yarn

CLASS_PATH=.:/usr/local/jdk1.8.0_51/lib:/usr/local/jdk1.8.0_51/jre/lib:/usr/local/hadoop/lib

USERNAME=yarn

PATH=/usr/local/jdk1.8.0_51/bin:/usr/local/jdk1.8.0_51/jre/bin:/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yarn/bash01:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/home/yarn/bin:/home/yarn/bash01

LZD=/home/yarn/.bashrc

QT_IM_MODULE=ibus

PWD=/home/yarn/bash02

JAVA_HOME=/usr/local/jdk1.8.0_51

HOME=/home/yarn

LOGNAME=yarn

OLDPWD=/home/yarn

 

    可以看到很多大写变量名称和他们的值,这些值大多数是用户登录系统时设置并保存到内存的并且系统中所有的进程都可以访问包括用户程序进程。

要想显示单个变量的值,可以通过echo命令和$符,如下:

命令:

echo $USER

yarn

 

    而系统局部环境变量只能在定义他们的脚本中或进程中可以访问到,包括这些进程的子进程。这和用户局部变量也是存在区别的,因为用户程序进程执行结束后,这些变量就不存在了,而系统局部变量定义的进程的生命周期和系统的生命周期相同,所以启动这些进程中的子进程是可以访问到这些系统局部变量的,系统局部变量可以通过set命令显示,但是这些变量是不同进程中的局部变量。

命令:

set

 

控制台输出:

BASH=/bin/bash

HADOOP_HOME=/usr/local/hadoop

HISTCONTROL=ignoredups

HISTFILE=/home/yarn/.bash_history

HOME=/home/yarn

HOSTNAME=YARN

HOSTTYPE=i386

IFS=$'  \t\n'

JAVA_HOME=/usr/local/jdk1.8.0_51

JRE_HOME=/usr/local/jdk1.8.0_51/jre

LANG=zh_CN.utf8

LOGNAME=yarn

OLDPWD=/home/yarn

PATH=/usr/local/jdk1.8.0_51/bin:/usr/local/jdk1.8.0_51/jre/bin:/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yarn/bash01:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/home/yarn/bin:/home/yarn/bash01

PIPESTATUS=([0]="0")

PPID=3054

PWD=/home/yarn/bash02

UID=500

USER=yarn

USERNAME=yarn

 

printenv命令输出的全局环境变量在set命令中也都输出了,所以set命令输出流所有的系统环境变量。

1.2      设置环境变量

    系统环境变量通常不需要用户来设置,当用户登录系统时,系统环境变量会由系统自动加载到内存,但是PATH系统环境变量在有些情况下需要用户手动设置,如JAVA_HOME。所以,大多数情况下设置环境变量是针对用户特定环境下来讲的。

 

1.2.1       设置用户局部变量

   设置局部环境变量可以通过变量名=值的形式进行设置,但是需要注意的是等号的两端

不能存在空格。另外,变量的值也不能存在空格,如果存在空格,需要使用双引号,如

下:

变量说明:

变量赋值

说明

var =  abc

错!等号两端不能存在空格

var=abc

var=abc  d  ef

错!值的中间有空格

var="abc  d  ef"

var='abc  d  ef'

 

   引用环境变量需要使用$符,如$var。用户的局部变量通常用小写字符串声明,用于区别

全局环境变量。局部变量只能在当前进程中可见,如果创建另一个进程,这个变量就不

可见了,如下:

$  var1="Hello bash shell"

$  var2=100

$ echo  $var1

Hello bash shell

$ echo  "$var1"

Hello bash shell

$ echo $var2

100

$ echo "$var2"

100

$ echo '$var2'

$var2

# 重新启动一个Shell进程

$ bash

$ echo "$var1"

 

$ echo "$var2"

 

# 退出当前Shell进程,回到父进程

$ exit

exit

$ echo  "$var1"

Hello bash shell

$ echo  "$var2"

100

 

    bash命令会在当前Shell进程中启动一个新的子进程,exit命令会结束当前进程并回到启

动此进程的父进程中,所以在父进程中声明的局部变量只能在父进程是可见的,在子进

程中不可见。当执行exit命令后,子进程结束并返回父进程,所以父进程中的局部变量

又可见了。

 

1.2.2       设置用户全局变量

   全局环境变量在创建他的进程中和此进程启动的所有子进程中都是可见的,创建全局变量需要用到命令exportexport命令会将变量保存到内存,下面修改上面的例子说明全局变量设置和特点。

$ var1="Hello bash shell"

$ var2=100

$ export var1

$ export var2

$ echo  "$var1"

Hello bash shell

$ echo "$var2"

100

# 打开一个新的子进程

$ bash

$ echo "$var1"

Hello bash shell

$ echo "$var2"

100

#结束子进程

$ exit

$ echo "$var1"

Hello bash shell

$ echo "$var2"

100

 

   export命令将变量保存到内存,所以在子进程中是可以访问到的。

1.2.3       删除环境变量

   删除环境变量需要使用unset命令,命令将变量删除掉,如下:

$ var1="Hello bash shell"

$ var2=100

$ echo "$var1"

Hello bash shell

$ echo "$var2"

100

$  unset var1

$ unset  var2

$ echo "$var1"

 

$ echo "$var2"

 

 

   创建两个变量并赋值后,使用unset命令将变量的删除,再访问变量时返回空值。

需要注意的是在子进程中删除全局变量后只在子进程中有效,父进程中变量依然存在,如下:

$ var="Hello bash shell"

$ export var

$ bash

$ echo "$var"

Hello bash shell

# 在子进程中删除变量

$ unset var

$ echo "$var"

 

# 退出子进程

$ exit

exit

$ echo "$var"

Hello bash shell

 

1.2.4       PATH环境变量

   PATH环境变量定义了命令行输入命令的搜索路径。通常情况下会将可执行文件的目录设置到PATH变量中,当执行命令时,系统会从变量PATH中的目录开始寻找命令并执行。那么如何设置PATH环境变量呢!下面通过例子说明:

$ echo "$PATH"

/usr/local/jdk1.8.0_51/bin:/usr/local/jdk1.8.0_51/jre/bin:/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yarn/bash01:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/home/yarn/bin:/home/yarn/bash01

$ PATH=$PATH:/home/yarn/bash02

$ echo "$PATH"

/usr/local/jdk1.8.0_51/bin:/usr/local/jdk1.8.0_51/jre/bin:/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yarn/bash01:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/home/yarn/bin:/home/yarn/bash01:/home/yarn/bash02

 

   这样设置PATH,注意:当重启系统后/home/yarn/bash02目录不会在PATH变量中,所以通常将PATH变量设置在文件中,当系统启动后会执行这些文件,而不用每次通过手动设置环境变量。

   例子:在当前目录下创建一个简单的脚本文件,在当前目录下执行系统可以找到文件并执行,但是在其他目录下执行此脚本系统则提示命令找不到。然后将当前目录的完整路径设置到环境变量PATH中,

   脚本文件print01.sh,使用vi编辑器编辑。

echo "Hello Linux"

echo $name

 

  在终端测试过程:

# 切换到脚本文件的目录

[yarn@YARN ~]$ cd class02

[yarn@YARN class02]$ ls

print01.sh

# 执行脚本

[yarn@YARN class02]$ bash print01.sh

Hello Linux

 

[yarn@YARN class02]$ bash ./print01.sh

Hello Linux

 

[yarn@YARN class02]$ cd ..

[yarn@YARN ~]$ bash print01.sh

-bash: print01.sh: command not found

[yarn@YARN ~]$  PATH=$PATH:/home/yarn/class02

[yarn@YARN ~]$ bash print01.sh

Hello Linux

 

 

   例子:重新打开远程工具,使用yarn用户登录,目的是将环境变量PATH还原。先切换到脚本所在的目录后,首先执行bash命令重启一个shell进程,那么echo $SHLVL命令执行后应该是2,切换到其他目录,执行bash print01.sh脚本,提示命令找不到,然后设置环境变量PATH,将脚本所在的目录添加到PATH中,切换到其他目录,执行bassh print01.sh脚本,可以执行。执行bash命令启动一个新的shell进程,执行print01.sh脚本,可以执行。然后执行两次exit命令,推到设置PATH环境变量的上一个shell进程,执行print01.sh脚本,不能执行,说明变量只能在当前进程和子进程中才有效。


 

   例子:当前shell进程中设置局部变量name=zhangsan,执行print01.sh脚本,变量name的值没有输出到控制台,变量name的值不能访问到,因为执行脚本会重启一个shell进程,父进程中的局部变量在子进程中不能访问到。然后采用另一种方式在当前shell进程中执行print01.sh脚本,.print01.shsource print01.sh,局部变量name的值可以访问到,因为点命令或source命令执行脚本时,不会重启一个新的shell进程,还在当前进程中执行,所以局部变量name可以访问到。


 

1.3     Linux中设置环境变量的几个文件

    系统环境变量可以让用户的程序或脚本获得系统信息,大多数系统环境变量不需要用户设置,当用户登录系统或启动一个Bash Shell解释程序时,系统会根据用户信息设置大多数系统环境变量,如:当前登录用户USER等等。而用户可以根据自己的需求设置自己特定的环境变量,搭建自己的系统环境。在Linux系统中,可以设置环境变量的文件有几个,当用户登录Linux系统或启动一个Bash Shell时,默认情况下,这几个可配置文件会首先执行,所以这几个配置文件可以为每个登录用户开启一个可配置的系统环境。但是需要注意的是,这几个可配置文件的执行时机和顺序是不同的,下面我们根据不同的情况说明。

1.3.1       登录系统时启动默认Shell进程

   当用户登录Linux系统时,系统会默认启动一个登录Shell进程,这个进程主要是初始化

系统环境并且会按照一定的顺序执行几个可配置脚本文件,这些可配置文件都是可以执行的脚本文件。执行的顺序是:

1.      /etc/profile

2.      ~/.bash_profile

3.      执行顺序如图:

   

Linux学习笔记(三)——Linux_环境变量_第1张图片

/etc/profile配置文件是系统默认的Bash Shell进程主启动文件,系统上的每个用户登录系统时都会被执行一次,并且只执行一次。另外一个文件属于用户级别的,每个用户可以根据不同需求定制自己的系统环境。不同的Linux发行版本这个文件略不相同,我们当前的Linux版本存在的是~/.bash_profile文件,下面对两个文件的内容做一些介绍。

/etc/profile

#  /etc/profile

# System wide environment and startup programs, for login  setup

# Functions and aliases go in /etc/bashrc

 

# It's  NOT a good idea to change this file unless you know what you

# are doing. It's much better to create a  custom.sh shell script in

#  /etc/profile.d/ to make custom changes to your environment, as this

# will prevent the need for merging in  future updates.

 

pathmunge  () {

    case ":${PATH}:" in

        *:"$1":*)

            ;;

        *)

            if [ "$2" =  "after" ] ; then

                PATH=$PATH:$1

            else

                PATH=$1:$PATH

            fi

    esac

}

 

 

if [ -x  /usr/bin/id ]; then

    if [ -z "$EUID" ]; then

        # ksh workaround

        EUID=`id -u`

        UID=`id -ru`

    fi

    USER="`id -un`"

    LOGNAME=$USER

    MAIL="/var/spool/mail/$USER"

fi

 

# Path  manipulation

if [  "$EUID" = "0" ]; then

    pathmunge /sbin

    pathmunge /usr/sbin

    pathmunge /usr/local/sbin

else

     pathmunge /usr/local/sbin after

    pathmunge /usr/sbin after

    pathmunge /sbin after

fi

 

HOSTNAME=`/bin/hostname  2>/dev/null`

HISTSIZE=1000

if [  "$HISTCONTROL" = "ignorespace" ] ; then

    export HISTCONTROL=ignoreboth

else

    export HISTCONTROL=ignoredups

fi

 

export PATH USER LOGNAME MAIL HOSTNAME  HISTSIZE HISTCONTROL

 

# By  default, we want umask to get set. This sets it for login shell

#  Current threshold for system reserved uid/gids is 200

# You  could check uidgid reservation validity in

#  /usr/share/doc/setup-*/uidgid file

if [  $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ];  then

    umask 002

else

    umask 022

fi

 

for i in /etc/profile.d/*.sh ; do

     if [ -r "$i" ]; then

         if [ "${-#*i}" != "$-" ]; then

             . "$i"

         else

            . "$i" >/dev/null  2>&1

         fi

     fi

done

 

unset i

unset  -f pathmunge

 

/etc/profile配置文件中设置并导出的环境变量在登录Shell进程创建的所有子进程都可以访问。另外需要注意的是一个for循环,这个循环主要是循环执行/etc/profile.d目录下的所有的.sh结尾的脚本文件。

~/.bash_profile配置文件在用户的工作目录下,每个用户有一个。这个文件是用户专属的启动文件主要用来定义用户专有的环境变量。

~/.bash_profile

#  .bash_profile

# Get  the aliases and functions

if [ -f ~/.bashrc ]; then

       .  ~/.bashrc

fi

 

# User  specific environment and startup programs

 

PATH=$PATH:$HOME/bin

 

export PATH

 

1.3.2       非登录启动的新Shell进程

   如果Shell进程不是登录时启动的,是通过命令行执行bash命令启动的Shell进程。通常称作交互式Shell进程,交互式进程和登录系统时启动默认Shell进程有所不同,不会执行/etc/profile~/.bash_profile文件,但是会执行~/.bashrc脚本文件。

   ~/.bashrc

#  .bashrc

#  Source global definitions

if [ -f /etc/bashrc ]; then

       .  /etc/bashrc

fi

 

# User  specific aliases and functions

 

   .bashrc脚本的作用是检查/etc/bashrc脚本是否存在,并执行此脚本。另外可以定义用户自己的命令别名。或定义一些特有的变量。

   /etc/bashrc

#  /etc/bashrc

    # Only display echos from profile.d  scripts if we are no login shell

    # and interactive - otherwise just  process them to set envvars

    for  i in /etc/profile.d/*.sh; do

         if [ -r "$i" ]; then

             if [ "$PS1" ]; then

                . "$i"

             else

                . "$i"  >/dev/null 2>&1

             fi

         fi

     done

 

    unset i

    unset pathmunge

fi

#  vim:ts=4:sw=4

 

   注意:启动一个新的交互Shell进程或子Shell进程都会执行当前用户的~/.bashrc脚本文件。

1.3.3       执行脚本时启动的新Shell进程

   当系统执行Bash脚本时启动的就是非交互Shell进程,这种进程默认情况下不会执行上面提到的脚本文件,但是可以根据需求动态指定要执行的脚本文件,这个系统变量是BASH_ENV,默认情况下次变量没有指定任何文件,如果通过此变量指定了要执行的配置文件,那么在执行脚本时,会首先执行指定的脚本文件然后执行脚本。可以将环境变量BASH_ENV配置到用户的.bashrc文件中,当用户执行脚本时会先执行变量指定的脚本。

   例子:在.bashrc文件中或.bash_profile文件中添加BASH_ENV环境变量。

#  .bash_profile

 

# Get  the aliases and functions

 

echo  ".bash_profile"

BASH_ENV=/home/yarn/linux/class03/b1/init01.sh

 

if [ -f  ~/.bashrc ]; then

        . ~/.bashrc

fi

 

# User  specific environment and startup programs

 

PATH=$PATH:$HOME/bin:/home/yarn/b2

export  PATH

 

1.4     安装JDK

    我们之后安装的Hadoop本身就是用Java语言编写的,在运行计算程序时需要存在Java环境,也就是要在Linux系统上安装并配置JDKLinux系统发行版本已经安装了其他版本的JDK,虽然可以使Java程序正常的工作,但是还是建议使用Sun提供的JDK。另外, Hadoop2.0版本以上要求LinuxJDK版本在1.6及以上。我们安装1.8的版本。安装之前,首先将Linux系统预安装的JDK删除

   通过命令删除预安装的JDK版本

rpm -qa | grep java

rpm -e --nodeps 文件名

 

   用命令java -version检查是否已经卸载

   安装JDK

cd  /usr/local

tar -xzvf  jdk-8u51-linux-i586.tar.gz

 

   解压完成后在/usr/local目录下多了一个jdk1.8.0.51目录,注意JAVA_HOME就是JDK的安装目录/usr/local/jdk1.8.0.51

   配置环境变量的第一种方式:用root用户登录配置环境变量

vi /etc/profile

 

   profile配置文件最后添加一下内容:

export JAVA_HOME=/usr/local/jdk1.8.0_51

export JRE_HOME=/usr/local/jdk1.8.0_51/jre

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

export CLASS_PATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

  

   为了确保JAVA_HOME配置生效,运行profile脚本

source /etc/profile

或者

. /etc/profile

 

   在控制台输入javajavac命令检查JDK是否安装成功。

 

   配置环境变量的第二种方式:

   /etc/profile.d目录下创建一个脚本文件,如:java.sh,在脚本中添加下面的配置信息保存并退出,因为/etc/profile配置文件在执行式会将/etc/profile.d目录下的*.sh文件都执行一遍,同样可以是配置生效。

export JAVA_HOME=/usr/local/jdk1.8.0_51

export JRE_HOME=/usr/local/jdk1.8.0_51/jre

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

export CLASS_PATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

 

   如果为JDK配置的单独的配置文件,那么在/etc/profile文件中的配置信息就可以删除掉了,我们建议使用第二种方式,Liunx系统核心的配置文件我们尽量不要修改和添加信息,为每一个需要配置环境变量的应用创建一个单独的配置文件,便于维护,修改和删除都不会影响原有的核心配置文件。

同样为了确保JAVA_HOME配置立即生效,运行profile脚本

source  /etc/profile

或者

. /etc/profile

 

   在控制台输入javajavac命令检查JDK是否安装成功。

1.4.1       Linux系统上执行Java程序

   Linux系统下执行Java程序,第一种情况是不带包名的Java程序。

java LinuxTest01

 

第二种情况是带包名的Java程序。

java com.weixin.java.LinuxTest02

 

第三种情况是打成jar包的Java程序。

java -jar LinuxTest03.jar

 

   对于第三种情况,需要在jar文件中做一些配置,要对META-INF目录下MANIFEST.MF文件进行配置,指明有main()方法的Java程序名称,如下:

Manifest-Version: 1.0

Main-class:  com.weixin.java2.LinuxTest03

 

1.5     数组变量

    在Linux中可以声明变量数组,数组可以在一个变量中保存多个值,对于数组变量来说,可以对数组变量单值引用也可以对整个数组变量进行引用。声明一个数组变量要用圆括号将多个值包括起来,并且值和值之间要使用空格分隔,声明一个数组变量的语法格式如下。

$  array=(first second third fourth)

 

    使用圆括号内的值要用空格分隔,上面声明的数组变量有四个值。需要注意的是对数组变量内容的提取方式和普通变量是不同的,如下所示。

$ echo  $array

first

 

    可以看到,对数组采用通常的方式,显示的内容只有数值中第一个值。所以对于数组变量来说,要引用数组中的某个单独的值要采用这个值在数组中的索引,并使用方括号将索引值包括起来,如下所示。

$ echo ${array[*]}

first  second third fourth

$ echo ${array[2]}

third

$ echo ${array[0]} ${array[1]} ${array[3]}  ${array[4]}

first  second fourth

 

    如果使用*号,将显示数组中所有的元素。需要注意的是数组的索引从0开始,索引为0的值是数组中的第一值,数组中如果有n个值,数组的索引从0n-1,如果数组的索引超出范围,将显示空,如${array[4]}返回的是空。可以将数组变量赋值给另一个数组变量,但是要注意的是不能简单的方式,如下所示。

$  array_bak=$array

$ echo  ${array_bak[*]}

first

 

    可以看到,采用普遍变量赋值的方式只能将数组中的第一个元素赋值给变量。采用下面的方式将一个数组变量赋值给另一个变量。注意:下面的例子是将数组中的所有元素组成一个字符串变量赋值给一个普通变量,如下所示。

$ array_bak=${array[*]}

$ echo  $array_bak

first  second third fourth

$ echo  ${array_bak[2]}

 

 

    变量array_bak是一个普通的变量,这个变量的值是一个字符串,同数组下标的方式访问第三个元素返回为空。

将数组变量中的某个元素赋值给一个变量需要用到数组元素的索引号,如下所示。

$ var1=${array[2]}

$ echo $var1

third

 

可以对数组变量中的某个值进行修改,需要采用数组索引的方式,如下所示。

$  array[2]=Hello

$ echo  ${array[*]}

first  second Hello fourth

$  array[4]=fifth

$ echo  ${array[*]}

first  second Hello fourth fifth

 

    对数组变量采用索引的方式进行赋值,会将之前的值覆盖掉,要注意。也可以采用这种方式为数组变量增加元素,需要明确的是数组中已存在元素的个数和对应的索引号,如果索引错误,将会出现覆盖之前的值。

Linux系统中,数组变量的使用较为复杂,如果操作不当,会出现取值错误,如下例子。

$ echo  ${array[*]}

first  second Hello fourth fifth

$  array[6]=Bash

$ echo  ${array[*]}

first  second Hello fourth fifth Bash

$ echo  ${array[5]}

 

 

    数组变量array已存在五个元素,下标从0~4对应数组中的五个元素,注意:下面直接为数组变量的第七个元素进行赋值,数组中的第六个元素为空。显示数组的全部元素时很难判断某个元素为空,当显示第五个元素的值时,控制台显示空。

删除数组变量中的某个元素使用命令unset,同样采用索引的方式,但是要注意,删除元素后,数组中保存元素的空间还存在,只是值为空。如下。

$ echo  ${array[*]}

first  second third fourth fifth

$ unset  array[2]

$ echo  ${array[*]}

first  second fourth fifth

$ echo  ${array[2]}

 

 

    数组中有五个元素,删除了第三个元素后,显示数组的内容很难判断数组中哪个下标的元素为空,采用下标的方式访问被删除的元素时,显示为空。同样可以使用unset命令将数组变量中的值清空,如下。

$ unset  array

$ echo  ${array[*]}

 

 

可变数组变量在实际的脚本中很少使用。有几个环境变量采用的是数组的方式声明。

1.6     命令别名

    在Linux中可以为一个完整的命令和相关参数设置一个别名,通过别名可以执行与命令相同的效果,这样可以减少命令行输入方便操作。在Linux的发行版本中默认设置了几个命令的别名,可以通过命令alias -palias命令查看,如下。

$ alias -p

alias l.='ls -d .* --color=auto'

alias  ll='ls -l --color=auto'

alias ls='ls --color=auto'

alias vi='vim'

alias  which='alias | /usr/bin/which --tty-only --read-alias --show-dot  --show-tilde'

 

可以使用alias命令定义自己的命令别名,如下例子。

$ alias hlog='cd /usr/local/hadoop/logs'

$ pwd

/home/yarn

$ hlog

$ pwd

/usr/local/hadoop/logs

 

    上面例子定义了一个命令的别名hlog,是切换到Hadoop的日志目录,定义了别名后,就可以在Shell进程和脚本中使用了,但是要注意,定义的别名与局部变量相同,只能在定义的别名的Shell进程中可以使用,如下说明。

注:定义别名显示/etc/profile配置文件内容到控制台

$ alias catPf='cat /etc/profile'

注:执行命令别名,下面打印文件内容到控制台,

$ catPf

#  /etc/profile

 

#  System wide environment and startup programs, for login setup

#  Functions and aliases go in /etc/bashrc

 

# It's  NOT a good idea to change this file unless you know what you

# are  doing. It's much better to create a custom.sh shell script in

#  /etc/profile.d/ to make custom changes to your environment, as this

# will  prevent the need for merging in future updates.

注:在当前Shell进程中启动一个新的Shell子进程

$ bash

注:执行命令别名,可以看到命令找不到,说明定义的命令别名与局部变量相同,

    只能在定义别名的Shell进程中才可见

$ catPf

bash:  catPf: command not found

注:终止子Shell进程并回到定义别名的Shell进程(父进程)

$ exit

exit

注:执行别名,没问题,找到了

$ catPf

#  /etc/profile

 

#  System wide environment and startup programs, for login setup

#  Functions and aliases go in /etc/bashrc

 

# It's  NOT a good idea to change this file unless you know what you

 

    如果想将定义的别名在所有的Shell进程中可用,通常可以将命令别名定义在.bashrc文件中,这样登录的用户就可以在所有的Shell进程和脚本中可以使用定义的命令别名了。因为配置文件.bashrc会在启动一个Shell进程时提前执行,如下所示。

.bashrc

#  .bashrc

 

#  Source global definitions

if [ -f  /etc/bashrc ]; then

        . /etc/bashrc

fi

 

# User  specific aliases and functions

 

# 定义命令别名vpf,用vi编辑器打开/etc/profile配置文件

# 在此文件中定义的命令别名会在所有启动的Shell进程或脚本中访问

# 注意:只有当前用户启动的Shell进程和运行的脚本中可以访问

alias vpf='vi  /etc/profile'

 

命令别名调用:

注:重新执行配置文件使配置生效

$ .  .bashrc

注:调用别名,会用vi编辑器打开/etc/profile配置文件

$ vpf

重启一个Shell进程

$ bash

调用命令别名还可以打开/etc/profile配置文件

$ vpf

退出当前进程

$ exit

exit

 

1.7     umask文件创建时的权限的缺省模式

       当用户登录系统中时,umask命令会确定用户创建文件时的权限缺省模式。这一命令和

chmod命令正好相反。通常情况下系统管理员root要为普通用户设置一个合理的umask值,确保用户在创建文件时具有合理的缺省权限,防止其他非同组用户对你的文件具有写权限。

用户登录以后,可以使用umask命令来改变文件创建时的缺省权限。但是这个设置将在退出系统时失效。umask命令是在/etc/profile文件中设置,每个用户在登录时都会执行这个文件,所以如果希望改变所有用户的umask,只有root用户才可以进行修改。

如果用户希望设置自己的umask值,可以在.bash_profile文件中进行设置。


   1.7.1       如何设置umask

       通过umask命令可以设定文件创建时的缺省模式,对于每一类用户(文件属主、同组用户、

其他用户)都存在一个相应的umask值中的数字。对于文件来说,这一数字的最大值为6。因为系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后使用用chmod命令在增加执行权限。目录允许设置执行权限,所以对于目录来说,umask中各个数字最大可以到7

命令格式如下:

umask nnn

 

  nnn的取值范围从000~777,下表中是umask值对应的权限位。

   表:umask值和权限位的对应值

umask

文件位值

文件

目录位置

目录

说明

0

110

000

110

6

111

000

111

  7

创建文件最大权限为6,默认没有执行权限,所以执行位被忽略。

1

   110

  001

  110

  6

111

001

110

  6


2

   110

  010

  100

  4

 111

 010

 101

  5


3

   110

  011

  100

  4

 111

 011

 100

  4


4

   110

  100

  010

  2

 111

 100

 011

  3


5

   110

  101

  010

  2

 111

 101

 010

  2


6

   110

  110

  000

  0

 111

 110

 001

  1


7

   110

  111

  000

  0

 111

 111

 000

  0


 

   举例:

文件权限

rwxrwxrwx

 777


umask002

- - - - - - -w-

 002

异或方式

目录

rwxrwxr-x

 775

目录最大值为7,有执行权限

文件

rw-rw-r--

 664

文件最大值为6,没有执行权限(系统默认)

umask022

- - - - w - -w-

 022


目录

rwxr-xr-x

 755


文件

rw-r--r--

 644