Terminal de prefixo "virtual" Bash

Terminal de prefixo "virtual" Bash

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-cmdcomo no seu exemplo.

A nota firewall-cmdfica "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; dateserá executada firewall-cmd --list-alle 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).

informação relacionada