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

use*_*828 95 man

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

locate something | xargs -I {} bash -c "if [ -d "{}" ]; then echo {}; fi"
Run Code Online (Sandbox Code Playgroud)

我想了解更多。所以我运行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...
Run Code Online (Sandbox Code Playgroud)

我试图更好地使用文档来了解 Linux 程序,但是“概要”部分对新用户来说是令人生畏的。与man locateor相比,它字面上看起来像是胡言乱语man free

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

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

小智 105

好吧,这是我阅读联机帮助页的非常个人的方式:

手册页

当您使用该man命令打开联机帮助页时,输出将由lessmore命令或将设置为您的寻呼机(联机帮助页)的任何其他命令显示/呈现。

如果您使用的是 Linux,则您的 man 基础设施可能已经配置为使用/usr/bin/less -is(除非您安装了一些最小的发行版) as 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.
Run Code Online (Sandbox Code Playgroud)

在 FreeBSD 和 OpenBSD 上只是编辑MANPAGER环境变量的问题,因为它们主要使用more,并且可能缺少搜索和文本突出显示等一些功能。

有一个很好的回答了什么分歧的问题morelessmost已经在这里(从来没有使用过most)。在浏览联机帮助页时,Space能够使用?or ?(也使用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...]
Run Code Online (Sandbox Code Playgroud)

记住你想做什么。

当你做你的研究时,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
Run Code Online (Sandbox Code Playgroud)

默认情况下,Apropos 使用正则表达式, ( man apropos,阅读描述并找出是什么-r),在这个例子中,我正在寻找描述以“report”开头的每个联机帮助页。

查找与阅读标准输入/输出处理相关的信息并xargs作为可能的选项:

man -k command| grep input
xargs (1)            - build and execute command lines from standard input
Run Code Online (Sandbox Code Playgroud)

DESCRIPTION在开始之前总是阅读

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

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

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

其他注意事项...

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

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

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

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

  • EXAMPLESNOTES:不言自明。

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

  • COPYRIGHT: 软件的创建者和免责声明。都与软件本身的许可有关。

  • SEE ALSO: 与此命令相关的其他命令、工具或工作方面,不能放在任何其他部分。

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

例子

在以下步骤中,我将find作为示例,因为它的概念比xargs解释“更简单” (一个命令查找文件,另一个处理标准输入和其他命令输出的流水线执行)。让我们假装我们对这个命令一无所知(或知之甚少)。

我有一个特定的问题是:我必须.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.
Run Code Online (Sandbox Code Playgroud)

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

好的。让我们找到一种按名称过滤的方法:g /insensitive。为什么?不敏感?哇?我们有一个假设的 ftp 服务器,“那个其他操作系统”的人可以在其中给出一个扩展名为.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.
Run Code Online (Sandbox Code Playgroud)

但是,在您搜索之后,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.
Run Code Online (Sandbox Code Playgroud)

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

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

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

适用于所有命令的提示

一些选项、助记符和“语法风格”贯穿所有命令,让您无需打开手册页就可以节省一些时间。这些是通过实践学习的,最常见的是:

  • 一般来说,-v意思是冗长的。-vvv是某些软件上“非常非常冗长”的变体。
  • 按照 POSIX 标准,通常可以堆叠一个破折号参数。示例:tar -xzvf, cp -Rv
  • 一般-R和/或-r意味着递归。
  • 几乎所有命令都有关于该--help选项的简短帮助。
  • --version 显示软件的版本。
  • -p, 在复制或移动实用程序上意味着“保留权限”。
  • -y 在大多数情况下,表示“是”或“无需确认即可继续”。

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

命令的默认值。

在这个答案的寻呼机块中,我们看到它less -is是 的寻呼机man。命令的默认行为并不总是显示在联机帮助页的单独部分或最顶部的部分。

您将不得不阅读选项以找出默认值,或者如果幸运的话,输入/pager将引导您找到该信息。这也需要您了解寻呼机(滚动联机帮助页的软件)的概念,这是您只有在阅读大量联机帮助页后才能获得的东西。

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

约在什么SYNOPSIS语法?

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

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

相关剧情简介:

这种方法什么时候不起作用?

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

