whiptail 簡介
用了一下 whiptail 工具實現在 shell 腳本以圖形界面方式進行交互,據其 使用文檔 上的說明,這個工具好古老啊,竟然是 1998 年開發出來的。
whiptail 簡介
其基本語法為:
whiptail [ --title title ] [ --backtitle backtitle ] [ --clear ] [
--defaultno ] [ --fb ] [ --nocancel ] [ --noitem ] [ --separate-output
] [ --scrolltext ] box-options
有三種返回狀態:
- 0:用戶選擇 OK 按鈕
- 1:用戶選擇 Cancel 按鈕
- -1:內部異常或者 ESC 退出(測試 ESC 按鍵沒有反應)
據該命令的返回狀態進行腳本控制,因為以前寫自動部署腳本時用 input 接收用戶輸入的,實際上其實是需要用戶在固定的幾個選項中選擇的。 whiptail 的菜單正好可以實現接收用戶選擇的功能,所以練習了下菜單。
菜單選項
參考這篇 《交互式shell腳本對話框》 中的 menu 部分的代碼,菜單使用語法為:
whiptail --title "<menu title>" --menu "<text to show>" <height> <width> <menu height> [ <tag> <item> ] . . .
編寫一個收集用戶選項的測試腳本:
#!/bin/bash
OPTION=$(whiptail --title "Menu Dialog" --menu "Choose your favorite programming language." 15 60 4 "1" "Python" "2" "JAVA" "3" "C" "4" "php" 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "Your favorite programming language is:" $OPTION
else
echo "You chose Cancel."
fi
執行腳本:
自定義菜單
3>&1 1>&2 2>&3 含義
上面這個測試腳本中, 3>&1 1>&2 2>&3 是什么意思呢?
反復試了一下,去掉這一整個語句,或者去掉某幾個,腳本執行都會處于懸停狀態,只有加上完整的這個語句,才能正確執行。那么它的含義是什么呢?
找到 這個鏈接 問的正好就是這個問題,這里翻譯整理一下:
1、linux 的標準輸入輸出流只有三種,即 0-stdin 、1-stdout、2-stderr
2、&標準流 是一個指向標準流的指針,如果沒有 & ,就是創建的一個普通的文件句柄。
3、>&標準流 指將某個文件重定向到另一個流
4、這里的 3>&1 ,的含義是:先創建一個文件句柄 3,將其重定向到1(out),再將 1 重定向 2 ,最后再將 2 重定向到 3 。這么繞了一圈就是初學編程時交換兩個變量的過程,將 error 的內容重定向到 out 了,out 重定向到 error 。
這三個命令的作用類似這個簡單的 swap 函數:
int swap(int a,int b){
int temp = a;//臨時容器裝 a,空出 a 容器
a=b;//將 b 放入 a 容器,空出 b 容器
b=temp;//再將臨時容器中的內容放入 b 容器
}
這里為什么要交換 out 和 err 呢?
可能是這個 menu 命令不關注本身的 out 信息,但是卻關注其 err 信息,它的正常選項會返回給 OPTION ,然后根據命令的退出狀態處理腳本的邏輯。