Bash "가상" 접두사 터미널

Bash "가상" 접두사 터미널

Firewall-cmd를 이용하여 방화벽을 설정하고 있는데, 항상 Firewall-cmd만 입력하는 것만으로도 시간이 많이 걸립니다.

임시 "가상" 셸을 만들거나 다음 각 입력에 방화벽 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그런 다음 귀하의 예와 같이 호출하십시오 .

Note는 firewall-cmd입력하는 모든 줄의 시작 부분에 "접속"되지만 결과 문자열을 평가하는 것은 여전히 ​​셸입니다. 그래서 $, *, ;, #, 따옴표 등은 여전히 ​​특별합니다. 특히 다음에 coolcommand firewall-cmd입력하면 및 (가 아님 )이 --list-all; date실행됩니다 .firewall-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의 일반적인 방식과 동일).

관련 정보