Bash「仮想」プレフィックスターミナル

Bash「仮想」プレフィックスターミナル

私は、firewall-cmd を使用してファイアウォールを設定していますが、常に firewall-cmd と入力するだけでかなりの時間がかかります。

一時的な「仮想」シェルなどを作成し、後続の各入力にfirewall-cmdを追加することは可能ですか?

例 :

$ 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入力するすべての行の先頭に が「貼り付け」られますが、結果の文字列を評価するのは依然としてシェルです。したがって 、、、、$引用符などは依然として特別です。特に の後に と入力すると および が実行されます(ではありません)。*;#coolcommand firewall-cmd--list-all; datefirewall-cmd --list-alldatefirewall-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 で通常どおり/のように)。

関連情報