Man

如何使用手冊頁來學習如何使用命令?

  • May 25, 2019

在研究另一個問題時,我遇到了一個命令

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 命令的第一種方法。

好吧,這是我閱讀手冊頁的非常個人化的方式:

手冊頁

當您使用該man命令打開手冊頁時,輸出將由lessormore命令或任何其他將設置為您的尋呼機(手冊頁)的命令顯示/呈現。

如果您使用的是 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,並且可能缺少搜尋和文本突出顯示等一些功能。

有什麼區別的問題有一個很好的答案moreless並且most這裡有(從未使用過most)。Space在瀏覽聯機幫助頁時,使用or (也使用vi綁定jand )向後滾動和逐頁向前滾動的能力k是必不可少的。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是一種通過使用空字元分隔符來防止事情爆炸的方法。該描述警告您,用作輸入的命令也需要支持此功能,並且 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 findSYNOPSIS很苗條。讓我們在手冊中搜尋內容:鍵入/加上您想要的單詞 ( 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開關對於不同的軟體可能意味著非常不同的東西。檢查並確保命令何時可能是危險的總是一個好主意,但這些是常見的預設值。

命令的預設值。

在這個答案的 pager 塊中,我們看到它less -isman. 命令的預設行為並不總是顯示在聯機幫助頁的單獨部分或位於最頂部的部分。

您必須閱讀選項以找出預設值,或者如果幸運的話,鍵入/``pager會引導您找到該資訊。這也需要您了解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) 等,其中包含有關方法/函式、變數、行為的特定資訊以及有關模組的其他重要資訊您正在嘗試使用和學習。當我創建腳本以使用該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,
        );

……這裡有很多其他的東西,有像普通手冊頁這樣的部分……

使用蟒蛇:

[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

引用自:https://unix.stackexchange.com/questions/193815