在某些情况下,示例会非常简单,您必须执行一些命令进行测试,或者在最坏的情况下,谷歌它。

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

如果您正在编程或只是创建脚本,请记住,某些语言有自己的联机帮助页系统,例如perl( perldocs)、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,
         );
Run Code Online (Sandbox Code Playgroud)

...这里有大量其他内容,包括常规联机帮助页之类的部分...

使用蟒蛇:

[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...
Run Code Online (Sandbox Code Playgroud)

或者,help()如果您想阅读某个对象的更多详细信息,则使用 python shell 中的函数:

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.
Run Code Online (Sandbox Code Playgroud)

奖励: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
Run Code Online (Sandbox Code Playgroud)

  • @nwildner,在如此庞大且格式良好的答案之后,您应该得到一颗糖果。做得好! (9认同)
  • 是的。你可以。我只是假设操作员是“noob”并试图开始使用联机帮助页:) (7认同)
  • 我认为这应该添加到Linux中。当然,作为“手册”页面。 (6认同)
  • 这个答案需要是“我如何有效地使用`man`?”的最佳结果。谢谢你,做得很好。 (4认同)

ter*_*don 39

这在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.
Run Code Online (Sandbox Code Playgroud)

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

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

SYNOPSIS
       ls [OPTION]... [FILE]...
Run Code Online (Sandbox Code Playgroud)

其他时候,除非您已经知道如何使用相关命令,否则它是无用的。例如man dd

   dd [OPERAND]...
   dd OPTION
Run Code Online (Sandbox Code Playgroud)

因此,总而言之,如果您没有获得概要,请不要担心。这是正常的。阅读手册页本身。


Arc*_*mar 21

了解概要的一些基础知识

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

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

方法

  • 命令是 foo
  • 可选参数-S可以使用,你必须告诉size(名字给你一个提示)
  • 强制性参数是filename(这也给你一个提示,见man mkdir
  • elipsis...告诉你可以使用多个文件。

您仍然需要深入了解手册页以了解选项(在我上面的示例中,-S size是关于什么的)


Ant*_*hon 15

man 页面通常显示为 less时下。这使得搜索它们成为可能。我不会打扰概要,尤其是因为您有一个想要了解的特定命令行。

点击/并开始打字-I,然后Enter。第一个命中将在概要中,第二个(n用于下一个)为您提供-I.


Ran*_*832 11

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

对于您的示例命令

locate something | xargs -I {} bash -c "if [ -d "{}" ]; then echo {}; fi"
Run Code Online (Sandbox Code Playgroud)

您需要不仅信息,xargs而且还bash[(这可能是在test联机帮助页)。您可能还需要有关您的 shell(可能也是 bash)的信息以获取引用规则,因为您的命令包含一个复杂的引用字符串。我已经可以告诉你,引用的参数是错误的(并且错误的方式只有在你遇到名称中包含空格的文件时才会出现);内部"{}"应该是'{}'

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


Joe*_*Joe 6

添加已经给出的很好的答案:

1) 如果您对 gnu 实用程序感兴趣,尤其是像sedand 之类的实用程序,grep有时,使用该info命令会显示命令信息的极大扩展版本。sed例如,有一个关于如何编写正则表达式的详细部分和另一个包含一些非常复杂的用法示例的部分。

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

当我需要学习一些新东西时,即使是我不清楚的命令的一个小功能,我都会上网搜索我能想到的最好的关键字(例如Linux xargs)并添加单词howto, examples, 或tutorial。这通常很有成效。

我通常使用duckduckgo,因为它维护了我的隐私,但如果我需要更多地控制我的搜索,我会使用谷歌,因为我可以告诉它只在一个网站内搜索或只返回去年的结果。(它有许多其他高级搜索选项。你可以用谷歌搜索它们。;))

另一个提示:

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

man bash > bashman.txt
Run Code Online (Sandbox Code Playgroud)

并将该文件加载到我的文本编辑器的另一个窗口中,这样我就可以来回翻转、复制和粘贴等等。个人副本,我可以以任何我想要的方式编辑它,添加标签以便我可以更轻松地找到一个部分,甚至添加我自己的注释或示例。

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