我如何使用手册页来学习如何使用命令?


92

在研究另一个问题时,我遇到了一个命令

locate something | xargs -I {} bash -c "if [ -d "{}" ]; then echo {}; fi"

我想了解更多。因此,我运行man xargs并获得以下输出:

XARGS(1)                    General Commands Manual                   XARGS(1)

NAME
       xargs - build and execute command lines from standard input

SYNOPSIS
       xargs  [-0prtx]  [-E  eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null]
       [-d delimiter] [--delimiter delimiter]  [-I  replace-str]  [-i[replace-
       str]]    [--replace[=replace-str]]   [-l[max-lines]]   [-L   max-lines]
       [--max-lines[=max-lines]] [-n max-args] [--max-args=max-args] [-s  max-
       chars]  [--max-chars=max-chars]  [-P max-procs] [--max-procs=max-procs]
       [--interactive]      [--verbose]      [--exit]      [--no-run-if-empty]
       [--arg-file=file]   [--show-limits]   [--version]   [--help]   [command
       [initial-arguments]]

DESCRIPTION
       This manual page documents the GNU version of xargs...

我正在尝试更好地使用文档来学习Linux程序,但是“提要”部分对新用户来说是令人生畏的。与man locate或相比,字面上看起来像胡言乱语man free

到目前为止,我知道方括号表示可选,嵌套括号表示可选中的选项。但是我应该如何用它来诱导一个有效的命令呢?

我不是在这里寻求有关xargs的帮助。 我在寻求帮助来解释手册页以了解复杂的命令。我不想再将Google索引的网络博客和他人的个人帮助作为学习Linux命令的第一种方法。


17
继续阅读手册页。“选项”部分说明了“摘要”部分中的所有可用选项。
约翰

7
始于man man
mikeserv 2015年

14
通常,直接转到底部并查找示例部分。
teppic 2015年

9
并且不要只扫描手册页中的关键字。真的看了!假设的奇怪行为通常会得到很好的解释。
FloHimself 2015年

6
man man看完之后man intro
mikeserv

Answers:


102

好吧,这是我阅读手册的非常个人的方式:

手册页

当您使用man命令打开联机帮助页时,输出将通过lessmore命令或将被设置为您的传呼器(manpager)的任何其他命令显示/渲染。

如果您使用的是Linux,则可能已将您的man基础结构配置为使用/usr/bin/less -is,除非您已安装了一些最低发行版man(1),否则请在“选项”部分中进行解释:

-P pager
Specify which pager to use. This option overrides the MANPAGER environment variable, 
which in turn overrides the PAGER variable. By default, man uses /usr/bin/less -is.

在FreeBSD和OpenBSD上,只需编辑MANPAGER环境变量即可,因为它们大多会使用more,而某些功能(例如搜索和文本突出显示)可能会丢失。

有一个很好的回答了什么分歧的问题morelessmost已经在这里(从来没有使用过most)。在浏览联机帮助页时,必不可少的功能是使用或(也使用绑定和)Space或者使用行或行(同时使用vi绑定jk)来向后滚动和向前滚动。h在使用时按less可查看可用命令的摘要。

这就是为什么我建议您less用作寻呼机的原因。less具有一些基本功能,将在此答案中使用。

命令的格式如何?

实用程序约定:开放组基本规范第7版-IEEE Std 1003.1,2013版。在尝试理解联机帮助页之前,您应该访问该链接。此在线参考描述了标准实用程序的参数语法,并介绍了整个POSIX.1-2017使用的术语,用于描述实用程序处理的参数。这也将间接使您了解诸如参数,参数,参数选项之类的单词的真实含义。

在理解了实用程序约定的概念后,任何联机帮助页的标题对您来说都显得不太神秘:

utility_name[-a][-b][-c option_argument]
    [-d|-e][-f[option_argument]][operand...]

请记住您要做什么。

在进行有关您的研究xargs时,是出于目的,对吗?您有一个特殊的需求,那就是读取标准输出并基于该输出执行命令。

但是,当我不知道要哪个命令时?

使用man -kapropos(它们等效)。如果我不知道如何查找文件:man -k file | grep search。阅读说明并找到最适合您需求的说明。例:

