在研究另一个问题时,我遇到一个命令,
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
or相比,它实际上看起来像是胡言乱语man free
。
到目前为止,我明白方括号表示可选,嵌套括号表示可选中的选项。但我该如何诱导有效的命令呢?
我不是在这里寻求有关 xargs 的帮助。 我正在寻求帮助解释手册页以理解复杂的命令。我不想再将 Google 索引的网络博客和他人的个人帮助作为学习 Linux 命令的首选方法。
答案1
嗯,这是我个人阅读手册页的方式:
手册页
当您使用该命令打开联机帮助页时man
,输出将通过less
或more
命令或将设置为您的分页器(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
,并且可能会缺少一些功能,例如搜索和文本突出显示。
more
对于什么区别和有什么区别less
这个问题有一个很好的答案most
这里(没用过most
)。在浏览联机帮助页时,Space使用 或 逐行向后滚动和向前滚动↓(↑也可以使用vi
绑定j和)的能力是必不可少的。使用时k按下可查看可用命令的摘要。hless
这就是为什么我建议你使用它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 -k
or apropos
(它们是等效的)。如果我不知道如何查找文件: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
是通过使用空字符分隔符来防止事情爆炸的一种方法。描述警告您用作输入的命令也需要支持此功能,并且 GNUfind
支持它。伟大的。我们大量使用 find 和xargs
. xargs
如果达到退出状态 255 将停止。
有些描述非常简短,这通常是因为该软件的工作方式非常简单。甚至不要考虑跳过联机帮助页的这一部分;)
其他需要注意的事项...
您知道您可以使用 来搜索文件find
。有很多选择,如果您只看SYNOPSIS
,您会被这些选择淹没。这只是冰山一角。排除NAME
、SYNOPSIS
和DESCRIPTION
,您将拥有以下部分:
AUTHORS
:创建或协助创建该命令的人。BUGS
:列出所有已知缺陷。可能只是实施限制。ENVIRONMENT
:shell 中可能受命令或将使用的变量影响的方面。EXAMPLES
或NOTES
:不言自明。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.
听起来很棒。看来手册的这一块证实了我们的怀疑。然而,这不仅适用于文件大小。它将适用于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.
但是,搜索后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 -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
,操作数是当前目录中的一个文件,其内容将显示在 上STDOUT
。ls
是一个命令,其中操作数是可选的。操作数后面的三个点隐式告诉您cat
可以同时作用于多个操作数(文件)。您可能会注意到某些命令已经设置了它将使用的操作数类型。例子:cat [OPTION] [FILE]...
相关内容简介:
这个方法什么时候不起作用呢?
- 没有示例的联机帮助页
- 手册页中的选项有简短的解释
- 当您在联机帮助页中使用通用关键字(如
and
,to
, )时for
- 未安装的联机帮助页。这似乎是显而易见的,但是,如果您没有
lftp
安装(及其手册页),您将无法通过运行来知道这是作为更复杂的 ftp 客户端的合适选项man -k ftp
在某些情况下,示例非常简单,您将必须执行一些命令来进行测试,或者在最坏的情况下,通过 Google 进行搜索。
其他:编程语言及其模块:
如果您正在编程或只是创建脚本,请记住某些语言有自己的手册页系统,例如perl
( perldocs
)、python( pydocs
) 等,其中保存有关方法/函数、变量、行为的特定信息以及有关模块的其他重要信息你正在尝试使用和学习。当我创建一个脚本来使用以下命令下载未读的 IMAP 电子邮件时,这对我很有用:perl Mail::IMAPClient
模块。
您必须通过使用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,
);
...这里还有大量其他内容,其中包括常规联机帮助页等部分...
使用蟒蛇:
[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 内的函数:
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
答案2
这在以下内容中得到了很好的解释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
因此,总而言之,如果您看不到概要,请不要担心。这很正常。阅读手册页本身。
答案3
理解概要的一些基础知识
- 每个
[foo]
代表可选参数或参数。 - 使用语法时
[foo [ bar ] ]
,可以使用foo,也可以添加bar。 - 强制选项参数以这种方式使用
[ -S size ]
,这表明 -S 参数正在等待强制大小。
例如 :foo [-S size ] filename ...
方法
- 命令是
foo
- 可以使用可选参数
-S
,你必须告诉size
(名称给你一个提示) - 强制参数是
filename
(这也给你一个提示,请参阅man mkdir
) - 省略号
...
告诉您可以使用多个文件。
您仍然需要深入手册页来理解选项(在上面的示例案例中,-S size
是什么)
答案4
要记住的一件关键事情是,在执行其他命令的命令的情况下,您不能只查看一个命令的手册。
对于您的示例命令
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