[轉自LINUXEDEN]shell入門絕佳!(三)

newdayhope發表於2006-04-28
第五篇:bash 配置檔案/提示符/改變 $PATH

一、bash 配置檔案

在您的 home 目錄下,執行

ls .bash*


您將看到這些檔案:


l .bash_history :記錄了您以前輸入的命令,
l .bash_logout :當您退出 shell 時,要執行的命令,

l .bash_profile :當您登入 shell 時,要執行的命令,

l .bashrc :每次開啟新的 shell 時,要執行的命令。

請注意後兩個的區別:'.bash_profile'只在會話開始時被讀取一次,而'.bashrc'則每次開啟新的終端(如新的 xterm 視窗)時,都要被讀取。按照傳統,您得將定義的變數,如 PATH ,放到'.bash_profile'中,而象 aliases(別名)和函式之類,則放在'.bashrc'。但由於'.bash_profile'經常被設定成先讀取'.bashrc'的內容,您如果圖省事的話,就把所有配置都放進'.bashrc'。

這些檔案是每一位使用者的設定。系統級的設定儲存在'/etc/profile'、'/etc/bashrc'及目錄'/etc/profile.d'下的檔案中。但您得習慣用各自的配置檔案:編輯不需要'root'許可權,還可以使您的設定更有個性。當系統級與使用者級的設定發生衝突時,將採用使用者的設定。


讀取'.bashrc'的內容,您如果要省點事的話,就把您所有的配置都放進'.bashrc'。

上面的這些檔案是每位使用者的設定,系統級的設定儲存在'/etc/profile'、'/etc/bashrc'及目錄'/etc/profile.d'下的檔案中。您最好習慣使用各自的配置檔案:編輯不需要'root'許可權,還可以使您的設定更具個性。當系統級與使用者級的設定發生衝突時,將優先採用使用者的設定。

二、提示符
每次當您開啟一個控制檯(console)或 xterm 時,最先看到的就是提示符(prompt),類似於:
account@hostname ~ $


在預設設定下,提示符將顯示您的使用者名稱、主機名(預設是'localhost')、當前所在目錄(在 Unix 中,'~'表示您的 home 目錄)。