apropos -r '^report'
bashbug (1)          - report a bug in bash
df (1)               - report file system disk space usage
e2freefrag (8)       - report free space fragmentation information
filefrag (8)         - report on file fragmentation
iwgetid (8)          - Report ESSID, NWID or AP/Cell Address of wireless network
kbd_mode (1)         - report or set the keyboard mode
lastlog (8)          - reports the most recent login of all users or of a given user
pmap (1)             - report memory map of a process
ps (1)               - report a snapshot of the current processes.
pwdx (1)             - report current working directory of a process
uniq (1)             - report or omit repeated lines
vmstat (8)           - Report virtual memory statistics

Apropos默认情况下使用正则表达式(man apropos,请阅读说明并找出结果-r),在本示例中,我正在寻找说明以“ report”开头的每个联机帮助页。

要查找与读取标准输入/输出处理和达成xargs可能的选项有关的信息:

man -k command| grep input
xargs (1)            - build and execute command lines from standard input

DESCRIPTION开始之前请务必阅读

花一些时间阅读说明。通过仅阅读xargs命令的描述,我们将了解到:

  • xargs从STDIN读取并执行所需的命令。这也意味着您将需要了解标准输入的工作方式,以及如何通过管道操作以链接命令
  • 默认行为是/bin/echo。这给您一些提示,如果您需要链接多个xargs,则不需要使用echo即可打印。
  • 我们还了解到,unix文件名可以包含空格和换行符,这可能是一个问题,并且该参数-0是通过使用空字符分隔符防止事物爆炸的一种方法。该描述警告您,用作输入的命令也需要支持此功能,并且GNU也支持该功能find。大。我们在中使用了很多查找功能xargs
  • xargs 如果达到退出状态255,将停止。

一些描述非常简短,通常是因为该软件以非常简单的方式工作。甚至不要考虑跳过手册页的这一部分 ;)

其他注意事项...

您知道可以使用来搜索文件find。这里有很多选择,如果您只看一下SYNOPSIS,您会被那些淹没。这只是冰山一角。不包括NAMESYNOPSISDESCRIPTION,您将拥有以下部分:

  • AUTHORS:创建或协助创建命令的人员。

  • BUGS:列出任何已知的缺陷。可能仅仅是实现限制。

  • ENVIRONMENT:shell的各个方面可能会受到命令或将要使用的变量的影响。

  • EXAMPLESNOTES:不言自明。

  • REPORTING BUGS:如果您在此工具或其文档中发现错误,则必须与谁联系。

  • COPYRIGHT:创建和免责声明有关该软件的人。所有与软件本身的许可证有关。

  • SEE ALSO:与该命令相关的其他命令,工具或工作方面,其他任何部分均不适用。

您很可能会在示例/注释部分中找到有关所需工具方面的有趣信息。

在下面的步骤中,我将find以其为例,因为它的概念比xargs解释的“更简单” (一个命令查找文件,另一个处理stdin和其他命令输出的流水线执行)。假设我们对此命令一无所知

我有一个特定的问题:我必须.jpg在ftp服务器文件夹中查找每个扩展名为500KiB(KiB = 1024字节,通常称为kibibyte)或更大的文件。

首先,打开手册:man find。该SYNOPSIS是渺茫。让我们搜索手册中的内容:键入/所需的单词(size)。它将索引很多条目-size,这些条目将计算特定的大小。被困。不知道如何用“大于”或“小于”给定的大小进行搜索,而那个人没有向我显示。

让我们尝试一下,然后点击来搜索找到的下一个条目n。好。发现了一些有趣的东西:find \( -size +100M -fprintf /root/big.txt %-10s %p\n \)。也许此示例向我们表明,-size +100M它将找到100MB或更大的文件。我该如何确认?转到手册页的开头并搜索其他单词。

再次,让我们尝试一下这个词greater。按下g将把我们带到联机帮助页的开头。/greater,第一个条目是:

 Numeric arguments can be specified as

    +n     for **greater** than n,

    -n     for less than n,

     n      for exactly n.

听起来不错。手册的这一部分似乎证实了我们的怀疑。但是,这不仅适用于文件大小。它适用于n在此联机帮助页上可以找到的任何内容(如短语所说:“可以将数字参数指定为”)。

好。让我们找到一种按名称过滤的方法:g /insensitive。为什么?不敏感?WTF?我们有一个假设的FTP服务器,其中“其他OS”的人可以给一个文件名以扩展为.jpg.JPG.JpG。这将导致我们:

-ilname pattern
              Like  -lname,  but  the  match  is  case insensitive.  If the -L
              option or the -follow option is in  effect,  this  test  returns
              false unless the symbolic link is broken.

