![Terminal de prefixo "virtual" Bash](https://rvso.com/image/1607084/Terminal%20de%20prefixo%20%22virtual%22%20Bash.png)
Estou configurando o firewall usando firewall-cmd, mas leva muito tempo apenas para digitar firewall-cmd o tempo todo.
É possível criar um shell "virtual" temporário ou algo que anexe firewall-cmd a cada entrada seguinte?
Exemplo :
$ coolcommand firewall-cmd
> --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
[.....]
> --add-service https
> ^C
$
Obrigado
Responder1
Um loop com eval
, assim:
coolcommand () { while IFS= read -rep "> $1 " line; do eval "$1 $line"; done; }
Em seguida, invoque coolcommand firewall-cmd
como no seu exemplo.
A nota firewall-cmd
fica "colada" no início de cada linha digitada, mas ainda é o shell quem avalia a string resultante. Então $
, *
, ;
, #
, citações ou algo semelhante ainda são especiais. Em particular depois coolcommand firewall-cmd
, a digitação --list-all; date
será executada firewall-cmd --list-all
e date
(não firewall-cmd date
).
Melhorias para uma melhor experiência:
Também é possível passar um comando com argumento(s). Exemplo:
coolcommand 'printf "foo %s\n"'
O mesmo que um roteiro. Adicionado suporte ao histórico:
#!/bin/bash unset HISTFILE HISTCONTROL=ignoreboth while IFS= read -rep "> $1 " line; do history -s "$line" eval "$1 $line" done
O histórico não é salvo quando o script está prestes a sair, mas durante uma única invocação ele deve funcionar ( ↑/ ↓como normalmente no Bash).