![Bash「虛擬」前綴終端](https://rvso.com/image/1607084/Bash%E3%80%8C%E8%99%9B%E6%93%AC%E3%80%8D%E5%89%8D%E7%B6%B4%E7%B5%82%E7%AB%AF.png)
我正在使用firewall-cmd來設定防火牆,但是一直輸入firewall-cmd需要花費很多時間。
是否可以建立臨時「虛擬」外殼或將防火牆cmd附加到以下每個輸入的東西?
例 :
$ coolcommand firewall-cmd
> --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
[.....]
> --add-service https
> ^C
$
謝謝
答案1
帶有 的循環eval
,如下所示:
coolcommand () { while IFS= read -rep "> $1 " line; do eval "$1 $line"; done; }
然後coolcommand firewall-cmd
像您的範例中那樣調用。
Notefirewall-cmd
會「黏在」您鍵入的每一行的開頭,但仍然由 shell 計算結果字串。所以 $
,,,,,引號*
之類;
的#
還是很特殊的。特別是在 後coolcommand firewall-cmd
,鍵入--list-all; date
將運行firewall-cmd --list-all
和date
(而不是firewall-cmd date
)。
改進以獲得更好的體驗:
也可以傳遞帶有參數的命令。例子:
coolcommand 'printf "foo %s\n"'
與腳本相同。新增了歷史記錄支援:
#!/bin/bash unset HISTFILE HISTCONTROL=ignoreboth while IFS= read -rep "> $1 " line; do history -s "$line" eval "$1 $line" done
當腳本即將退出時,歷史記錄不會保存,但在單次調用期間它應該可以工作(↑/↓就像 Bash 中通常那樣)。