但是,在搜索之后,lname您会看到这只会搜索符号链接。我们需要真实的文件。下一个条目:

   -iname pattern
          Like -name, but the match is case insensitive.  For example, the
          patterns `fo*' and `F??' match  the  file  names  `Foo',  `FOO',
          `foo',  `fOo',  etc.   In these patterns, unlike filename expan‐
          sion by the shell, an initial '.' can be matched by  `*'.   That
          is, find -name *bar will match the file `.foobar'.   Please note
          that you should quote patterns as a matter of course,  otherwise
          the shell will expand any wildcard characters in them.

大。我甚至都不需要阅读有关-name一看就知道-iname是这种说法的不区分大小写版本。让我们汇编命令:

命令: find /ftp/dir/ -size +500k -iname "*.jpg"

这是隐含的内容:知道通配符?表示“单个位置的任何字符”,并且*表示“零个或多个任何字符”。该-name参数将为您提供这一知识的摘要。

适用于所有命令的提示

某些选项,助记符和“语法样式”遍历所有命令,从而使您不必完全打开联机帮助页就能花些时间。这些是通过实践学习的,最常见的是:

  • 通常,-v表示冗长。-vvv是某些软件上的“非常详细”变体。
  • 遵循POSIX标准,通常可以堆叠一个破折号参数。范例:tar -xzvfcp -Rv
  • 通常-R和/或-r意味着递归。
  • 几乎所有命令都对该--help选项有简要帮助。
  • --version 显示软件的版本。
  • -p,在复制或移动实用程序上表示“保留权限”。
  • -y 表示是,或在大多数情况下“未经确认进行”。

请注意,以上内容并不总是正确的。例如,对于不同的软件,-r切换可能意味着完全不同的事物。检查并确保命令何时有危险总是一个好主意,但这是常见的默认设置。

命令的默认值。

在此答案的寻呼机块中,我们看到的less -is是的寻呼机man。命令的默认行为并不总是显示在手册页上的单独部分或最顶部的部分。

您将必须阅读选项以找出默认值,或者,如果幸运的话,键入/pager将带您进入该信息。这也需要您了解传呼机(滚动手册页的软件)的概念,这是在阅读大量手册页之后才需要了解的内容。

为什么这么重要?如果您在例如man(1)Linux(less -ispager)或FreeBSD 上阅读时发现滚动和颜色行为上的差异,这将打开您的感知man(1)

SYNOPSIS语法呢?

在获得执行命令所需的所有信息之后,您可以内联组合选项,选项参数和操作数以完成工作。概念概述:

  • 选项是决定命令行为的开关。“ 不要这样 ”,“ 不这样做 ”或“ 这样的行为。” 通常称为开关。
  • 在大多数情况下,当选项不是二进制文件(打开/关闭)(如-t在安装时)时,都会使用选项参数,该选项指定文件系统的类型(-t iso9660-t ext2)。“ 闭眼做这件事 ”或“ 喂动物,但只喂狮子 ”。也称为参数。
  • 操作数是您希望命令执行操作的对象。如果使用 cat file.txt,则操作数是当前目录内的文件,其内容将显示在上STDOUTls是一个操作数为可选的命令。操作数后面的三个点隐式告诉您cat可以同时作用于多个操作数(文件)。您可能会注意到,某些命令设置了它将使用的操作数类型。例:cat [OPTION] [FILE]...

相关内容简介:

什么时候该方法不起作用?

  • 没有示例的联机帮助页
  • 选项简短说明的联机帮助页
  • 当您使用通用的关键字,例如andtofor联机帮助页内
  • 未安装的联机帮助页。这似乎很明显,但是,如果您没有安装lftp(及其手册页),则无法通过运行以下命令来确定它是否是更复杂的ftp客户端的合适选择man -k ftp

在某些情况下,示例将非常简单,并且您必须对命令进行一些执行以进行测试,或者在最坏的情况下,必须使用Google进行测试。

其他:编程语言及其模块:

如果您正在编程或仅创建脚本,请记住,某些语言拥有它自己的联机帮助页系统,例如perlperldocs),python(pydocs)等,其中包含有关方法/功能,变量,行为的特定信息以及有关模块的其他重要信息您正在尝试使用和学习。当我创建脚本以使用该perl Mail::IMAPClient模块下载未读的IMAP电子邮件时,这对我很有用。

您将不得不通过使用man -k或在线搜索来找出那些特定的联机帮助页。例子:

