《Linux系统》之"深入浅出"(四)shell环境配置文件和数据流重定向

一、shell环境配置

用户在登录Linux系统后,就会启动bash进行作业。而在bash启动后,会读取与之相关的一些环境配置文件,从而搭建出bash自己的操作环境。还记得我们之前使用的命令别名和自定义的变量吗?这些数据一旦注销/关闭bash后,就会失效。所以,如果你想永久保留你的设置,那么就需要将这些设定写入配置文件中才可以。

这些配置文件,我们可以将他们分为两大类:一类为系统配置文件,一类为用户配置文件。

  • /etc/profile :这个文件是整个系统的配置文件,能不修改就尽量不修改
  • ~/.bash_profile(~/.bash_login 、 ~/.profile )和~/.bashrc:这样的文件是用户的配置文件,在这里可以进行你的设定

1、login shell与non-login shell

shell环境,可根据你取得bash的登录流程来分为:login shell环境和non-login shell环境。

login shell:通过一个完整的登录流程所取得的bash,就处于login shell环境。如 通过终端机tty1~tty6登录,你要输入用户的账号和密码,这种流程取得的bash,就是 【login shell】

non-login shell:  不需要经过登录的行为而取得的bash,就处于non-login shell环境。如在图形化操作界面启动终端,这个终端不需要输入账号和密码,这个bash所处的环境就是non-login shell。或者在终端里,再次使用bash指令而进入的bash子程序,也是属于non-login shell。

为什么要这样分类呢?因为这两种取得bash的情况,他们读取的配置文件各不相同。

2、login shell 会读取什么配置文件吧

login shell 会先读取/etc/profile这个系统配置文件,在这个配置文件中,存在许多系统级别的变量,因此,如果你想修改所有者的工作环境,那就应该在这个文件中进行修改(但是,改之前一定要慎重哦)。常见变量如下:

PATH:会根据UID决定PATH变量中是否要含有sbin的超级管理命令的目录
MAIL:依据账号设定使用者的mailbox到/var/spool/mail/账号名。
USER:根据用户的账号设定变量内容
HOSTNAME:依据主机的hostname指令决定此变量的值
HISTSIZE:历史记录命令的条数,默认是1000条
UMASK:权限的掩码,root为022,一般用户为002

除了这些环境变量的设置外,此配置文件还会读取/etc/profile.d/目录下的众多*.sh文件。这些文件同样有很重要的数据设定。而其中的/etc/profile.d/lang.sh会读取/etc/locate.conf等文件,/etc/profile.d/bash_completion.sh会读取/usr/share/bash_completion/completions/目录下的众多文件等等。总之,/etc/profile这个系统配置文件会读取很多文件,帮助完善bash的工作环境。

当bash读取了系统环境的相关配置信息后,接下来就会读取用户的个人配置文件~/.bash_profile(有的版本叫.bash_login或者叫.profile)。 我们来看看这个文件:

[hyxy@master ~]$ cat .bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then            <==根据判断,是否要读取.bashrc文件
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin                 <==读取用户的个人配置信息

export PATH                          <==导出为环境变量

我们可以看到,在~/.bash_profile文件里根据条件来判断是否要读取另一个文件.bashrc。而变量PATH的值在环境变量的基础上有拼接了主目录下的bin目录,因此,如果用户有自己的个性化设置的话,就可以存储在~/bin目录下,然后使用export再将PATH导出称为环境变量,这样bash环境下也有了用户的个人设置。

这里要注意了,因为/etc/profile 和~/.bash_profile都是在取得login shell时才会读取的配置文件,所以,在这些文件中修改设定后,通常都是需要注销后再登入才会生效的。如果你不想注销再登录,可以使用source命令或者是点(.),不过只针对当前终端生效。

格式: source 文件名

[hyxy@master ~]$ source /etc/profile
[hyxy@master ~]$ .  ~/.bash_profile

3、non-login shell 会读取哪些配置文件呢?

当我们在图形化操作界面上进入终端时,属于non-login shell,仅仅会读取配置文件~/.bashrc。我们先看看此配置文件里的内容:

