Terminal de prefijo "virtual" de Bash

Terminal de prefijo "virtual" de Bash

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-cmdcomo en tu ejemplo.

La nota firewall-cmdse "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-cmdla escritura y (no ).--list-all; datefirewall-cmd --list-alldatefirewall-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).

información relacionada