外置命令 date expr seq nohup tput html
bash內置命令 trap set shopt linux
dateshell
Linux時鐘分爲系統時鐘(System Clock)和硬件(Real Time Clock,簡稱RTC)時鐘。系統時鐘是指當前Linux Kernel中的時鐘,而硬件時鐘則是主板上由電池供電的時鐘,這個硬件時鐘能夠在BIOS中進行設置。當Linux啓動時,硬件時鐘會去讀取系統時鐘的 設置,而後系統時鐘就會獨立於硬件運做。
Linux中的全部命令(包括函數)都是採用的系統時鐘設置。在Linux中,用於時鐘查看和設置的命令主要有date、hwclock。編程
如果不以加號做爲開頭,則表示要設定時間,而時間格式爲 MMDDhhmm[[CC]YY][.ss],其中 MM 爲月份,DD 爲日,hh 爲小時,mm 爲分鐘,CC 爲年份前兩位數字,YY 爲年份後兩位數字,ss 爲秒數ubuntu
在linux shell編程中,常常用到日期的加減運算
之前都是本身經過expr函數計算,很麻煩
其實date命令自己提供了日期的加減運算
很是方便。例如:獲得昨天的時間
date +%Y%m%d --date="-1 day"
date 用法: date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
date 能夠用來顯示或設定系統的日期與時間。
1.在顯示方面,使用者能夠設定欲顯示的格式,格式設定爲一個加號後接數個標記,其中可用的標記列表以下:
% : 打印出 %
%n : 下一行
%t : 跳格
%H : 小時(00..23)
%I : 小時(01..12)
%k : 小時(0..23)
%l : 小時(1..12)
%M : 分鐘(00..59)
%p : 顯示本地 AM 或 PM
%r : 直接顯示時間 (12 小時制,格式爲 hh:mm:ss [AP]M)
%s : 從 1970 年 1 月 1 日 00:00:00 UTC 到目前爲止的秒數
%S : 秒(00..61)
%T : 直接顯示時間 (24 小時制)
%X : 至關於 %H:%M:%S
%Z : 顯示時區 %a : 星期幾 (Sun..Sat)
%A : 星期幾 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接顯示日期與時間
%d : 日 (01..31)
%D : 直接顯示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第幾天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第幾周 (00..53) (以 Sunday 爲一週的第一天的情形)
%w : 一週中的第幾天 (0..6)
%W : 一年中的第幾周 (00..53) (以 Monday 爲一週的第一天的情形)
%x : 直接顯示日期 (mm/dd/yy)
%y : 年份的最後兩位數字 (00.99)
%Y : 完全年份 (0000..9999)
2.在設定時間方面
date -s //設置當前時間,只有root權限才能設置,其餘只能查看。
date -s 20080523 //設置成20080523,這樣會把具體時間設置成空00:00:00
date -s 01:01:01 //設置具體時間,不會對日期作更改
date -s 「01:01:01 2008-05-23″ //這樣能夠設置所有時間
date -s 「01:01:01 20080523″ //這樣能夠設置所有時間
date -s 「2008-05-23 01:01:01″ //這樣能夠設置所有時間
date -s 「20080523 01:01:01″ //這樣能夠設置所有時間
3.加減
date +%Y%m%d //顯示如今天年月日
date +%Y%m%d --date="+1 day" //顯示後一天的日期
date +%Y%m%d --date="-1 day" //顯示前一天的日期
date +%Y%m%d --date="-1 month" //顯示上一月的日期
date +%Y%m%d --date="+1 month" //顯示下一月的日期
date +%Y%m%d --date="-1 year" //顯示前一年的日期
date +%Y%m%d --date="+1 year" //顯示下一年的日期
或者更簡單點的 date=`date -d -${t}day '+%Y%m%d'` //爲t爲前幾天
[root@Gman root]# date -d next-day +%Y%m%d
20060328
[root@Gman root]# date -d last-day +%Y%m%d
20060326
[root@Gman root]# date -d yesterday +%Y%m%d
20060326
[root@Gman root]# date -d tomorrow +%Y%m%d
20060328
[root@Gman root]# date -d last-month +%Y%m
200602
[root@Gman root]# date -d next-month +%Y%m
200604
[root@Gman root]# date -d next-year +%Y
2007
date –s:按字符串方式修改時間
只修改日期,輸入:date -s 2007-08-09
只修改時間,輸入:date -s 14:15:00
同時修改日期時間,注意要加雙引號,日期與時間之間有一空格,輸入:
#date -s "2007-08-03 14:15:00"
注 意 :當你不但願出現無心義的 0 時(好比說 1999/03/07),則能夠在標記中插入 - 符號,好比說 date '+%-H:%-M:%-S' 會把時分秒中無心義的 0 給去掉,像是本來的 08:09:04 會變爲 8:9:4。另外,只有取得權限者(好比說 root)才能設定系統時間。
當你以 root 身分更改了系統時間以後,請記得以 clock -w 來將系統時間寫入 CMOS 中,這樣下次從新開機時系統時間纔會持續抱持最新的正確值。bash
expr
expr命令通常用於整數值,但也可用於字符串。通常格式爲:
expr argument operator argument
expr也是一個手工命令行計數器。
[root@localhost script]# expr 10 + 10
20
[root@localhost script]# expr 10 - 8
2
[root@localhost script]# expr 2 \* 3 反斜線屏蔽其特定含義
6
[root@localhost script]# expr 30 / 3 / 2
5
seq
用法:seq [選項]... 尾數
或:seq [選項]... 首數 尾數
或:seq [選項]... 首數 增量 尾數
以指定增量從首數開始打印數字到尾數。
-f, --format=格式 使用printf 樣式的浮點格式
-s, --separator=字符串使用指定字符串分隔數字(默認使用:\n)
-w, --equal-width 在列前添加0 使得寬度相同
--help 顯示此幫助信息並退出
--version 顯示版本信息並退出
若是省略了首數或者增量,則默認其值爲1,即便這樣尾數仍小於首數。
首數、增量和尾數均以浮點數形式解釋。當首數小於尾數時增量通常爲正值,
相反在首數大於尾數時增量通常爲負數。
指定的格式必須適用於顯示"double"類型的參數;當首數、增量和尾數均爲指定
精確度的定點十進制數時默認爲"%.精確度f",不然默認爲"%g"。
從1循環到100的兩種方法(bash 其它的shell沒試過)
for x in `seq 1 100`;do echo $x;done
for x in {1..100};do echo $x;done
輸出1-100中,不包含數字7,且不能被7整除的數
seq 100 | grep -v "7" | awk '$0%7!=0{print}'
另外,不用 seq 的話還能夠這樣:
[root@ubuntu]# for i in {1..10};do echo $i;done
1 和 10 之間是兩個半角的點
-f 最經常使用 , 例如一次製作 10 個名 dir001 , dir002 .. dir010 的目錄,它便頗有用途,我們能夠
這樣下一個命令即可了
seq -f 'dir%03g' 1 10 | xargs mkdir
或
mkdir $(seq -f 'dir%03g' 1 10)
它用的是 printf 的格式 , %03g' 表明以三位浮點數,以此方法,如用bash3 的 printf
也可做為等價命令
printf 'dir%03d\n' {1..10} | xargs mkdir 或 mkdir `printf 'dir%03d ' {1..10}`
awk 當然也能夠
awk 'BEGIN { while (num < 10 ) printf "dir%03d\n", ++num ; exit}' | xargs mkdir
這樣會比寫一個腳本快, 沒必要寫成
for dir in 001 002 003 004 005 006 007 008 009 010
do
mkdir dir${dir}
done
我也經常使用 seq 下載一些用數字的 jpeg , 只要格式有數字順序即可,尤以一些 xxx site ;)
for i in `seq -f '%02g' 1 20`
do
if ! wget -P $HOME/tmp -c [img]http://www.xxxsite.com/photo/$i.jpg[/img] ; then
wget -P $HOME/tmp -c $_
fi
done
-s 選項主要改變輸出的分格符, 預設是 \n , 就是 newline
如用 -s 即可改變 , 如
seq -s ' ' 1 10
1 2 3 4 5 6 7 8 9 10 , 以空格做為分格,app
trap http://blog.csdn.net/elbort/article/details/8525599編輯器
http://blog.chinaunix.net/uid-23544240-id-3203378.htmlide
[root@250-shiyan ~]# trap -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX [root@250-shiyan ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
它有三種形式分別對應三種不一樣的信號迴應方式.
第一種:
trap 'commands' signal-list
當腳本收到signal-list清單內列出的信號時,trap命令執行雙引號中的命令.
第二種:
trap signal-list
trap不指定任何命令,接受信號的默認操做.默認操做是結束進程的運行.
第三種:
trap ' ' signal-list
trap命令指定一個空命令串,容許忽視信號.
NOTE:trap 對同種signal只能相應一種設定,若是在一個shell裏面設置多個trap,如:
trap ' echo 「aaaaaaaaaaa」 ' INT
trap ' echo 「bbbbbbbbbbb」 ' INT
那麼它只會響應最後一個信號設定。
信號處理(Signal Handling)在 Linux 編程中一直扮演者重要的角色,幾乎每一個系統工具都要用到它,最多見的功能莫過於用信號進行進程間通訊(尤爲是父子進程)以及捕捉SIGINT、SIGTERM之類的退出信號以作一些善後處理(cleanup)。C中自沒必要多說,可使用 wait 族函數;而 shell 腳本中也有捕捉信號的 trap 功能——然而許多人在使用 trap 功能的時候卻存在着這樣那樣的誤解,這些看似可有可無的小細節最後有可能使得你的腳本與你預想的行爲徹底不一樣。
如無特殊說明,下文所指 shell 均以 Bash 爲例。
0. trap 的使用簡介
雖然我很想說這些應當要本身看 manpage ,但考慮到也許正在讀文章的你手邊沒有 Linux ,仍是簡單說一下吧。
1
USAGE: trap [action condition ...]
即當捕捉到 condition 列表所對應的任何一個信號時,執行 action 動做(使用 eval action 來執行,故 action 能夠是 shell 內建指令、外部命令及腳本中的函數等)。action 還但是」"(空)、’-'等,分別表明忽略相應信號及重置相應信號爲默認行爲。
1. condition 的標準格式是什麼?
condition 中的信號到底應該如何書寫?好比終端中斷信號(通常用 CTRL-C 發出),究竟是寫 SIGINT 、 INT 仍是2(大部分系統上該信號對應的信號數)?是大寫仍是小寫?
若是你使用最新版的 Bash ,那麼這幾種寫法均可以。而若是你須要在不一樣 shell 中保持可移植性,請使用大寫、不帶前綴的 INT !根據 POSIX 標準, trap 的 condition 不該當加上 SIG 前綴,且必須全大寫,容許帶 SIG 前綴或小寫是某些 shell 的擴展功能。而信號數在不一樣的系統上可能不一樣,因此也不是一個好主意。
2. trap 必須放在第一行麼?
許多資料,尤爲是中文資料中不容申辯地指明—— trap 必須放在腳本中第一個非註釋行。事實果然如此麼?
不管是 manpage 仍是 POSIX 文檔中,我都沒有找到任何與之相關的說明。甚至在 TLDP 的 Bash Guide for Beginners 中,多個例子都分明把 trap 放在了腳本的中間。最後我在這篇文檔中找到了下面這句常常被誤讀的話:
Normally, all traps are set before other executable code in the shell script is encountered, i.e., at the beginning of the shell script.
果真,這只是一個爲了保證信號鉤子儘早被設立的一個設計慣例罷了。事實上, trap 能夠根據你的須要放在腳本中的任何位置。腳本中也能夠有多個 trap ,能夠爲不一樣的信號定義不一樣的行爲,或是修改、刪除已定義的 trap 。更進一步地, trap 也有做用範圍,你能夠把它放在函數中,它將只在這個函數裏起效!你看,其實 trap 的行爲是很符合 UNIX 的慣例的。
3. 信號到底是在何時被 trap 處理?
這是本文最重要的一點。信號究竟是何時被處理的?更準確地說,好比腳本正在執行某個命令時收到了某個信號,那麼它會被當即處理,仍是要等待當前命令完成?
我不打算直接說明答案。爲了讓咱們對這個問題有更透徹的理解,讓咱們來作一下實驗。看下面這個時常被用來說解 trap 的腳本:
#!/bin/bash
trap 'echo "INTERRUPTED!"; exit' INT
sleep 100
大多數教程都是這麼作的,運行這個腳本,按下 CTRL-C 。你看到了什麼?腳本打出了「INTERRUPTED!」並中止了運行。這看起來彷佛很正常、很直覺——以此看來, trap 會當即捕捉到信號並執行,無論當前正在執行的命令。許多腳本也正是在這個假設下寫的。
然而真的是這樣麼?讓咱們作另外一個實驗——在一個終端執行這個腳本,並打開另外一個終端,用ps-ef|grepbash找到這個腳本的進程號,而後用kill-SIGINT pid向這個進程發送 SIGINT 信號。你在原先的終端中看到了什麼?沒有任何反應!若是你願意等上100秒,你最終會看到「INTERRUPTED!」被輸出。這樣看來 trap 是等到當前命令結束之後再處理信號。
這樣的矛盾到底是爲何?問題其實出在 CTRL-C 身上。 Bash 等終端的默認行爲是這樣的:當按下 CTRL-C 以後,它會向當前的整個進程組發出 SIGINT 信號。而 sleep 是由當前腳本調用的,是這個腳本的子進程,默認是在同一個進程組的,因此也會收到 SIGINT 並中止執行,返回主進程之後 trap 捕捉到了信號。
這篇文檔給了咱們一個更準確的說明——若是當前正有一個外部命令在前臺執行,那麼 trap 會等待當前命令結束之後再處理信號隊列中的信號。(而許多教程出錯的另外一個緣由就是——某些 shell 中 sleep 是內建命令,會被打斷。)
那麼上文的例子應當要如何寫才能達到想要的效果呢?有兩種方法:1、把 sleep 放到後臺進行,再用內建的 wait 去等待其執行結束(詳見上一段提到的那篇文檔);2、暴力一點,把一長段 sleep 拆成一秒的小 sleep 的循環,這在對精度要求不高的狀況下也是一個可行的辦法(這應該不用寫範例了吧?)。
函數
定製shell環境set和shopt
set命令能夠用來定製shell環境,使用選項「o」來打開或者關閉選項。例如打開選項:set -o 選項,關閉選項目:set +o 選項。
+ 關閉選項
$- 當前標誌集合
himBH 默認選項分別影響了 Shell 的哪些行爲
i 這個選項說明當前的 shell 是一個交互式的 shell
在 Terminal 下使用的 shell 就是交互式的,因此 $- 會包含 i 字符,若是咱們在一個腳本里面 echo $-,結果是不會包含 i 的
H 不要在雙引號號裏面用!,這會讓 Shell "誤覺得" 你要執行歷史展開,解決方法有兩種:使用單引號或者關閉歷史展開功能(在腳本里面默認是關閉的):set +H關閉
B Brace expansion 是一個頗有用的技巧 cp /your/path/to/file{,.bak} set +B關閉這個功能
m 在交互式模式下,該選項默認是打開的,就是說能夠控制進程的中止、繼續,後臺或者前臺執行等。若是關閉,將不能使用ctrl+Z,及fg之類命令 set +m關閉
若是關閉這個選項,你就失去了控制 Job 的能力:
兩種方式,單字符與選項名
set -x 打開shell調試開關
set +x 關閉
set -o xtrace 打開
set +o xtrace 關閉
set -o 查看當前設置的選項配置
shopt命令是set命令的一個補充,不少方面都和set命令同樣,但它增長了不少選項。可有使用「-p」選項來查看shopt選項的設置。「-u」開 關表示一個復位的選項,「-s」表示選項當前被設置。
內置set命令選項
選項名 快捷開關 含義
allexport -a 從這個選項中被設置開始就自動標明要輸出的新變量或修改過的變量,直至選項被複位
braceexpand -B打開花括號擴展,它是一個默認設置
emacs 使用emacs內置編輯器進行命令行編輯,是一個默認設置
errexit-e 當命令返回一個非零退出狀態(失敗)時退出。讀取初始化文件時不設置
histexpand -H 執行歷史替換時打開!和!!擴展,是一個默認設置
history 打開命令行歷史、默認爲打開
ignoreeof 禁止用EOF(Ctrl+D)鍵退出shell。必須鍵入exit才能退出。等價於設置shell變量IGNOREEOF=10
keyword -k 將關鍵字參數放到命令的環境中
interactive-comments 對於交互式shell,把#符後面的文本做爲註釋
monitor-m 設置做業控制
noclobber-C 防止文件在重定向時被重寫
noexec-n 讀命令,但不執行。用來檢查腳本的語法。交互式運行時不開啓
noglob -d 禁止用路徑名擴展。即關閉通配符
notify-b 後臺做業完成時通知用戶
nounset-u 擴展一個未設置的變量時顯示一個錯誤信息
onecmd-t 在讀取和執行命令後退出
physical-P 設置時,在鍵入cd或pwd禁止符號連接。用物理目錄代替
privileged-p 設置後,shell不讀取.profile或ENV文件,且不從環境繼承shell函數,將自動爲setuid腳本開啓特權
verbose -v 爲調試打開verbose模式
vi 使用vi內置編輯器進行命令行編輯
xtrace-x 爲調試打開echo模式
shopt命令選項
選項 含義
cdable_vars若是給cd內置命令的參數不是一個目錄,就假設它是一個變量名,變量的值是將要轉換到的目錄
cdspell 糾正cd命令中目錄名的較小拼寫錯誤。檢查的錯誤包括顛倒順序的字符,遺漏的字符以及重複的字符。若是知道一處修改,正確的路徑就打印出,命令將繼續。只 用於交互式shell
checkhashbash在試圖執行一個命令前,先在哈希表中尋找,以肯定命令是否存在。若是命令不存在,就執行正常路徑搜索
checkwinsizebash在每一個命令後檢查窗口大小,若是有必要,就更新LINES和COLUMNS的值
cmdhistbash試圖將一個多行命令的全部行保存在同一個歷史項中。這使得多行命令的從新編輯更方便
dotglobbash在文件名擴展的結果中包括以點(.)開頭的文件名
execfail 若是一個交互式shell不能執行指定給exec內置命令做爲參數的文件,它不會退出。若是exec失敗,一個交互式shell不會退出
expand_aliases 別名被擴展。默認爲打開
extglob打開擴展的模式匹配特徵(正常的表達式元字符來自Korn shell的文件名擴展)
histappend 當shell退出時,歷史清單將添加到以HISTFILE變量的值命名的文件中,而不是覆蓋文件
histreedit 若是readline正被使用,用戶有機會從新編輯一個失敗的歷史替換
histverify 若是設置,且readline正被使用,歷史替換的結果不會當即傳遞給shell解析器。而是將結果行裝入readline編輯緩衝區中,容許進一步修 改
hostcomplete 若是設置,且readine正被使用,當正在完成一個包含@的詞時bash將試圖執行主機名補全。默認爲打開
huponexit 若是設置,當一個交互式登錄shell退出時,bash將發送一個SIGHUP(掛起信號)給全部的做業
interactive_comments 在一個交互式shell中,容許以#開頭的詞以及同一行中其餘的字符被忽略。默認爲打開
lithist 若是打開,且cmdhist選項也打開,多行命令將用嵌入的換行符保存到歷史中,而無需在可能的地方用分號來分隔
mailwarn 若是設置,且bash用來檢查郵件的文件自從上次檢查後已經被訪問,將顯示消息「The mail in mailfile has been read」
nocaseglob 若是設置,當執行文件名擴展時,bash在不區分大小寫的方式下匹配文件名
nullglob若是設置,bash容許沒有匹配任何文件的文件名模式擴展成一個空串,而不是它們自己
promptvars 若是設置,提示串在被擴展後再經歷變量和參量擴展。默認爲打開
restricted_shell 若是shell在受限模式下啓動就設置這個選項。該值不能被改變。當執行啓動文件時,不能復位該選項,容許啓動文件發現shell是不是受限的
sourcepath 若是設置,source內置命令使用PATH的值來尋找包含做爲參數提供的文件的目錄。默認爲打開
source 點(.)的同義詞
shift_verbose 若是該選項設置,當移動計數超過位置參量個數時,shift內置命令將打印一個錯誤消息
自Bash 3.1版開始,引入新選項 nocasematch,可以讓Bash在對比樣式時忽略大小寫。
shopt -s nocasematch #打開選項
[root@250-shiyan ~]# shopt -p
shopt -u autocd
shopt -u cdable_vars
shopt -u cdspell
shopt -u checkhash
shopt -u checkjobs
shopt -s checkwinsize
shopt -s cmdhist
shopt -u compat31
shopt -u compat32
shopt -u compat40
shopt -u dirspell
shopt -u dotglob
shopt -u execfail
shopt -s expand_aliases
shopt -u extdebug
shopt -s extglob
shopt -s extquote
shopt -u failglob
shopt -s force_fignore
shopt -u globstar
shopt -u gnu_errfmt
shopt -u histappend
shopt -u histreedit
shopt -u histverify
shopt -u hostcomplete
shopt -u huponexit
shopt -s interactive_comments
shopt -u lithist
shopt -s login_shell
shopt -u mailwarn
shopt -u no_empty_cmd_completion
shopt -u nocaseglob
shopt -u nocasematch
shopt -u nullglob
shopt -s progcomp
shopt -s promptvars
shopt -u restricted_shell
shopt -u shift_verbose
shopt -s sourcepath
shopt -u xpg_echo
nohup http://www.cnblogs.com/itech/archive/2012/03/04/2379523.html
tput