什麼是Shell?
shell是你(用戶)和Linux(或者更準確的說,是你和Linux內核)之間的接口程序。你在提示符下輸入的每一個命令都由shell先解釋而後傳給Linux內核。
shell 是一個命令語言解釋器(command-language interpreter)。擁有本身內建的 shell 命令集。此外,shell也能被系統中其餘有效的Linux 實用程序和應用程序(utilities and application programs)所調用。
不論什麼時候你鍵入一個命令,它都被Linux shell所解釋。一些命令,好比打印當前工做目錄命令(pwd),是包含在Linux bash內部的(就象DOS的內部命令)。其餘命令,好比拷貝命令(cp)和移動命令(rm),是存在於文件系統中某個目錄下的單獨的程序。而對用戶來講,你不知道(或者可能不關心)一個命令是創建在shell內部仍是一個單獨的程序。
shell 首先檢查命令是不是內部命令,不是的話再檢查是不是一個應用程序,這裏的應用程序能夠是Linux自己的實用程序,好比ls 和 rm,也能夠是購買的商業程序,好比 xv,或者是公用軟件(public domain software),就象 ghostview。而後shell試着在搜索路徑($PATH)裏尋找這些應用程序。搜索路徑是一個能找到可執行程序的目錄列表。若是你鍵入的命令不是一個內部命令而且在路徑裏沒有找到這個可執行文件,將會顯示一條錯誤信息。而若是命令被成功的找到的話,shell的內部命令或應用程序將被分解爲系統調用並傳給Linux內核。
shell的另外一個重要特性是它自身就是一個解釋型的程序設計語言,shell 程序設計語言支持在高級語言裏所能見到的絕大多數程序控制結構,好比循環,函數,變量和數組。shell 編程語言很易學,而且一旦掌握後它將成爲你的得力工具。任何在提示符下能鍵入的命令也能放到一個可執行的shell程序裏,這意味着用shell語言能簡單地重複執行某一任務。
shell 如何啓動?
shell在你成功地登陸進入系統後啓動,並始終做爲你與系統內核的交互手段直至你退出系統。你係統上的每位用戶都有一個缺省的shell。每一個用戶的缺省shell在系統裏的passwd文件裏被指定,該文件的路徑是/etc/passwd。passwd文件裏還包含有其餘東西:每一個人的用戶ID號,一個口令加密後的拷貝和用戶登陸後當即執行的程序,(注:爲了增強安全性,如今的系統通常都把加密的口令放在另外一個文件--shadow中,而passwd中存放口令的部分以一個x字符代替)雖然沒有嚴格規定這個程序必須是某個Linux shell,但大多數狀況下都如此。
最經常使用的shell:
在Linux 和 UNIX系統裏可使用多種不一樣的shell可使用。最經常使用的幾種是 Bourne shell (sh), C shell (csh), 和 Korn shell (ksh)。三種shell 都有它們的優勢和缺點。Bourne shell 的做者是 Steven Bourne。它是 UNIX 最初使用的shell 而且在每種 UNIX 上均可以使用。Bourne shell 在 shell 編程方面至關優秀,但在處理與用戶的交互方面做得不如其餘幾種 shell。
C shell 由 Bill Joy 所寫,它更多的考慮了用戶界面的友好性。它支持象命令補齊(command-line completion)等一些 Bourne shell 所不支持的特性。廣泛認爲C shell 的編程接口作的不如 Bourne shell, 但 C shell 被不少 C 程序員使用由於 C shell的語法和 C語言的很類似,這也是C shell名稱的由來。
Korn shell (ksh) 由 Dave Korn 所寫。它集合了C shell 和 Bourne shell 的優勢而且和 Bourne shell 徹底兼容。
除了這些 shell 之外,許多其餘的 shell 程序吸取了這些原來的 shell 程序的優勢而成爲新的 shell 。在 Linux 上常見的有 tcsh (csh 的擴展),Bourne Again shell(bash, sh 的擴展), 和Public Domain Korn shell (pdksh, ksh 的擴展)。bash 是大多數Linux 系統的缺省 shell。
The Bourne Again Shell
Bourne Again shell (bash), 正如它的名字所暗示的,是 Bourne shell 的擴展。bash 與 Bourne shell 徹底向後兼容,而且在 Bourne shell 的基礎上增長和加強了不少特性。bash 也包含了不少 C 和 Korn shell 裏的優勢。bash 有很靈活和強大的編程接口,同時又有很友好的用戶界面。
爲何要用 bash 來代替 sh 呢?Bourne shell 最大的缺點在於它處理用戶的輸入方面。在 Bourne shell 裏鍵入命令會很麻煩,尤爲當你鍵入不少類似的命令時。而 bash 準備了幾種特性使命令的輸入變得更容易。
命令補齊(Command-Line Completion)
一般你在 bash (或任何其餘的 shell)下輸入命令時你沒必要把命令輸全 shell 就能判斷出你所要輸入的命令。例如,假定當前的工做目錄包含如下的文件和子目錄:
News/ bin/ games/ mail/ samplefile test/
若是你要進入 test 子目錄,你將會輸入如下的命令:
cd test
這個命令可以知足你的須要,但 bash還提供了稍微不一樣的方法來完成一樣的事。由於 test 是當前目錄裏惟一以字母 t開頭的子目錄,bash在你只輸入字母 t後就能判斷出你要作什麼了:
cd t
在你鍵入那個字母后,惟一的可能就是 test 。想讓 bash 幫你結束命令的話,按下 Tab 鍵:
cd t<tab>
當你這樣作之後,bash 將幫你補齊命令並顯示在屏幕上。但在你按下回車鍵之前命令並無被執行,bash 會讓你檢驗補齊的命令是不是你真正須要的。在輸入象這樣短的命令時你也許看不出它的價值所在,甚至在命令很短時還會簡慢輸入的速度,可是當你要輸入的命令有點長時,你會發現這個特性是多麼的美好。
可是當目錄裏有不止一個以字母 t 開頭的文件時會發生什麼狀況呢?在你使用命令補齊時會有問題,讓咱們看看下面的狀況,當前目錄裏有下列內容:
News/ bin/ mail/ samplefile test/ tools/ working/
如今這個目錄裏有兩個以字母 t 開頭的文件。假設你仍然想進入 test 子目錄,如何使用命令補齊呢?若是你象先前那樣鍵入:
cd t<tab>
bash 將不知道你到底想進入哪一個子目錄,由於給出的信息並不惟一。若是你這樣作了的話,bash 將發出一聲蜂鳴提醒你沒有足夠的信息來補齊你的命令。蜂鳴以後bash 並不改變輸入的命令,這將使你能在原來的基礎上再輸入更多的信息,在這個例子中你僅需再鍵入一個 e 並再按一下 Tab 鍵,這時 bash 就有足夠的信息來完成你的命令了:
cd test
當你輸入命令時不論什麼時候按下 Tab 鍵,bash 都將盡其所能地試圖補齊命令,不行的話會發出蜂鳴來提醒你須要更多的信息。你須要鍵入更多的字符,並再次按下 Tab 鍵,重複這個過程直至你指望的命令出現。
通配符
另外一個使命令輸入變得更簡單的方法是在命令中使用通配符。bash 支持三種通配符:
* 匹配任何字符和任何數目的字符
? 匹配任何單字符
[...] 匹配任何包含在括號裏的單字符
* 通配符的使用有些象命令補齊。例如,假設當前目錄包含如下文件:
News/ bin/ games/ mail/ samplefile test/
若是你想進入 test 目錄,你將鍵入 cd test, 或者你想用命令補齊:
cd t<tab>
如今有第三種方法來作一樣的事。由於僅有一個文件以字母 t 開頭,你也能用 * 通配符來進入該目錄。鍵入下列命令:
cd t*
* 匹配任何字符和任何數目的字符,因此 shell 將把 t* 替換爲 test(當前目錄裏惟一和通配方案匹配的文件)。當前目錄裏只有一個文件以字母 t 開頭的話這將是可靠的。可是若是當前目錄裏有不止一個文件以字母 t 開頭,shell 將試着進入第一個符合匹配方案的目錄,這個目錄是以字母表排序的第一個目錄,這個目錄也許是也許不是你所指望的。
通配符 * 的一個更實際的用途是通配你要執行的命令中的多個名字類似的文件。例如,假設當前目錄裏包含如下文件:
ch1.doc ch2.doc ch3.doc chimp config mail/ test/ tools/
若是你須要打印全部擴展名是 .doc 的文件,你能使用象這樣簡化的命令:
lpr *.doc
在這個例子中,bash 將把 *.doc 替換爲當前目錄下全部文件名符合通配方案的文件。在 bash 進行了替換後,該命令將被處理爲:
lpr ch1.doc ch2.doc ch3.doc
lpr 命令將以ch1.doc, ch2.doc, 和 ch3.doc爲參數被調用。
--------------------------------------------------------------------------------
注意: 除了以上給出的例子外,還有幾種方法:
lpr *doc
lpr *oc
lpr *c
--------------------------------------------------------------------------------
通配符 ? 除了只能匹配單個字符外,其餘功能都與通配符 * 相同,若是用通配符 ? 來打印前面提到的那個目錄裏全部擴展名是 .doc 的文件的話,鍵入下面的命令:
lpr ch?.doc
通配符[...]能匹配括號中給出的字符或字符範圍。一樣之前面的目錄爲例,打印那個目錄裏全部擴展名是 .doc 的文件,你能夠鍵入下列命令之一:
lpr ch[123].doc
或者:
lpr ch[1-3].doc
命令歷史記錄
bash 也支持命令歷史記錄。這意味着 bash 保留了必定數目的你先前已經在shell 裏輸入過的命令。這個數目取決於一個叫作HISTSIZE的變量。有關 HISTSIZE 的更多信息,請看本文後面的「bash 變量」一節。
bash 把你先前輸入的命令文本保存在一個歷史列表中。當你用你的賬號登陸後歷史列表將根據一個歷史文件被初始化。歷史文件的文件名被一個叫 HISTFILE 的 bash變量指定。歷史文件的缺省名字是 .bash_history。這個文件一般在你的用戶目錄($HOME)中。(注意該文件的文件名以一個句號開頭,這意味着它是隱含的,僅當你帶 -a 或 -A參數的 ls 命令列目錄時纔可見)
僅將先前的命令存在歷史文件裏是沒有用的,因此 bash 提供了幾種方法來調用它們。使用歷史記錄列表最簡單的方法是用上方向鍵。按下上方向鍵後最後鍵入的命令將出如今命令行上。再按一下則倒數第二條命令會出現,以此類推。若是上翻多了的話也能夠用向下的方向鍵來下翻。(和 DOS 實用程序doskey同樣)若是須要的話,顯示在命令行上的歷史命令能夠被編輯。
另外一個使用命令歷史文件的方法是用 bash 的內部命令 history 和 fc(fix 命令)命令來顯示和編輯歷史命令。history 命令能以兩種不一樣的方法來調用。第一種是:
history [n]
當 history 命令沒有參數時,整個歷史命令列表的內容將被顯示出來。下面是一個命令歷史列表的例子:
1 mkdir /usr/games/pool
2 cp XpoolTable-1.2.linux.tar.z /usr/games/pool
3 cd /usr/games/pool/
4 ls
5 gunzip XpoolTable-1.2.linux.tar.z
6 tar -xf XpoolTable-1.2.linux.tar
7 ls
8 cd Xpool
9 ls
10 xinit
11 exit
12 which zip
13 zip
14 more readme
15 vi readme
16 exit
使用 n 參數的做用是僅有最後 n 個歷史命令會被列出。例如,history 5 顯示最後 5 個命令。
調用 history 命令的第二種方法用於修改命令歷史列表文件的內容。命令的語法以下:
history [-r|w|a|n] [filename]
這種形式中,-r 選項告訴 history 命令讀命令歷史列表文件的內容而且把它們看成當前的命令歷史列表。-w 選項將把當前的命令歷史記錄寫入文件中並覆蓋文件原來的內容。-a 選項把當前的命令歷史記錄追加到文件中。-n 選項將讀取文件中的內容並加入到當前歷史命令列表中。若是 filename 選項沒有被指定,history 命令將用變量HISTFILE 的值來代替。
fc 命令能用兩種方法來編輯歷史命令。第一種使用下列語法:
fc [-e editor_name] [-n] [-l] [-r] [first] [last]
這裏全部參數都是可選的。-e editor_name 選項用來指定用於編輯命令的文本編輯器。 first 和 last 選項用於選擇列出歷史命令的範圍,既能夠是數字也能夠是字符串。-n 選項禁止列出命令的編號。-r 選項反向列出匹配的命令。-l 選項把匹配的命令行列在屏幕上(而不是在編輯器中)。若是-e editor_name參數沒有被指定,則以變量FCEDIT的值來代替,若是該變量不存在的話,則用變量EDITOR的值來代替,都不存在的話將使用vi編輯器。
別名
bash 的另外一個使你的工做變得輕鬆的方法是命令別名。命令別名一般是其餘命令的縮寫,用來減小鍵盤輸入。例如,你常常要鍵入以下的命令,你也許會傾向於爲它創建一個別名來減小工做量:
cd /usr/X11/lib/X11/fvwm/sample-configs
假如爲這個長命令創建一個名爲goconfig的別名,在bash提示符下鍵入以下命令:
alias goconfig='cd /usr/X11/lib/X11/fvwm/sample-configs'
如今,除非你退出bash,鍵入goconfig將和原來的長命令有一樣的做用。若是想取消別名,可使用下面的命令:
unalias goconfig
這是一些不少用戶認爲有用的別名,你能夠把它們寫入你的.profile文件中提升工做效:
alias ll='ls -l'
alias log='logout'
alias ls='ls -F'
若是你是一名DOS用戶而且習慣了DOS命令,你能下面的別名定義使你的 Linux 表現得象DOS 同樣:
alias dir='ls'
alias copy='cp'
alias rename='mv'
alias md='mkdir'
alias rd='rmdir'
注意: 在定義別名時,等號的兩頭不能有空格,不然 shell 不能決定你須要作什麼。僅在你的命令中包含有空格或特殊字符時才須要引號.
若是你鍵入不帶任何參數的alias命令,將顯示全部已定義的別名,例如:
alias dir='ls'
alias ll='ls -l'
alias ls='ls -F'
alias md='mkdir'
alias net='term < /dev/modem > /dev/modem 2> /dev/null&'
alias rd='rmdir'
輸入重定向
輸入重定向用於改變一個命令的輸入源。一些命令須要在命令行裏輸入足夠的信息才能工做。好比 rm,你必須在命令行裏告訴 rm 它你要刪除的文件。另外一些命令則須要更詳細的輸入,這些命令的輸入多是一個文件。好比命令 wc 統計輸入給它的文件裏的文件裏的字符數,單詞數和行數。若是你僅在命令行上鍵入 wc <enter> ,wc 將等待你告訴它要統計什麼,這時 bash 就好象死了同樣,你鍵入的每樣東西都出如今屏幕上,但什麼事也不會發生。這是由於 wc 命令正在爲本身收集輸入。若是你按下Ctrl-D,wc 命令的結果將被寫在屏幕上。若是你輸入一個文件名作參數,象下面的例子同樣,wc 將返回文件所包含的字符數,單詞數,和行數:
wc test
11 2 1
另外一種把test文件內容傳給 wc 命令的方法是重定向 wc 的輸入。< 符號在bash裏用於把當前命令的輸入重定向爲指定的文件。因此能夠用下面的命令來把 wc 命令的輸入重定向爲 test 文件:
wc < test
11 2 1
輸入重定向並不常用由於大多數命令都以參數的形式在命令行上指定輸入文件的文件名。儘管如此,當你使用一個不接受文件名爲輸入參數的命令,而須要的輸入又是在一個已存在的文件裏時,你就能用輸入重定向解決問題。
輸出重定向
輸出重定向比輸入重定向更經常使用。輸出重定向使你能把一個命令的輸出重定向到一個文件裏,而不是顯示在屏幕上。
不少狀況下均可以使用這種功能。例如,若是某個命令的輸出不少,在屏幕上不能徹底顯示,你能把它重定向到一個文件中,稍後再用文本編輯器來打開這個文件;當你想保存一個命令的輸出時也可使用這種方法。還有,輸出重定向能夠用於把一個命令的輸出看成另外一個命令的輸入時。(還有一種更簡單的方法能夠把一個命令的輸出看成另外一個命令的輸入,就是使用管道,管道的使用將在本文的「管道」一節介紹)
輸出重定向的使用與輸入重定向很類似,可是輸出重定向的符號是 > 。
注:記憶輸入/輸出重定向符號的最好方法是把<看做是一個漏斗,漏斗的小口指向須要輸入的命令(由於須要接受輸入的命令會在 <的左手邊),而把> 看成一個大口指向有輸出的命令的漏斗。
重定向舉例,當你要把 ls 命令的輸出保存爲一個名爲 directory.out 的文件時,你可使用下面的命令:
ls > directory.out
管道
管道能夠把一系列命令鏈接起來。這意味着第一個命令的輸出會經過管道傳給第二個命令而做爲第二個命令的輸入,第二個命令的輸出又會做爲第三個命令的輸入,以此類推。而管道行中最後一個命令的輸出纔會顯示在屏幕上(若是命令行裏使用了輸出重定向的話,將會放進一個文件裏)。
你能經過使用管道符 | 來創建一個管道行,下面的示例就是一個管道行:
cat sample.text | grep "High" | wc -l
這個管道將把 cat 命令(列出一個文件的內容)的輸出送給grep命令。grep 命令在輸入裏查找單詞 High,grep命令的輸出則是全部包含單詞 High的行,這個輸出又被送給 wc命令。帶 -l選項的 wc命令將統計輸入裏的行數。假設 sample.txt的內容以下:
Things to do today:
Low: Go grocery shopping
High: Return movie
High: Clear level 3 in Alien vs. Predator
Medium: Pick up clothes from dry cleaner
管道行將返回結果 2,指出你今天有兩件很重要的事要作:
cat sample.text | grep "High" | wc -l
2
提示符
bash 有兩級用戶提示符。第一級是你常常看到的 bash 在等待命令輸入時的提示符。缺省的一級提示符是字符$(若是是超級用戶,則是#號)。你能夠經過改變bash 的PS1變量的值來改變你的缺省提示符,例如:
PS1="Please enter a command"
把bash shell 的提示符該爲指定的字符串。
當bash 期待輸入更多的信息以完成命令時顯示第二級提示符。缺省的第二級提示符是 >。 果你要改變第二級提示符,能夠經過設置PS2變量的值來實現:
PS2="I need more information"
另外你還能夠用特殊的字符來定義你的提示符,下面的列表列出了最經常使用的特殊字符。
提示符特殊字符代碼
字符 含義
/! 顯示該命令的歷史記錄編號。
/# 顯示當前命令的命令編號。
/$ 顯示$符做爲提示符,若是用戶是root的話,則顯示#號。
// 顯示反斜槓。
/d 顯示當前日期。
/h 顯示主機名。
/n 打印新行。
/nnn 顯示nnn的八進制值。
/s 顯示當前運行的shell的名字。
/t 顯示當前時間。
/u 顯示當前用戶的用戶名。
/W 顯示當前工做目錄的名字。
/w 顯示當前工做目錄的路徑。
這些特殊字符能組合成不少種有用的提示符方案(也能夠組合爲很奇異的方案),例如把 PS1 設爲:
PS1="/t"
這致使提示符顯示當前的時間,就象下面的顯示同樣(提示符後面將不會有空格):
02:16:15
而下面的設置:
PS1=/t
將致使提示符變成下面的樣子:
t
這顯示了設置中引號的重要性,下面的提示符串:
PS1="/t// "
會使提示符看起來象這個樣子:
02:16:30/
這種狀況下,提示符後面會有一個空格,由於引號裏有一個空格。
做業控制(Job Control)
做業控制可以控制當前正在運行的進程的行爲。特別地,你能把一個正在運行的進程掛起,稍後再恢復它的運行。bash 保持對全部已啓動的進程的跟蹤,你能在一個正在運行的進程的生命期內的任什麼時候候把它掛起或是使它恢復運行。
按下 Ctrl-Z 使一個運行的進程掛起。bg 命令使一個被掛起的進程在後臺恢復運行,反之 fg 命令使進程在前臺恢復運行。這幾個命令在當用戶想在後臺運行而意外的把它放到了前臺時,常常被用到。當一個命令在前臺被運行時,它會禁止用戶與 shell 的交互,直到該命令結束。這一般不會形成麻煩,由於大多數命令很快就執行完了。若是你要運行的命令要花費很長的時間的話,咱們一般會把它放到後臺,以使咱們能在前臺繼續輸入其餘命令。例如,你輸入這個命令:
command find / -name "test" > find.out
它將尋找整個文件系統中的名爲test 的文件並把結果保存在一個叫fing.out的文件裏。若是在前臺運行的話,根據文件系統的大小,你的shell將有數秒甚至數分鐘不能使用,你不想這樣的話能夠再輸入如下面的內容:
control-z
bg
find 命令首先被掛起,再在後臺繼續被執行,而且你能立刻回到bash下。
用戶化配置bash
本文已經描述了許多用戶化配置bash的方法(例如上面咱們剛剛提到的命令PS1="/t// " )。但知道如今爲止,咱們所作的改動都僅在當前運行的bash下才有效。一旦退出系統,全部的改動也隨之消失了。爲了保存這些用戶化配置,你必須把它們保存到一個bash的初始化文件裏。
你能把任何想每次進入bash都執行的命令放到初始化文件裏。這個文件裏最多見到的命令一般是alias和變量的初始化。bash的初始化文件叫作 profile。每一個使用bash的用戶都有一個 .profile文件在他的用戶目錄裏(也多是.bash_profile)。bash在每次啓動時都讀取這個文件,並執行全部包含的命令。
下面的代碼是缺省的.profile文件的內容。這個文件的位置在 /etc目錄。若是你想設置本身的bash 的話把它拷到你的用戶目錄裏(若是尚未的話)並命名爲.profile。
注意: 有些setup程序會在創建用戶時自動放一個.profile文件的拷貝在你的用戶目錄裏。可是並非全部的都這麼作,因此最好先檢查一下你的用戶目錄。記住全部以句點開頭的文件都是隱含的,只有用ls -a或ls -A命令才能列出。
# commands common to all logins
export OPENWINHOME=/usr/openwin
export MINICOM="-c on"
export MANPATH=/usr/local/man:/usr/man/preformat:/usr/man:/X11/man:/usr/openwin /m
an
export HOSTNAME="`cat /etc/HOSTNAME`"
PATH="$PATH:/usr/X11/bin:$OPENWINHOME/bin:/usr/games:."
LESS=-MM
# I had problems using 'eval test' instead of 'TERM=', but you might want to
# try it anyway. I think with the right /etc/termcap it would work great.
# eval 'tset -sQ "$TERM"'if [ "$TERM" = "" -o "$TERM" = "unknown"]; then TERM=linux
#PS1=''hostname':'pwd'# `
if [ "$SHELL" = "/bin/pdksh" -o "$SHELL" = "/bin/ksh" ]; then
PS1="! $"
elif [ "$SHELL" = "/bin/zsh" ]; then
PS1="%m:%~%# "
elif [ "$SHELL" = "/bin/ash" ]; then
PS1="$ "
else
PS1='/h:/w/$ `
fi
PS2='> `
ignoreeof=10
export PATH DISPLAY LESS TERM PS1 PS2 ignoreeof
umask 022
# set up the color-ls environment variables:
if [ "$SHELL" = "/bin/zsh" l; then
eval 'dircolors -z'
elif [ "$SHELL" = "/bin/ash" l; then
eval 'dircolors -s'
else
eval 'dircolors -b'
fi
echo
fortune
echo
export TAPE="/dev/nftape"
bash 命令概要
這是幾個最有用的bash內部命令:
alias: 設置bash別名。
bg: 使一個被掛起的進程在後臺繼續執行。
cd: 改變當前工做目錄。
exit: 終止shell。
export: 使變量的值對當前shell的全部子進程均可見 。
fc: 用來編輯歷史命令列表裏的命令。
fg: 使一個被掛起的進程在前臺繼續執行。
help: 顯示bash內部命令的幫助信息。
kill: 終止某個進程。
pwd: 顯示當前工做目錄。
unalias: 刪除已定義的別名。
bash 還有許多命令,但這些是最經常使用的,想了解更詳細的狀況,請參考bash的手冊--在提示符下鍵入 man bash。
bash 變量
這裏是幾個最有用的bash變量,包括變量名和簡單描述:
EDITOR, FCEDIT: bsah fc 命令的缺省編輯器。
HISTFILE: 用於貯存歷史命令的文件。
HISTSIZE: 歷史命令列表的大小。
HOME: 當前用戶的用戶目錄。
OLDPWD: 前一個工做目錄。
PATH: bash尋找可執行文件的搜索路徑。
PS1: 命令行的一級提示符。
PS2: 命令行的二級提示符。
PWD: 當前工做目錄。
SECONDS: 當前shell開始後所流逝的秒