Вопрос или проблема
Я часто открываю страницы man определенного инструмента командной строки только для того, чтобы проверить определенный флаг, например, man iptables
, чтобы проверить флаг -t
.
Существует ли какой-либо инструмент, который упрощает это? Я мог бы, конечно, написать простую функцию на Bash, которая будет искать содержимое man страниц, но я ищу что-то, что использует структуру man страниц, чтобы находить именно то, что мне нужно (то есть описание определенного флага).
Предполагая, что ваш man pager — less
, вы можете передать любую команду в less
заранее, используя переменную окружения LESS
.
Поэтому для поиска опции -t
команды man iptables
:
LESS='+/-t' man iptables
Это имеет тот же эффект, что и запуск /-t
внутри man iptables
. Вы можете изменить шаблон для более точного управления.
Если хотите, вы можете сделать функцию для более удобного доступа:
search_man () { LESS=+/"$2" man "$1" ;}
Теперь запустив:
search_man iptables '-t'
это даст тот же эффект.
ПРАВКА:
Если вы хотите перейти к конкретной опции man страницы, а не искать, вы можете использовать регулярные выражения с LESS
:
LESS='+/^[[:blank:]]+-t' man iptables
это приведет вас прямо к описанию опции -t
в man iptables
. Вы также можете определить функцию аналогично:
search_man () { LESS=+/^[[:blank:]]+"$2" man "$1" ;}
Я не нашел API/механизм для запроса man страниц по определенному флагу. Однако эта простая функция похоже делает то, что мне нужно:
function manswitch () { man $1 | less -p "^ +$2" }
Использование:
manswitch iptables -t
Есть одно дело. Сейчас. Эта функция:
flag() {
man "$1" | grep -- "$2";
}
Она работает так:
$ flag iptables -t
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
target = -j targetname [per-target-options]
-t, --table table
Это стандартная таблица (если не передан флаг -t). Это
iptables -t nat -n -L
Ну что ж, последние две строки порушены.
В любом случае, вы знаете, как добавить это в ваш .bashrc
? Или вы предпочитаете это как скрипт в вашем ~/bin
?
VERSION 1.1
flag() {
man "$1" | grep -A5 -- "$2";
}
$ flag iptables -t
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
DESCRIPTION
Iptables и ip6tables используются для настройки, поддержания и проверки таблиц правил фильтрации пакетов IPv4 и IPv6 в ядре Linux. Может быть определено несколько различных таблиц. Каждая таблица содержит
несколько встроенных цепочек и может также содержать пользовательские цепочки.
--
-t, --table table
Эта опция указывает таблицу сопоставления пакетов, с которой должна работать команда. Если ядро сконфигурировано с автоматической загрузкой модулей, будет сделана попытка загрузить соответствующий
модуль для этой таблицы, если он еще не загружен.
Таблицы следующие:
--
Это стандартная таблица (если не передан флаг -t). Она содержит встроенные цепочки INPUT (для пакетов, направленных на локальные сокеты), FORWARD (для пакетов, проходящих через
систему) и OUTPUT (для пакетов, сгенерированных локально).
nat:
Эта таблица используется, когда встречается пакет, который создает новое соединение. Она состоит из трех встроенных: PREROUTING (для изменения пакетов, как только они поступают), OUTPUT (для
изменения пакетов, сгенерированных локально, перед маршрутизацией) и POSTROUTING (для изменения пакетов, когда они собираются выйти). Поддержка NAT для IPv6 доступна с ядра 3.7.
--
iptables -t nat -n -L
Обратите внимание, что часто используется с опцией -n, чтобы избежать долгих обратных DNS-запросов. Также законно указать опцию -Z (ноль), в этом случае цепочка(и) будут
перечислены и обнулены атомарно. Точный вывод зависит от других указанных аргументов. Точные правила подавляются, пока вы не используете
iptables -L -v
-S, --list-rules [chain]
Я пока не могу комментировать, но вот более гибкий вариант хорошей функции manswitch из принятого ответа, которая также находит опции, такие как длинные опции, которые перечислены после других опций:
function manswitch () { man "$1" | less -p "^ +(-.*, )?$2" }
Например, manswitch ls -r
и manswitch ls --reverse
оба будут работать. С оригинальным manswitch работает только первый вариант, так как соответствующая строка в man странице -r, --reverse
.
Ответ или решение
Запрос страницы man в Linux для определенного флага
Вызов страниц man для проверки определенных флагов команд является распространенной задачей для системных администраторов и разработчиков, работающих на платформе Linux. Для упрощения этого процесса можно использовать несколько удобных подходов, учитывающих структуру страниц man.
Основной способ: использование переменной окружения LESS
Если предполагается, что ваш просмотрщик man – это less
, можно заранее указать команду для less
через переменную окружения LESS
. Это позволяет автоматически перейти к нужной части man-страницы.
Например, для проверки флага -t
для iptables
можно использовать следующую команду:
LESS='+/-t' man iptables
Этот подход эквивалентен тому, чтобы вручную ввести /
в man-странице и ввести искомый флаг. Вы также можете изменять шаблон поиска для улучшенной точности.
Упрощение процесса с помощью функции Bash
Чтобы сделать доступ к этому процессу более удобным, можно создать функцию в файле .bashrc
:
search_man () { LESS=+"$2" man "$1"; }
После добавления этой функции в .bashrc
, можно выполнять команды следующим образом:
search_man iptables '-t'
Это приведет вас к описанию флага -t
в man-странице iptables
.
Поиск с помощью регулярных выражений
Если вы хотите не только найти, но и перейти непосредственно к описанию нужного флага, можно использовать регулярные выражения для более точного совпадения:
LESS='+/^[[:blank:]]+-t' man iptables
Эта команда позволит вам перейти прямо к описанию флага -t
, избегая лишних прокруток.
Можно добавить аналогичную функцию в .bashrc
:
search_man () { LESS="+/^[[:blank:]]+$2" man "$1"; }
Альтернативные функции
Некоторые пользователи также находят полезными такие функции, как manswitch
, позволяющие находить описания опций более элегантным способом:
function manswitch () { man "$1" | less -p "^ +$2"; }
Вы можете вызывать эту функцию следующим образом:
manswitch iptables -t
Также есть возможность улучшить эту функцию для работы с длинными флагами:
function manswitch () { man "$1" | less -p "^ +(-.*, )?$2"; }
Теперь можно будет находить как краткие (-r
), так и длинные (--reverse
) флаги.
Заключение
С помощью этих приемов вы сможете эффективно искать и просматривать конкретные флаги в man-страницах команд Linux. Все предложенные функции помогают сэкономить время и облегчают процесс поиска информации, улучшая вашу работу в командной строке. Не забудьте добавить функции в ваш .bashrc
или использовать их в своем собственном скрипте в каталоге ~/bin
для удобства.
SEO-оптимизация
Если вы хотите оптимизировать вашу страницу или статью, связав ее с этой темой, подумайте о добавлении ключевых слов, таких как "Linux", "man pages", "CLI tools", "Bash function", и "системные администраторы". Это поможет улучшить видимость вашего контента в поисковых системах.