[hyxy@master ~]$ cat ~/.bashrc 
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then          #根据条件是否要读取/etc/bashrc
	. /etc/bashrc
fi
# User specific aliases and functions

alias lm='ls -al'                  #个人设定,   这个别名是作者我设置的哦

我们可以看到,此配置文件内会读取/etc/bashrc配置文件,因为/etc/bashrc配置文件内有根据不同的UID设置的umask。还有PS1变量及其读取/etc/profile.d/目录的操作。

你的个人设置也可以在~/.bashrc这个配置文件内进行修改,而无需进行注销再登录。(别忘记sourc哦)

有的时候你会发现你的命令行上的提示符变成如此情况:-bash-4.2$。思考一下是什么情况,哈哈与PS1有关哦!想出来了吗?其实是你的.bashrc文件被你不小心删除了,不过别担心,你只需要将/etc/skel/.bashrc复制过来即可。

二、数据流重定向

数据流重定向就是将命令执行后产生的数据从默认显示位置重定向到其他位置,比如重定向到文件或者是设备(如打印机)。这项功能,是很常用的哦,所以,一定要弄会的。

数据流重定向可以分成三类,分别是标准输出STDOUT(standard output)、标准错误输出STDERR(standard error output)及标准输入STDIN(standard input)。

类型 默认位置 代码 符号
标准输出(stdout) 屏幕 1 >   或者   >>
标准错误输出(stderr) 屏幕 2 2>   或者   2>>
标准输入(stdin) 键盘 0 <   或者   <<

1、标准输出(stdout)和标准错误输出(stderr)

标准输出指的是:命令正确执行后所传回的正确的信息。标准错误输出指的是:命令执行失败后,所传回的错误信息。通常情况下,这两种输出都是默认输出到屏幕(显示器)上的。我们看看下面这个例子:

[hyxy@master ~]$ cat ~/.bashrc ~/file1
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi
# User specific aliases and functions
alias lm='ls -al'
cat: /home/hyxy/file1: 没有那个文件或目录                  

使用cat指令查看两个文件,一个是~/.bashrc,一个是~/file1。这就出现了两个输出情况:

  • 标准输出:~/.bashrc文件存在,查看的内容输出到屏幕上
  • 标准错误输出:~/file1这个文件不存在,因此错误信息也是显示在屏幕上

正确的数据和错误的数据都在屏幕上显示,是不是很乱,你可以再试试这个指令操作:find /home -name .bashrc。乱七八糟的,看着都闹心。那么,可不可以将正确的和错误的分开呢。当然可以,这个时候就需要数据流重定向中的标准输出和标准错误输出这两个功能了。

  • 标准输出:使用>或者>>这样的符号,将输出重定向到一个新文件或新设备中。
  • 标准错误输出:可以使用2>或者2>>这样的符号,将输出重定向到一个新文件或者新设备中

应用案例1:修改上面的例子,将正确数据和错误数据分开

[hyxy@master ~]$ cat ~/.bashrc > rightfile  ~/file1 2> errorfile
[hyxy@master ~]$ 

可以看到,正确信息和错误信息都没有在屏幕上显示,我们在看看这两个新文件

[hyxy@master ~]$ cat rightfile 
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi
# User specific aliases and functions
alias lm='ls -al'
[hyxy@master ~]$ 
[hyxy@master ~]$ cat errorfile 
cat: /home/hyxy/file1: 没有那个文件或目录

发现正确信息在文件rightfile里,错误信息在文件errorfile里。而重定向的两个新文件都是自动创建出来的,无需提前创建出来。

我们测试一下>>和>的区别:

第一步:先查看两个重定向文件的大小,一个是51字节,一个是141字节

[hyxy@master ~]$ ll
-rw-rw-r--. 1 hyxy hyxy   51 12月 31 09:31 errorfile
-rw-rw-r--. 1 hyxy hyxy  141 12月 31 09:31 rightfile

第二步:重新执行单个符号(>)的输出重定向后,再查看大小,发现大小没变

