如何使用手冊頁來學習如何使用命令?
在研究另一個問題時,我遇到了一個命令,
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
命令打開手冊頁時,輸出將由less
ormore
命令或任何其他將設置為您的尋呼機(手冊頁)的命令顯示/呈現。如果您使用的是 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
在瀏覽聯機幫助頁時,使用↓
or↑
(也使用vi
綁定j
and )向後滾動和逐頁向前滾動的能力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 -k
或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
支持它。偉大的。我們使用了很多 findxargs
。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
開關對於不同的軟體可能意味著非常不同的東西。檢查並確保命令何時可能是危險的總是一個好主意,但這些是常見的預設值。命令的預設值。
在這個答案的 pager 塊中,我們看到它
less -is
是man
. 命令的預設行為並不總是顯示在聯機幫助頁的單獨部分或位於最頂部的部分。您必須閱讀選項以找出預設值,或者如果幸運的話,鍵入
/``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