【Shell】【Tips】Linux的.bash_profile和.bashrc與子Shell的關係

secooler發表於2009-09-02
毫無疑問,.bash_profile檔案是Linux預設Bash Shell的配置檔案。

1.為了提高DBA維護資料庫的效率,在這個檔案中新增一些個性化的配置是一個非常好的習慣,舉幾個我常用的例子。
1)為了快速動態連續的到alert警告檔案的最後200行內容,可以在.bash_profile檔案中新增如下的同名,這樣就可以簡單的在Shell裡輸入“alert”得到及時的alert資訊了。
alias alert='tail -200f $ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log'

2)為了快速使用vi編輯器編輯網路配置檔案tnsnames.ora,可以在.bash_profile檔案中新增如下的同名,使用方法同上。
alias tnsnames='vi $ORACLE_HOME/network/admin/tnsnames.ora'

3)使用vi編輯習慣使用曾經使用過的命令。
set -o vi

這個配置檔案可以根據自己的操作習慣個性化定製,因人而異,不過宜少不宜多,在設定之後一定要進行測試,防止出現不該有的副作用,這一點我是吃過虧的。
吃虧經歷在此,請勿效尤:《【故障處理】因GREP“花哨”功能導致ORA-12157錯誤的排查過程》http://space.itpub.net/519536/viewspace-613043

2.對於配置檔案的修改是在下一次登陸時生效的,如果想要修改的配置檔案立即生效,有如下幾種方法(效果相同)
ora10g@Tdb /home/oracle$ source .bash_profile
ora10g@Tdb /home/oracle$ . ./.bash_profile
ora10g@Tdb /home/oracle$ . .bash_profile
ora10g@Tdb /home/oracle$ . ~/.bash_profile

3.這個.bashrc檔案是做什麼用的呢?
功能:在啟用子Shell的時候系統讀取配置檔案時.bashrc這個檔案,而不是.bash_profile。

關於子Shell這個概念我舉一個很有趣的例子,這個例子也包含一個我遇到的在運維中操作習慣上一個小問題。

我習慣在.bash_profile檔案中新增“set -o vi”一行,啟用vi編輯習慣編輯並重用曾經使用過的命令。
當我在Oracle的sqlplus命令列介面裡想要暫時退出sqlplus執行一個Shell命令時,我習慣使用“!”或“host”臨時退出到 Shell介面,注意,這是我們進入到的不是登入sqlplus之前的Shell環境,而是一個新的子Shell環境,透過下面的操作過程您就知道確實是不同的Shell環境。

1)先使用“w”命令確定一下只有我一個人登陸在系統上
ora10g@Tdb /home/oracle$ w
 17:20:37 up 11 days, 19:16,  1 user,  load average: 0.02, 0.03, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
oracle   pts/1    10.142.8.207     16:49    0.00s  0.20s  0.00s w

2)使用“$$”這個特殊變數得到當前的shell程式號,這時可以使用“ps”命令確認目前的bash程式資訊,這兩個方法得到的資訊是一致的,這裡都會得到當前的Shell程式號是25431
ora10g@Tdb /home/oracle$ echo $$
25431
ora10g@Tdb /home/oracle$ ps -ef | grep bash | grep -v grep
oracle   25431 25430  0 16:49 pts/1    00:00:00 -bash

3)進入到sqlplus命令列介面
ora10g@Tdb /home/oracle$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.3.0 - Production on Wed Sep 2 17:18:53 2009

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options

sys@ora10g>

4)在sqlplus裡使用“!”或“host”臨時進入到Shell介面,再檢視一下這時的Shell程式號資訊,可以得到不同於上面25431的shell程式號26646
sys@ora10g> !
ora10g@Tdb /home/oracle$ echo $$
26646

5)因為只有我一個人登陸到這系統中,所以可以透過下面的方法同時得到兩個shell的程式資訊,一個是25431,另外一個是26646
ora10g@Tdb /home/oracle$ ps -ef | grep bash | grep -v grep
oracle   25431 25430  0 16:49 pts/1    00:00:00 -bash
oracle   26646 26643  0 17:18 pts/1    00:00:00 /bin/bash

其實關於模擬子Shell還有一個更簡單的方法,就是在Shell介面裡直接鍵入“sh”,就會啟用一個全新的子Shell。我這裡舉得是一個和Oracle資料庫有關的一個真例項子,因人而異吧。

關於子Shell的概念就談這些,下面我以遇到的一個操作習慣類的小問題為例,談一下子Shell不會繼承.bash_profile配置檔案的事實。


4.【解決一個小問題】
我遇到的小問題是:在進入到sqlplus之前我可以使用vi編輯習慣(按Esc然後使用k,j,h,l等鍵來操作歷史命令)來檢索和修改曾經使用過的命令,然而在我以“!”或“host”方式退出到Shell介面後這種習慣不復存在了,不爽哉。原因就在於當進入到子shell後,系統會自動重新讀取.bashrc配置檔案,而不是我們曾經新增了“set -o vi”的.bash_profile配置檔案,因為.bashrc檔案不曾設定過這個操作習慣,所以無法使用這個功能。

到此,解決這個小問題的方法就很簡單了:

方法一:如果想要臨時解決,當然就是在子Shell中直接鍵入“set -o vi”啟用vi編輯習慣,如果再進入另外一個子Shell,還得重新進行設定
方法二:在.bashrc檔案中新增一行“set -o vi”,使之在每次進入到子Shell後都永久生效

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-613812/,如需轉載,請註明出處,否則將追究法律責任。

相關文章