《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

-------------------------------------------------如有疑問,敬請留意-----------------------------------------------------

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章