При использовании grep
или egrep
для поиска выходных данных из программы с параметром --help
печатается полный вывод вместо совпадающих строк.
Пример:
ssh-keygen --help | grep "known_hosts"
unknown option -- -
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
[-N new_passphrase] [-C comment] [-f output_keyfile]
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
ssh-keygen -i [-m key_format] [-f input_keyfile]
ssh-keygen -e [-m key_format] [-f input_keyfile]
ssh-keygen -y [-f input_keyfile]
// etc
При поиске такого параметра, как ssh-keygen --help | grep "-p"
, grep распознает этот параметр для себя. Выход из тире (то есть grep "\-p"
) не помогает.
Пример:
ssh-keygen --help | grep "-p"
grep: invalid option -- 'p'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
unknown option -- -
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
[-N new_passphrase] [-C comment] [-f output_keyfile]
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
ssh-keygen -i [-m key_format] [-f input_keyfile]
ssh-keygen -e [-m key_format] [-f input_keyfile]
ssh-keygen -y [-f input_keyfile]
ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
ssh-keygen -B [-f input_keyfile]
Как это решить? Спасибо за любую помощь!
ssh-keygen
команда не имеет a --help
опция, таким образом, это печатает “неизвестную опцию” ошибка, тихо думает “прочитайте руководство” и производит справку. Это делает это не на stdout, а на stderr, который не передается по каналу с |
но только с |&
(который является a bash
сокращение от 2>&1 |
):
$ ssh-keygen --help |& grep "known_hosts"
ssh-keygen -F hostname [-f known_hosts_file] [-l]
ssh-keygen -H [-f known_hosts_file]
ssh-keygen -R hostname [-f known_hosts_file]
Полностью другой вопрос grep
распознавание поискового выражения как опция, потому что это запускается с дефиса. К счастью, grep
одна из многих команд, которые распознают “конец опций” --
опция и берет все позади него как аргумент вместо опции:
$ ssh-keygen --help |& grep -- -p
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
man grep
даже не упоминает это, но здесь описание этой опции от bash
руководство:
A
--
сигнализирует о конце опций и отключает дальнейшую обработку опции. Любые аргументы после--
рассматриваются как имена файлов и аргументы.
grep
также обеспечивает второй способ иметь дело с началом шаблонов “-”: -e
опция берет шаблон в качестве своего аргумента, таким образом следующее одинаково возможно:
$ ssh-keygen --help |& grep -e -p
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
Если то, что Вы ищете, является справкой на попытке команды ssh-keygen
man ssh-keygen | grep known_hosts
Или, можно сделать man ssh-keygen
из командной строки и затем нажимают / и вводят критерий поиска, например, "kno", нажимают Enter, используют n для продолжения к следующему экземпляру критерия поиска (man man
для большего количества информации об использовании man
). Отметьте man
ищите только поиски вниз, так используйте PgUp или Домой возвратиться к запуску ручной записи прежде, чем запустить новый поиск.
Вы звоните ssh-keygen
с несуществующей опцией. Это - ошибка, и вывод ошибок появляется на stderr. Это не появляется как ssh-keygen
имеет регулярную опцию для вывода ее использования: если это имело (как программы GNU, имеют по умолчанию с --help
), тот "регулярный" вывод появился бы на stdout и был бы доступен для меньше в канале, который Вы использовали.
Вы можете клудж вокруг этого использования ssh-keygen --help 2>&1 | grep -e "-p"
: 2>&1
перенаправления stderr к stdout, где канал может поймать его, и -e
поскольку опция к grep означает, что "следующее является regexp, чтобы использовать, даже если это похоже на опцию".
man ssh-keygen
должен работать лучше на получение использования и передаст по каналу в less
по умолчанию, где можно искать регулярные выражения с /
, и чтение в контексте обычно является лучшим выбором.