rap*_*cke 8 command-line bash grep
当使用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
Run Code Online (Sandbox Code Playgroud)
当搜索像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]
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?谢谢你的帮助!
des*_*ert 17
该ssh-keygen命令没有--help选项,所以它打印“未知选项”错误,默默地思考“RTFM”并输出帮助。它不是在 stdout 上执行此操作,而是在stderr上执行此操作,后者不是通过管道传输的,|而是仅使用|&(这是 的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]
Run Code Online (Sandbox Code Playgroud)
一个完全不同的问题是grep将您的搜索表达式识别为一个选项,因为它以连字符开头。幸运的grep是,它是识别“--选项结束”选项并将其后面的所有内容作为参数而不是选项的众多命令之一:
$ ssh-keygen --help |& grep -- -p
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
Run Code Online (Sandbox Code Playgroud)
man grep甚至没有提到它,但这是bash手册中此选项的描述:
A
--表示选项结束并禁用进一步的选项处理。之后的任何参数--都被视为文件名和参数。
grep还提供了处理以“-”开头的模式的第二种方法:该-e选项将模式作为其参数,因此以下同样可能:
$ ssh-keygen --help |& grep -e -p
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
Run Code Online (Sandbox Code Playgroud)