以下是我的回答:$ echo $-1、himbh這個結果又是什麼意思?himbh
2、看不懂,求第69行詳解。多謝++
fori in/etc/profile.d/*.sh ;doif[-r "$i"];thenif["$"!="$-"];then."$i"else."$i">/dev/null 2>&1fifidone
$-記錄著當前設定的shell選項,himbh是預設值,你可以通過 set 命令來設定或者取消乙個選項配置。例如:
set -x這個可以開啟 shell 的除錯開關,除錯 shell 指令碼非常有用,這個時候再檢查下 $- 變數的值,可以看到多了 x 字元:
[kodango@mac] ~回到himbh上,我們來乙個乙個看這幾個預設選項分別影響了 shell 的哪些行為。$ echo $-
+ echo himxbh # -x 選項設定的效果
himxbh
i - interactive
包含這個選項說明當前的 shell 是乙個互動式的 shell,何為互動式?你輸入命令,shell 解釋執行後給你返回結果,我們在 terminal 下使用的 shell 就是互動式的,所以 $- 會包含 i 字元。如果我們在乙個指令碼裡面 echo $-,結果是不會包含 i 的。關於互動式 shell,我之前在部落格裡寫過一篇文章專門介紹,有興趣的可以看看。
h - history expand
history expand 這個很多人都基本上不用,包括我也是。我們知道 shell 會把我們執行的命令記錄下來,可以通過 history 命令檢視,每一行是序號 + 執行的命令。在 shell 退出時,會將這些資訊儲存到~/.bash_history 檔案中,當然在啟動時也會從該檔案中載入,不信刪除這個檔案再開啟乙個終端試試。
history expand 就是展開歷史列表中的命令,可以通過!感嘆號來完成,例如"!!"返回上最近的乙個歷史命令,"!n"返回第 n 個歷史命令,等等,具體可以看 bash 的 man手冊,這裡不多介紹。
多扯一句,在命令列下,不要在雙引號號裡面用!,這會讓 shell "誤以為" 你要執行歷史展開:
[kodango@mac] ~關於這一點,我也在簡潔的 bash programming 技巧續篇的第9條中有提到過,解決方法有兩種:使用單引號或者關閉歷史展開功能(在指令碼裡面預設是關閉的):$ echo "hello, world!"
-bash: !": event not found
$ echo 'hello, world!'b - brace expansionhello, world!
[kodango@mac] ~
$ set +h
[kodango@mac] ~
$ echo "hello, world!"
hello, world!
brace expansion 是乙個很有用的技巧,我這裡簡單介紹乙個:
[kodango@mac] ~很多時候大家需要備份某個檔案時,非常頭疼的一點就是要重複輸入長長地路徑,利用 brace expansion 就可以輕鬆搞定。$ cp /your/path/to/file
你可以試試通過set +b
來關閉這個功能,與前面幾個選項不同的是,這個選項在指令碼裡面也是預設開啟的。
m - monitor mode
字面意思是說開啟監控模式,bash 手冊上後面還有一句話"job control is enabled",job control 是什麼?就是說可以控制程序的停止、繼續,後台或者前台執行等。
正常情況下,在互動式模式下,該選項預設是開啟的,所以再執行乙個比較耗時的命令時,你可以按下ctrl+z
讓它在後台執行,然後可以用 fg 命令將後台執行的任務恢復到前台執行:
[kodango@mac] ~如果關閉這個選項,你就失去了控制 job 的能力:$ sleep 10
+ sleep 10
^z[1]+ stopped sleep 10
[kodango@mac] ~
$ fg
+ fg
sleep 10
[kodango@mac] ~stackoverflow 上相關的問題:why can't i use job control in a bash script?。$ set +m
[kodango@mac] ~
$ sleep 10
^z^z^c
[kodango@mac] ~
$ fg
-bash: fg: no job control
h - hashall
這個選項的意思我不是很明白,猜測開啟這個選項後,shell 會將命令所在的路徑記錄下來,避免每次都要查詢。
我們要驗證下這個猜測,首先在/usr/bin 下建立任意乙個可執行的檔案:
[kodango@mac] ~好吧,果不其然,「快取」失效了。接下來,我們關閉這個選項:$ echo "test hashall" | sudo tee /usr/bin/kodango && sudo chmod +x /usr/bin/kodango
[kodango@mac] ~
$ kodango
test hashall
[kodango@mac] ~
$ sudo mv /usr/bin/kodango /usr/local/bin/kodango
[kodango@mac] ~
$ kodango
-bash: /usr/bin/kodango: no such file or directory
[kodango@mac] ~現在工作正常了,不過誰會經常沒事瞎移動命令呢?所以這個選項預設都是開啟的。$ set +m
[kodango@mac] ~
$ kodango
test hashall
[kodango@mac] ~
$ which kodango
/usr/local/bin//kodango
最後,你也可以通過set -o
命令來檢視當前 shell 的選項配置。
$
翻譯過來是說,從左往右看,刪除掉 $- 變數的值中第乙個 i 字元以及之前的內容。與此相對的,還有$
的寫法,%與#號的意義剛好相反,從右往左看,刪除掉 $- 變數的值中最後乙個 i 字元以及之後的內容。
這種語法學名叫「parameter substitution」或者「parameter expansion」,這一類下還有其它很多種形式,具體可以 abs 的這一節。
Ghost備份還原系統各選項作用
disk to disk 是從硬碟拷到硬碟,相當於雙硬碟拷備檔案 disk to image 是備份硬碟裡所有資料 disk from image 是用某個盤裡的鏡象恢復整個硬碟,但和ghost的鏡象不一樣,不要搞錯了,一般多分割槽成一分割槽就是這麼搞錯的,切記 partition to parti...
iOS開發 設定tabbar上各選項顏色
今天有個朋友問我怎麼設定tabbar上的tabbaritem的標題顏色,按照常規我把這麼段 發過去了 tabbar.tabbaritem settitletextattributes nsdictionary dictionarywithobjectsandkeys uicolor blackcol...
SVN更新提示衝突時各選項的意思
svn up時,提示無法更新,使用svn up force強制更新 有時會彈出如下提示 conflict discovered in css home.css select p postpone,df diff full,e edit,mc mine conflict,tc theirs confl...