按照傳統,最後一個字元可以標識您是普通使用者($),還是'root'(#)。
您可以透過 $PS1 變數來設定提示符。命令
echo $PS1

將顯示當前的設定。其中可用字元的含義在 man bash 的'PROMPTING'部分有說明。

如何才能完成理想的設定呢?對於健忘的初學者來講,預設設定有些不友好,因為提示符只顯示當前目錄的最後一部分。如果您看到象這樣的提示符
tom@localhost bin $

您的當前目錄可能是'/bin'、'/usr/bin'、'/usr/local/bin'及'/usr/X11R6/bin'。當然,您可以用
pwd (輸出當前目錄,print working directory)

能不能叫 shell 自動告訴您當前目錄呢?

當然可以。這裡我將提到的設定,包括提示符,大都包含在檔案'/etc/bashrc'中。您可以透過編輯各自 home 目錄下的'.bash_profile'和'.bashrc'來改變設定。

在 man bash 中的'PROMPTING'部分,對這些引數(parameter)有詳細說明。您可以加入一些小玩意,如不同格式的當前時間,命令的歷史記錄號,甚至不同的顏色。


在'~/.bashrc'中,我喜歡的設定是:

PS1="[33[1m][w][33[0m] "

'root'在'~/.bashrc'中的設定 是:


PS1="[33[0;31m][w][33[0m] "


這樣我得到的提示符就是:

[/usr/bin]


當用'root'時,變成:
[/usr/bin]

我已經除掉了主機名和使用者名稱,因為我用不著這些。但我首先想一眼就能看出我的身份是普通使用者還是'root'。注意到,普通使用者的提示符可以是黑底白字,或白底黑字。
要在終端上獲得恰當的顏色調配, 您可以編輯下面這個指令碼color ,賦予執行許可權(chmod +x color),然後再執行。
#!/bin/bash

#
# This file echoes a bunch of color codes to the
# terminal to demonstrate what's available. Each

# line is the color code of one forground color,
# out of 17 (default + 16 escapes), followed by a

# test use of that color on all nine background
# colors (default + 8 escapes).

#
T='gYw' # The test text
echo -e "n 40m 41m 42m 43m
44m 45m 46m 47m";
for FGs in ' m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' ' 32m'
'1;32m' ' 33m' '1;33m' ' 34m' '1;34m' ' 35m' '1;35m'
' 36m' '1;36m' ' 37m' '1;37m';
do FG=${FGs// /}
echo -en " $FGs 33[$FG $T "

for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
do echo -en "$EINS 33[$FG33[$BG $T 33[0m";
done
echo;
done
echo

一種更適當的設定:
PS1="u: w$ "

這樣,提示符就變成:

user_name: /usr/bin$

您可以透過命令 export 來測試不同的設定(比如,export PS1="u: w$ ")。如果找到了適合的提示符,就將設定放到您的'.bashrc''中。這樣,每次開啟控制檯或終端視窗時,都會生效。

您甚至可以給提示符設定主題(theme),也就是搭配不同的顏色,使其看起來象很棒的 ol
的 C64 提示符。如果您對此感興趣,可以看一下

Bashish( )。
三、改變 $PATH
'$PATH'與'$PS1'一樣,也是環境變數。輸入
set


將列出所有當前定義的環境變數。

您看到的這些環境變數在 shell 的配置檔案中定義,可能是使用者自己的配置檔案,也可能是由'root'透過'/etc'下面的系統級檔案定義的。如果您使用 X ,更多的一些變數將由 X 、您的視窗管理器或桌面環境的啟動檔案配置。
如果對這些設定不很清楚,您暫時最好不要隨便改動。瞭解如何改變 $PATH 變數很有用,因為這個變數決定了 shell 將到哪些目錄中尋找命令或程式。如果要執行的命令的目錄在 $PATH 中,您就不必輸入這個命令的完整路徑,直接輸入命令就可以了。一些第三方軟體沒有將可執行檔案放到 Linux 的標準目錄中。因此,將這些非標準的安裝目錄新增到 $PATH 是一種解決的辦法。此外,您也將看到如何處理一般的環境變數。

首先,作為慣例,所有環境變數名都是大寫。由於 Linux 區分大小寫,這點您要留意。當然,您可以自己定義一些變數,如'$path'、'$pAtH',但 shell 不會理睬這些變數。

第二點是變數名有時候以'$'開頭,但有時又不是。當設定一個變數時,您直接用名稱,而不需要加'$':

PATH=/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin
要獲取變數值的話,就要在變數名前加'$':
echo $PATH
/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin


否則的話,變數名就會被當作普通文字了:
echo PATH
PATH
處理 $PATH 變數要注意的第三點是:您不能只替換變數,而是要將新的字串新增到原來的值中。在大多數情況下,您不能用'PATH=/some/directory',因為這將刪除 $PATH 中其他的所有目錄,這樣您在該終端執行程式時,就不得不給出完整路徑。所以,只能作新增:

PATH=$PATH:/some/directory
這樣,PATH 被設成當前的值(以 $PATH 來表示)+新添的目錄。
到目前為止,您只為當前終端設定了新的 $PATH 變數。如果您開啟一個新的終端,執行 echo $PATH ,將返回舊的 $PATH 值,而看不到您剛才新增的新目錄。因為您先前定義的是一個區域性環境變數(僅限於當前的終端)。
要定義一個全域性變數,使在以後開啟的終端中生效,您需要將區域性變數輸出(export),可以用'export'命令:
export PATH=$PATH:/some/directory


現在如果您開啟一個新的終端,輸入 echo $PATH ,也能看到新設定的 $PATH 了。請注意,命令'export'只能改變當前終端及以後執行的終端裡的變數。對於已經執行的終端沒有作用。

為了將目錄永久新增到您的 $PATH ,只要將'export'的那行新增到您的'.bash_profile'檔案中。

請不要在'.bashrc'中設定 PATH ,否則會導致 PATH 中目錄的意外增長。您每次開啟一個新的 shell ,'.bashrc'都會作用。所以如果在該檔案中新增目錄,您每次開啟一個終端,目錄又會被新增。這將導致 PATH 變數由於目錄複製,不斷地增長。


第六篇:命令的別名、Shell 函式/從這裡出發/Shell 常見問題
一、命令的別名、Shell 函式

記住所有的命令及各自帶的可選項,然後每次一一輸入,這確實有點枯燥。但幸運的是,您可以為常用命令定義快捷方式。這些快捷方式可以用較簡單的命令別名(alias),或複雜一些的 shell 函式的語法來定義。


1、命令的別名

例如,我用下面的命令來上傳 MUO 中的檔案:

rsync -e ssh -z -t -r -vv --progress /home/tom/web/muo/rsmuo/docs muo:/www/mandrakeuser/docs



顯然,如果每次都要逐一輸入,那我早晚會變成木頭。因此我在'~/.bashrc'中定義了別名:

alias upmuo='rsync -e ssh -z -t -r -vv --progress /home/tom/web/muo/rsmuo/docs muo:/www/mandrakeuser/docs'

現在,我只要輸入 upmuo 就可以完成上傳任務了。


定義別名的語法是:

alias shortcut='command'

命令中有空格的話 ,就需要用引號(如在命令與可選項間就有空格)。請注意,您可以用單引號或雙引號,但他們是有區別的。

單引號將****其中的所有字元的特殊含義,而雙引號中的'$'(引數替換)和'`'(命令替換)是例外。這意味著,如果您想在別名中應用變數或命令的替換,就得用雙引號。看一下上面的例子,我在'.bashrc'中定義了一個稱為 MUOHOME 的變數:



export MUOHOME=$HOME/web/muo/rsmuo/docs


要在上面的別名中用上這個變數,我就必須用雙引號:
alias upmuo="rsync -e ssh -z -t -r -vv --progress $MUOHOME muo:/www/mandrakeuser/docs"


否則,別名將查詢一個名為'$MUOHOME'的目錄或檔案。


您可以用'alias'在命令列快速地建立別名,或將命令放到各自的'~/.bashrc',或放到系統級的'/etc/profile.d/alias.sh'中(而在 Mandrake Linux 8 以前的版本里,用的是'/etc/bashrc')。要刪除一個別名,只要輸入:unalias alias 。執行 alias 將列出您系統中所有定義的別名。

如果看一下'~/.bashrc'和'/etc/profile.d/alias.sh',您會發現系統已經定義了一些別名。您可以為同一個命令定義多個別名。當然,您得先確認別名與其他程式名不同,比如象 alias rm='ls -l' 這樣的就不能工作。您可以在命令列輸入這些快捷方式,測試一下。如果 shell 找不到相同名稱的命令,那您就可以將其用作別名了。


以下別名可能有用(不要忘了引號!) :
l alias rpmq='rpm -qa | grep' :現在 rpmq string 就將列出所有名稱中含有 string 的已安裝 RPM 包,

l alias ls='ls -ho --color | more' :ls 將以彩色分頁方式列出檔案,檔案大小以 KB為單位,

l alias use='du --max-depth=1 | sort -n | more' :use 將子目錄按大小排好,並以分頁方式列出,

目錄的別名也可以是可移動的介質:alias dlm='/mnt/cdrom/RedHat/RPMS/' 。
提示:將有相似功能的別名以相同字母開頭,比如將所有目錄的別名以'd'作開頭,這樣有助於記憶。

我相信,您將會用到這些功能。

2、Shell 函式

寫 shell 函式涉及到了 shell 指令碼,這超出了我們討論的範圍(也不在我的掌握範圍之內 ;-))。事實上,shell 函式屬於 shell 指令碼,但可以在同一 shell 下被預載入(preload)和執行(而一般的 shell 指令碼至少要開啟一個 sub-shell)。

透過 shell 函式,您可以做很多 aliases 無法完成的事情。下面就是一個例子:
function apros() { apropos $1 | egrep -v '(3|(n)'; }


定義了一個新命令,稱為'apros'。apros name 將先執行'apropos name'(即在 man page 中搜尋命令),然後將得到的輸出送到管道(|),接著用'egrep'過濾,排除第'3'和第'n'章節的 man page ,這個命令可能沒什麼大用處,但可以整理'apropos'命令的輸出。

函式允許您在函式內部任何位置,使用執行時的引數。而別名,則只允許在命令列尾放一個引數(比如前面的別名'rpmq')。

'$1'就是位置引數(positional parameter),表示函式第一個引數的位置識別符號。依此類推,還有'$2'等。

function apros() { apropos $1 | egrep -v "($2"; }


如果您這樣執行'apros'命令:

apros name man_section_number


這個命令將搜尋標題中含 name 的 man pages ,但排除 man_section_number 部分:
apros menu 3

將搜尋標題含'menu'的 man page ,但排除第三章節(關於程式設計的)。注意到您得引用(quote) 兩次,而且還用到了雙引號:

l 您必須引用'egrep'的搜尋模式,這樣可以不至於被 shell 誤解。

l 您必須用雙引號,這樣第二個引數才能被正確解釋。
l 您必須引用圓括號,這樣使'egrep'按字面意思對待對待引數。

是不是有點意思?;-)

shell 函式的處理類似於別名:將其放到您的'.bashrc'檔案,這樣就能永久生效了。


二、從這裡出發

我們談到的只是 shell 的一個開頭。掌握了shell 指令碼,您就可以做很多事情,比如將任務自動化,糾正別人指令碼中的錯誤,按照您的習慣定製 Linux 系統。如果您打算學習某種複雜的程式語言,那 shell 指令碼也是一個很好的開端,因為基本概念都是類似的。

BASH Programming - Introduction HOW-TO:



將更深入這些主題,並且將把您帶到 shell 程式設計的世界。然後可以繼續閱讀我強烈推薦的 Advanced Bash-Scripting Guide( ),作者是:Mendel Cooper 。

如果您偏好紙書,那我推薦 S. Veeraraghavan 的《Teach Yourself Shell Programming》,Sams 出版社。我倒覺得 O'Reilly 公司由 Newham/Rosenblatt 寫的《Learning the bash Shell》,不過爾爾,但這可能只有我這麼看 ;-) 。

除了這些,就是練習,練習,再練習。閱讀其他人寫的 shell 指令碼,看看他們在做什麼,怎麼做,為什麼那樣做。


請不要用'root'測試您的指令碼。Have fun[@more@]

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

相關文章