![Terminal de prefijo "virtual" de Bash](https://rvso.com/image/1607084/Terminal%20de%20prefijo%20%22virtual%22%20de%20Bash.png)
Estoy configurando un firewall usando firewall-cmd pero me lleva mucho tiempo escribir firewall-cmd todo el tiempo.
¿Es posible crear un shell "virtual" temporal o algo que agregue firewall-cmd a cada una de las siguientes entradas?
Ejemplo :
$ coolcommand firewall-cmd
> --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
[.....]
> --add-service https
> ^C
$
Gracias
Respuesta1
Un bucle con eval
, como este:
coolcommand () { while IFS= read -rep "> $1 " line; do eval "$1 $line"; done; }
Luego invoca coolcommand firewall-cmd
como en tu ejemplo.
La nota firewall-cmd
se "pega" al principio de cada línea que escribe, pero sigue siendo el shell quien evalúa la cadena resultante. Entonces $
, *
las citas o cosas ;
así #
siguen siendo especiales. En particular, después de , se ejecutará coolcommand firewall-cmd
la escritura y (no ).--list-all; date
firewall-cmd --list-all
date
firewall-cmd date
Mejoras para una mejor experiencia:
También es posible pasar un comando con argumentos. Ejemplo:
coolcommand 'printf "foo %s\n"'
Lo mismo que un guión. Soporte de historial agregado:
#!/bin/bash unset HISTFILE HISTCONTROL=ignoreboth while IFS= read -rep "> $1 " line; do history -s "$line" eval "$1 $line" done
El historial no se guarda cuando el script está a punto de cerrarse; aún así, durante una única invocación debería funcionar ( ↑/ ↓como normalmente en Bash).