各選項釋疑

2022-03-26 09:17:54 字數 3571 閱讀 4054

$ echo $-

himbh

1、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] ~ 

$ echo $-

+ echo himxbh # -x 選項設定的效果

himxbh

回到himbh上,我們來乙個乙個看這幾個預設選項分別影響了 shell 的哪些行為。

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] ~ 

$ echo "hello, world!"

-bash: !": event not found

關於這一點,我也在簡潔的 bash programming 技巧續篇的第9條中有提到過,解決方法有兩種:使用單引號或者關閉歷史展開功能(在指令碼裡面預設是關閉的):

$ echo 'hello, world!'

hello, world!

[kodango@mac] ~

$ set +h

[kodango@mac] ~

$ echo "hello, world!"

hello, world!

b - brace expansion

brace expansion 是乙個很有用的技巧,我這裡簡單介紹乙個:

[kodango@mac] ~ 

$ cp /your/path/to/file

很多時候大家需要備份某個檔案時,非常頭疼的一點就是要重複輸入長長地路徑,利用 brace expansion 就可以輕鬆搞定。

你可以試試通過set +b來關閉這個功能,與前面幾個選項不同的是,這個選項在指令碼裡面也是預設開啟的。

m - monitor mode

字面意思是說開啟監控模式,bash 手冊上後面還有一句話"job control is enabled",job control 是什麼?就是說可以控制程序的停止、繼續,後台或者前台執行等。

正常情況下,在互動式模式下,該選項預設是開啟的,所以再執行乙個比較耗時的命令時,你可以按下ctrl+z讓它在後台執行,然後可以用 fg 命令將後台執行的任務恢復到前台執行:

[kodango@mac] ~ 

$ sleep 10

+ sleep 10

^z[1]+ stopped sleep 10

[kodango@mac] ~

$ fg

+ fg

sleep 10

如果關閉這個選項,你就失去了控制 job 的能力:

[kodango@mac] ~ 

$ set +m

[kodango@mac] ~

$ sleep 10

^z^z^c

[kodango@mac] ~

$ fg

-bash: fg: no job control

stackoverflow 上相關的問題:why can't i use job control in a bash script?。

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...