[root@host ~]# man -k doc | grep perl
perldoc              (1)  - Look up Perl documentation in Pod format


[root@host ~]# perldoc Mail::IMAPClient
IMAPCLIENT(1)         User Contributed Perl Documentation        IMAPCLIENT(1)

NAME
       Mail::IMAPClient - An IMAP Client API

SYNOPSIS
         use Mail::IMAPClient;

         my $imap = Mail::IMAPClient->new(
           Server   => ’localhost’,
           User     => ’username’,
           Password => ’password’,
           Ssl      => 1,
           Uid      => 1,
         );

...这里还有很多其他内容,例如常规手册页...

使用python:

[root@host ~]# pydoc sys
Help on built-in module sys:

NAME
    sys

FILE
    (built-in)

MODULE DOCS
    http://www.python.org/doc/current/lib/module-sys.html

DESCRIPTION
    This module provides access to some objects used or maintained by the
    interpreter and to functions that interact strongly with the interpreter.
...again, another full-featured manpage with interesting info...

或者,help()如果您想阅读某些对象的更多详细信息,请在python shell中使用funcion:

nwildner@host:~$ python3.6
Python 3.6.7 (default, Oct 21 2018, 08:08:16)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> help(round)

Help on built-in function round in module builtins:

round(...)
    round(number[, ndigits]) -> number

    Round a number to a given precision in decimal digits (default 0 digits).
    This returns an int when called with one argument, otherwise the
    same type as the number. ndigits may be negative.

奖励:wtf命令可以为您提供首字母缩写词,并且whatis好像在其数据库上未找到首字母缩写词一样起作用,但是您要搜索的内容是man数据库的一部分。在Debian上,此命令是bsdgames软件包的一部分。例子:

nwildner@host:~$ wtf rtfm
RTFM: read the fine/fucking manual
nwildner@host:~$ wtf afaik
AFAIK: as far as I know
nwildner@host:~$ wtf afak
Gee...  I don't know what afak means...
nwildner@host:~$ wtf tcp
tcp: tcp (7)              - TCP protocol.
nwildner@host:~$ wtf systemd
systemd: systemd (1)          - systemd system and service manager

您也可以man find | grep ...。我喜欢man command | sed -n '/^[[:space:]]*-/,/^$/p'
mikeserv 2015年

6
对。您可以。我只是假设操作员是“菜鸟”,并试图开始使用手册页:)

3
此答案必须是“如何有效使用man?” 的最高结果。谢谢你,做得好。
user1717828 2015年

8
@nwildner,您应该得到如此庞大且格式正确的答案之后的糖果。做得好!
Willian Paixao 2015年

6
我认为这应该添加到Linux中。man当然是一页。
myaut 2015年

38

这在以下内容中有很好的解释man man

   The following conventions apply to the SYNOPSIS section and can be used
   as a guide in other sections.

   bold text          type exactly as shown.
   italic text        replace with appropriate argument.
   [-abc]             any or all arguments within [ ] are optional.
   -a|-b              options delimited by | cannot be used together.

   argument ...       argument is repeatable.
   [expression] ...   entire expression within [ ] is repeatable.

至于您应该如何从中编写有效的命令,那不是。一旦您知道命令的工作原理,该提要就会很有用。它可以帮助您刷新记忆。为了了解该命令的工作原理,您应该阅读手册页。特别是选项和示例部分的描述。

有时概要就足够了。例如,在man ls

SYNOPSIS
       ls [OPTION]... [FILE]...

在其他时候,除非您已经知道如何使用该命令,否则它是没有用的。例如man dd

   dd [OPERAND]...
   dd OPTION

因此,总而言之,如果您没有得到提要,请不要担心。那很正常 阅读手册页本身。


谢谢您的建议,尤其是“至于如何...”段。
user1717828 2015年

21

了解概要的一些基础知识

  • 每个[foo]代表可选参数或参数。
  • 使用[foo [ bar ] ]语法时,可以使用foo,还可以添加bar。
  • 强制选项参数以这种方式使用[ -S size ],它告诉-S参数正在等待强制大小。

例如 : foo [-S size ] filename ...

