Bash“虚拟”前缀终端

Bash“虚拟”前缀终端

我正在使用firewall-cmd 设置防火墙,但一直输入firewall-cmd 就需要花费大量时间。

是否可以创建临时的“虚拟”shell 或者将防火墙命令附加到每个以下输入之后的东西?

例子 :

$ 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像您的示例中那样调用。

注意firewall-cmd会“粘”到您输入的每一行开头,但评估结果字符串的仍然是 shell。因此 $*、 、;#、 引号等仍然是特殊的。特别是在 之后coolcommand firewall-cmd,输入--list-all; date将运行firewall-cmd --list-alland 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 中一样)。

相关内容