[hyxy@master ~]$ cat ~/.bashrc > rightfile ~/file1  2> errorfile
[hyxy@master ~]$ ll
-rw-rw-r--. 1 hyxy hyxy   51 12月 31 09:34 errorfile
-rw-rw-r--. 1 hyxy hyxy  141 12月 31 09:34 rightfile

第三步:执行两个符号(>>)的输出重定向,再查看大小,发现大小翻倍了。

[hyxy@master ~]$ cat ~/.bashrc >> rightfile ~/file1  2>> errorfile
[hyxy@master ~]$ ll
-rw-rw-r--. 1 hyxy hyxy  102 12月 31 09:36 errorfile
-rw-rw-r--. 1 hyxy hyxy  282 12月 31 09:36 rightfile

不需要查看文件里的内容,就可以证明出:

  • >的功能是:先清空文件数据,再重新写数据进去
  • >>的功能是:在原有数据的基础上追加数据

2、垃圾桶黑洞和特殊写法

linux系统专门设置了一个垃圾桶黑洞概念,它可以吃掉所有你不想要的数据。/dev/null就是这个黑洞设置。我们先来查看一下这个文件:

[hyxy@master ~]$ ll /dev/null 
crw-rw-rw-. 1 root root 1, 3 12月 31 08:44 /dev/null

我们来看案例:

[hyxy@master ~]$ find /home -name .bashrc
find: “/home/lost+found”: 权限不够
find: “/home/hyxy/test/dir2/etc/selinux/targeted/modules/active”: 权限不够
................
find: “/home/hyxy/test/dir2/etc/ntp/crypto”: 权限不够
/home/hyxy/test/dir2/etc/skel/.bashrc          <==这是正确信息
/home/hyxy/.bashrc                             <==这是正确信息

上面是查找/home下的所有叫.bashrc的文件。只有两条正确信息,其他都是错误信息,我们将错误信息重定向到黑洞设置里:

[hyxy@master ~]$ find /home -name .bashrc 2>/dev/null
/home/hyxy/test/dir2/etc/skel/.bashrc
/home/hyxy/.bashrc

哇,只有正确信息,错误信息被丢到黑洞里了,没有了恶心的数据,是不是很赞。你可以再查看一下黑洞设置,根本没有什么变化。

我们也可以通过 这样的写法:2>&1  或者是 &>  将正确和错误信息都重定向到一个文件中。
案例1:

[hyxy@master ~]$ find /home -name .bashrc >message 2>&1

案例2: 

[hyxy@master ~]$ find /home -name .bashrc &>message

3、标准输入(stdin)

标准输入,默认是从键盘输入数据的,我们使用cat指令和>符号来测试一下,

[hyxy@master ~]$ cat > newfile             <==newfile会自动被创建  默认开启了键盘输入功能
welcome to china                                   <==下面这些数据都是有键盘输入的
this is a test
                                                              <== Ctrl  + d 快捷键结束键盘输入
[hyxy@master ~]$ cat newfile               
welcome to china
this is a test                                            <== 这些数据都是刚才键盘输入的数据

而符号 < 可以将键盘输入重定向到文件(啥意思呢?说白点,就是数据的来源不是键盘了,而是一个已经存在的文件)。看案例:

[hyxy@master ~]$ cat >newfile < .bash_profile           <==修改标准输入为.bash_profile
[hyxy@master ~]$ cat newfile                              <==查看newfile,眼熟不
# .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  

理解了吧!!!!

我们再来看看<<的用法:

<<用来指定结束输入的字符标识。对字符标识没有要求,什么字符都可以,比如EOF,aaa,haha都行。上一个案例我们是通过 Ctrl +d 来结束输入的。这次我们使用<<

[hyxy@master ~]$ cat > newfile << EOF
> this is a test
>  test <<
> haha
> EOF
[hyxy@master ~]$ cat newfile     <==查看文件newfile
this is a test
 test <<
haha

-------------------------------------------------如有疑问,敬请留意-----------------------------------------------------

猜你喜欢

转载自blog.csdn.net/Michael__One/article/details/85340440