![Bash «виртуальный» префиксный терминал](https://rvso.com/image/1607084/Bash%20%C2%AB%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%C2%BB%20%D0%BF%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9%20%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B0%D0%BB.png)
Я настраиваю брандмауэр с помощью 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; date
будет выполняться firewall-cmd --list-all
и 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).