八個鮮為人知的 Bash 選項

一些 Bash 選項是眾所周知並且經常使用的。 例如,很多人在腳本的開頭寫

設置-o xtrace

用於調試,

設置-o errexit

錯誤退出或

設定-o errunset

如果未設定被呼叫的變數則退出。

但還有很多其他選擇。 有時,它們在法力中的描述過於混亂,因此我在這裡收集了一些最有用的內容,並附有解釋。

注意:Mac 可能有較舊版本的 bash(3.x 而不是 4.x),其中並非所有這些選項都可用。 在這種情況下,請參閱 這裡這裡.

setshopt?

有兩種方法可以設定 bash 選項:從腳本或從命令列。 您可以使用內建指令 set и shopt。 兩者都改變了 shell 的行為,做很多相同的事情(使用不同的參數),但它們的差異 起源。 選項 set 是從其他 shell 的參數繼承或借用的,而參數 shopt 在 bash 中創建。

如果您想查看當前選項,請運行:

$ set -o
$ shopt

若要啟動該選項 set 使用長語法或短語法:

$ set -o errunset
$ set -e

效果是一樣的。

要停用該選項,您需要輸入加號而不是減號:

$ set +e

很長一段時間我都記不住這個語法,因為邏輯似乎是錯誤的(減號啟用該選項,加號禁用它)。

В shopt (更符合邏輯)標誌用於啟用和停用選項 -s (設定)和 -u (未設定):

$ shopt -s cdspell # <= on
$ shopt -u cdspell # <= off

更改目錄

有幾個選項可以幫助您使用目錄。

1.CD拼寫

透過此設置,bash 將開始識別拼寫錯誤,並將您帶到名稱拼寫錯誤的資料夾。

$ shopt -s cdspell
$ mkdir abcdefg
$ cd abcdeg
abcdefg
$ cd ..

我已經使用這個選項很多年了,很少(也許每年一次)它會做出一個非常奇怪的決定。 但在其他日子 cdspell 每天都可以節省時間。

2. 自動光碟

如果您不願意接受多次輸入的低效率 cd,那麼您可以設定此選項,如果 X 命令不存在,請移動到 X 資料夾。

$ shopt -s autocd
$ abcdefg
$ cd ..

與自動完成功能結合,您可以在資料夾之間快速跳轉:

$ ./abc[TAB][RETURN]
cd -- ./abcdefg

只是不要命名資料夾 rm -rf * (是的,順便說一句,這是可能的)。

3.dir展開

這是一個很酷的選項,可以透過按 Tab 來擴展環境變數:

$ shopt -s direxpand
$ ./[TAB]     # заменяется на...
$ /full/path/to/current_working_folder
$ ~/[TAB]     # заменяется на...
$ /full/path/to/home/folder
$ $HOME/[TAB] #  заменяется на...
$ /full/path/to/home/folder

乾淨的輸出

4. 檢查工作

如果後台仍有作業運行,此選項將停止登出工作階段。

顯示未完成任務的列表,而不是退出。 如果仍想退出,則重新進入 exit.

$ shopt -s checkjobs
$ echo $$
68125             # <= ID процесса для оболочки
$ sleep 999 &
$ exit
There are running jobs.
[1]+  Running                 sleep 999 &
$ echo $$
68125             # <= ID процесса для оболочки тот же
$ exit
There are running jobs.
[1]+  Running                 sleep 999 &
$ exit
$ echo $$
$ 59316           # <= на этот раз ID процесса  изменился

替代超能力

5.環球星

這個選項給你替代超能力! 如果您輸入:

$ shopt -s globstar
$ ls **

那麼 shell 將會遞歸地顯示所有目錄和子目錄。

與...結合使用 direxpand 您可以快速查看層次結構中較低的所有內容:

$ shopt -s direxpand
$ ls **[TAB][TAB]
Display all 2033 possibilities? (y or n) 

6.extglob

此選項啟用與正規表示式更常見關聯的功能。 有時這非常有用:

$ shopt -s extglob
$ touch afile bfile cfile
$ ls
afile bfile cfile
$ ls ?(a*|b*)
afile bfile
$ ls !(a*|b*)
cfile

這裡,模式被放置在括號中並由豎線分隔。 以下是可用的運算子:

? = 匹配零次或一次出現的給定模式! = 顯示所有與給定模式不符的內容 * = 出現零次或多次 + = 出現一次或多次 @ = 恰好出現一次

意外保障

7. 歷史驗證

剛開始使用縮寫歷史記錄中的快速啟動命令可能會有點害怕 !! и !$.

選項 histverify 讓您在實際運行之前首先了解 Bash 如何解釋該命令:

$ shopt -s histverify
$ echo !$          # <= По нажатию Enter команда не запускается
$ echo histverify  # <= Она сначала демонстрируется на экране,
histverify         # <= а потом запускается 

8. 諾克洛伯

再次強調,為了防止意外發生,即使用重定向運算子覆寫已經存在的檔案(>)。 如果您沒有備份,這可能會是一場災難。

選項 set -С 禁止此類覆蓋。 如有必要,您可以使用運算符繞過保護 >|:

$ touch afile
$ set -C
$ echo something > afile
-bash: afile: cannot overwrite existing file
$ echo something >| afile
$

來源: www.habr.com

添加評論