【Shell】【Tips】Linux的.bash_profile和.bashrc與子Shell的關係
毫無疑問,.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 --
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux Shell檔案之間的包含關係Linux
- Shell程式設計-11-子Shell和Shell巢狀程式設計巢狀
- Shell:子shell概念
- Linux中vim和shellLinux
- 什麼是shell?Linux常用的shell有哪些?Linux
- Linux的shell環境Linux
- Linux shell:執行shell指令碼的幾種方式Linux指令碼
- Linux ShellLinux
- GNU與Linux 的關係Linux
- Jenkins Tips:去掉pipeline中shell命令的除錯資訊Jenkins除錯
- Linux的bash shell與man檢視手冊Linux
- Linux下Shell日期的格式Linux
- linux常用的shell指令碼Linux指令碼
- 【linux】Shell中的運算子Linux
- Linux系統環境變數檔案解析(etc/profile ,/etc/bashrc ,~/.bash_profile)Linux變數
- Linux的檔案系統與Shell簡單命令Linux
- 獲取有關 Linux shell 內建命令的幫助Linux
- linux shell指令碼中 =~ 的作用Linux指令碼
- [Linux]簡單的shell實現Linux
- Makefile與Shell的問題
- Linux基礎之Shell與變數Linux變數
- 3分鐘tips:高斯分佈和高斯積分的關係
- Linux命令和shell指令碼學習Linux指令碼
- 『忘了再學』Shell基礎 — 2、Shell的作用與分類
- Linux shell日常使用Linux
- Linux Shell變數Linux變數
- Linux Shell指令碼Linux指令碼
- linux Shell 命令列-03-array Shell 陣列Linux命令列陣列
- 什麼是Shell?Linux shell分為幾類?Linux
- Linux shell程式設計(一)shell指令碼中的變數詳解Linux程式設計指令碼變數
- Linux與Shell 第2天 實操、軟體包管理、Shell程式設計Linux程式設計
- Linux的自定製shell提示符Linux
- Linux shell——列印不為0的行Linux
- Linux shell中2>&1的含義Linux
- Linux shell中的那些小把戲Linux
- 2020-12-31 Linux Shell指令碼if else 與或的用法Linux指令碼
- shell 和程式
- 強大好用的shell之shell命令
- 【SHELL】Shell中的條件判斷