1989:Bash 1.x 與交互式強化#
事件#
1989 年 6 月,Bash 發佈第一個正式版本(Bash 1.05 附近版本開始廣泛散布),隨 GNU 工具鏈與早期的 Linux 發行版散布。這一時期 bash 的重點是把「交互體驗」做到與 ksh/csh 持平甚至超越。
新語法與特性及其理論、實用原因#
1. 歷史命令與事件指定符(!!、!$、!string、fc` 內建)#
- 理論原因:繼承 csh 的歷史機制並標準化(ksh 亦有)。
- 實用原因:
fc內建可用編輯器修改歷史命令再執行。 - 彌補缺陷:原始 Bourne Shell 無歷史功能。
2. 別名(alias/unalias)#
- 實用原因:個人化命令與命令縮寫。
- 彌補缺陷:個人化命令必須寫腳本。
3. readline 命令列編輯(emacs/vi 模式、Ctrl-R 歷史搜尋)#
- 理論原因:readline 抽成 GNU 函式庫,行編輯能力可跨程式重用。
- 實用原因:使用者可用熟悉的 emacs/vi 按鍵編輯指令。
- 彌補缺陷:Bourne Shell 只能重打整行。
4. 工作控制(jobs、fg、bg、Ctrl-Z、wait)#
- 實用原因:互動式 multitasking。
- 彌補缺陷:原始 sh 只能
cmd &,無法暫停/切換。
5. $RANDOM、$SECONDS` 等內建變數#
- 實用原因:隨機數(腳本測試)與時間計算不需外部程式。
- 彌補缺陷:要 fork 外部程式才能取得隨機數。
6. ulimit、umask 等行程控制內建#
- 實用原因:資源限制與檔案權限預設值腳本內直接設定。
歷史意義#
Bash 1.x 讓 GNU/Linux 使用者在 1991 年 Linux 問世時就擁有「交互與腳本兩優」的 shell,是 bash 之後 30 年統治地位的地基。
程式範例:Bash 1.x 的交互功能#
# 1. 歷史命令與事件指定符
!! # 重跑上一條命令
!$ # 上一條的最後參數
fc # 用編輯器修改歷史命令再執行
HISTSIZE=500 # 歷史容量
# 2. 別名
alias ll='ls -l'
alias gs='git status'
unalias gs
# 3. readline 命令列編輯
Ctrl-R # 歷史搜尋(readline 提供,gdb 等 GNU 程式也通用)
Ctrl-A / Ctrl-E # 跳到行首/行尾
set -o vi # 或 vi 模式
# 4. 工作控制
sleep 100 &
jobs # [1] Running sleep 100 &
fg %1 # 切回前景
Ctrl-Z; bg # 暫停後送背景
wait # 等待所有背景工作
# 5. 內建變數:不需外部程式
echo $RANDOM # 隨機數(以前要 fork 外部程式)
echo $SECONDS # shell 啟動至今秒數
彌補了什麼缺陷#
彌補了原始 Bourne Shell「無歷史、無別名、無行編輯、無工作控制」的互動缺陷,完成 ksh 路線在自由軟體世界的重實現。