手段

  • 命令是 foo
  • -S可以使用可选参数,您必须告诉size(名称会提示您)
  • 强制性参数是filename(这也给您一个提示,请参阅man mkdir
  • 省略号...告诉您可以使用多个文件。

您仍然必须深入手册页以了解选项(在上述示例中,有关什么-S size


14

manless现在通常显示页面。这样就可以搜索它们。我不会打扰您的提要,特别是不会因为您有要理解的特定命令行而感到烦恼。

点击/并开始输入-I,然后Enter。第一次点击将在摘要中,第二次(n用于下一个)为您提供详细的解释-I


11

要记住的一件事是,对于执行其他命令的命令,您不能只查看一个命令的手册。

对于您的示例命令

locate something | xargs -I {} bash -c "if [ -d "{}" ]; then echo {}; fi"

您不仅需要信息,xargs而且还需要bash[(可能在手册test页中)。由于命令中包含复杂的带引号的字符串,因此您可能还需要在shell上获取有关引号规则的信息(可能还包括bash)。我已经可以告诉您引用的参数是错误的(并且错误的方式只会在您遇到名称中带有空格的文件时才会显示);内部"{}"应该是'{}'

所以,首先你要提到xargs的手册页,看看[-I replace-str]什么-I {}意思,和[command [initial-arguments]]什么bash意思后,一切。然后,您可以参考手册中的bash内容-c,等等。


6

补充已经给出的好答案:

1)如果您对gnu实用程序特别是sedand和感兴趣grep,有时使用该info命令将显示该命令信息的扩展版本。sed,例如,其中有一章详细介绍了如何编写正则表达式,另一章则包含了一些非常复杂的用法示例。

2)这是“手册”。手册的主要目的是帮助您记住已经理解的细节。它的设计使您可以快速获取所需的详细信息并下车。(而且太多的方法没有用法示例,或者只有琐碎的示例。)

当我需要学习新的东西,甚至不是很清楚,我命令的一个小功能,我去到网上,并使用我能想到的(例如,最好的关键字搜索Linux xargs),并添加文字howtoexamplestutorial。这通常非常有生产力。

我通常使用duckduckgo是因为它可以保护我的隐私,但是如果我需要对搜索进行更多控制,则可以使用Google,因为我可以告诉它只在一个网站内搜索或仅返回上一年的结果。(它还有许多其他高级搜索选项。您可以将其谷歌搜索。;))

另一个提示:

对于我经常引用的命令,我将手册页保存在一个文本文件中

man bash > bashman.txt

并将该文件加载到我的文本编辑器中的另一个窗口中,这样我就可以来回翻转,复制和粘贴等。我通常使该文件为只读文件,因此我不会最终偶然地对其进行处理,但是由于这是我的个人副本,我可以用任何想要的方式对其进行编辑,添加标签,这样我可以更轻松地找到一个部分,甚至添加自己的注释或示例。

唯一的缺点是原始手册页可能已更新,并且我的副本是静态的。


4

要获得有关特定命令的快速帮助,可以使用Explain Shell。例如,您的命令。在初步了解其工作原理后,应按照其他答案的建议继续进行联机帮助。


2

有两个有用的工具可以了解有关linux命令的更多信息:

  1. cheat将显示命令行的常用选项。您也可以添加自己的命令command + option以显示cheat特定命令。
  2. bropages该工具为命令行提供了一些示例,可以在通过验证代码后添加您自己的示例或对给定的示例进行投票bro thanks。必须投票的命令将显示在bro页面顶部。

1

我建议tldr使用类似人的综合工具。简化且由社区驱动的手册页。在Ubuntu中,您可以通过snap安装它,但是它也具有其他发行版的版本。它还为您提供了几种常见的示例用法。100%推荐。


0

>我正在寻求帮助来解释手册页以了解复杂的命令。

我认为这就是误解。使Linux / UNIX如此强大的原因是,您可以构造非常长且有效的命令,例如locatexargs通过管道(|)将一个命令(在此处)的标准输出重定向到另一命令(在此处)的标准输入。因此,正如Random832正确地说的那样,您将找不到一个说明您的示例命令的功能的手册页。

我建议您阅读Linux shell脚本指南。《高级Bash脚本指南》是一个很好的文档。请不要被它吓倒;精通Linux需要数年的时间,并且是一个永无止境的过程,但是您可以在合理的时间内学习基础知识。

然后,当您需要了解特定命令的详细信息时,请参考联机帮助页。

一旦掌握了要点,CommandlinefuBash One-Liners也值得一读,以获取良好的示例。


-1

要在手册页中的命令中搜索特定内容,可以使用:

man echo | grep output.

但是要搜索开关(例如-n),您必须以这种方式使用它:

man echo | grep -- -n
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.