Při zkoumání dalšího problému jsem narazil na příkaz
locate something | xargs -I {} bash -c "if [ -d "{}" ]; then echo {}; fi"
o kterých jsem se chtěl dozvědět více. Tak jsem spustil man xargs
a získejte následující výstup:
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...
Snažím se zlepšit používání dokumentace, abych se dozvěděl o linuxových programech, ale tato sekce „Synopsi“ je pro nové uživatele zastrašující. V porovnání s man locate
to vypadá doslova jako blábol nebo man free
.
Zatím chápu, že hranaté závorky znamenají volitelné a vnořené závorky znamenají možnosti v volitelném. Ale jak s tím mám vyvolat platný příkaz?
Nežádám zde o pomoc s xargs. Hledám pomoc s interpretací manuálové stránky, abych pochopil komplikované příkazy. Chci přestat dělat webové blogy indexované Googlem a osobní pomoc od ostatních můj první přístup k učení příkazů Linuxu.
Přijatá odpověď:
No, toto je můj velmi osobní způsob čtení manuálových stránek:
Manpager
Když otevřete manuálovou stránku pomocí man
výstup bude zobrazen/vykreslen pomocí less
nebo more
příkazy nebo jakýkoli jiný příkaz, který bude nastaven jako váš pager (manpager).
Pokud používáte Linux, pravděpodobně vám bude poskytnuta vaše man infrastruktura již nakonfigurovaná pro použití /usr/bin/less -is
(pokud jste nenainstalovali nějaké minimální distro) jako man(1)
, vysvětlete v sekci Možnosti:
-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.
Na FreeBSD a OpenBSD je to jen otázka úpravy MANPAGER
prostředí, protože většinou budou používat more
a některé funkce, jako je vyhledávání a zvýraznění textu, mohou chybět.
Na otázku, jaké rozdíly existují more
, existuje dobrá odpověď , less
a most
have here (nikdy nepoužíval most
). Schopnost posouvat zpět a posouvat dopředu o stránku pomocí mezera nebo oběma způsoby po řádcích pomocí ↓ nebo ↑ (také pomocí vi
vazby j a k ) je nezbytný při procházení manuálových stránek. Stiskněte h při použití less
zobrazíte souhrn dostupných příkazů.
A proto vám doporučuji používat less
jako váš man pager. less
mají některé základní funkce, které budou použity během této odpovědi.
Jak je formátován příkaz?
Konvence utilit:Základní specifikace otevřené skupiny, vydání 7 – IEEE Std 1003.1, vydání 2013. Než se pokusíte porozumět manuálové stránce, měli byste navštívit tento odkaz. Tento online odkaz popisuje syntaxi argumentů standardních nástrojů a zavádí terminologii používanou v POSIX.1-2017 pro popis argumentů zpracovávaných nástroji. To vám také nepřímo poskytne aktuální informace o skutečném významu slov, jako jsou parametry, argumenty, možnost argumentu…
Hlava jakékoli manuálové stránky vám bude připadat méně záhadná, když pochopíte zápis konvencí obslužných programů:
utility_name[-a][-b][-c option_argument]
[-d|-e][-f[option_argument]][operand...]
Mějte na paměti, co chcete dělat.
Když děláte průzkum o xargs
udělal jsi to účelově, že? Měli jste specifickou potřebu, která spočívala v čtení standardního výstupu a provádění příkazů na základě tohoto výstupu.
Ale když nevím, který příkaz chci?
Použijte man -k
nebo apropos
(jsou ekvivalentní). Pokud nevím, jak najít soubor:man -k file | grep search
. Přečtěte si popisy a najděte ten, který bude lépe vyhovovat vašim potřebám. Příklad:
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 standardně pracuje s regulárními výrazy (man apropos
, přečtěte si popis a zjistěte, co -r
ano) a v tomto příkladu hledám každou manuálovou stránku, kde popis začíná „report“.
Chcete-li vyhledat informace související se čtením standardního zpracování vstupu/výstupu a dosažením xargs
jako možná možnost:
man -k command| grep input
xargs (1) - build and execute command lines from standard input
Vždy si přečtěte DESCRIPTION
před zahájením
Udělejte si čas a přečtěte si popis. Stačí si přečíst popis xargs
příkaz se naučíme, že:
xargs
čte ze STDIN a provádí potřebný příkaz. To také znamená, že budete muset mít určité znalosti o tom, jak funguje standardní vstup a jak s ním manipulovat pomocí potrubí k řetězovým příkazům- Výchozí chování je chovat se jako
/bin/echo
. To vám dává malý tip, pokud potřebujete řetězit více než jedenxargs
, k tisku nemusíte používat echo. - Také jsme zjistili, že unixové názvy souborů mohou obsahovat prázdné řádky a nové řádky, že to může být problém a argument
-0
je způsob, jak zabránit výbuchu věcí pomocí oddělovačů prázdných znaků. Popis vás varuje, že příkaz používaný jako vstup musí také podporovat tuto funkci a že GNUfind
podpořit to. Skvělý. Hodně používáme find sxargs
. xargs
se zastaví, pokud je dosaženo výstupního stavu 255.
Některé popisy jsou velmi krátké a to je obecně proto, že software funguje velmi jednoduchým způsobem. Ani vás nenapadne tuto část manuálové stránky přeskočit 😉
Další věci, kterým je třeba věnovat pozornost…
Víte, že můžete vyhledávat soubory pomocí find
. Existuje spousta možností a pokud se podíváte pouze na SYNOPSIS
, budete ohromeni těmi. Je to jen špička ledovce. Kromě NAME
, SYNOPSIS
a DESCRIPTION
, budete mít následující sekce:
-
AUTHORS
:lidé, kteří vytvořili nebo pomáhali při vytváření příkazu
. -
BUGS
:uvádí všechny známé závady. Mohou to být pouze omezení implementace. -
ENVIRONMENT
:Aspekty vašeho shellu, které by mohly být ovlivněny příkazem, nebo proměnné, které budou použity. -
EXAMPLES
neboNOTES
:Samovysvětlující. -
REPORTING BUGS
:Koho budete muset kontaktovat, pokud najdete chyby v tomto nástroji nebo v jeho dokumentaci. -
COPYRIGHT
:Osoba, která vytvořila software, a zříká se odpovědnosti za software. Vše souvisí s licencí samotného softwaru. -
SEE ALSO
:Další příkazy, nástroje nebo pracovní aspekty, které souvisejí s tímto příkazem a nevejdou se do žádné z jiných sekcí.
Nejpravděpodobněji najdete zajímavé informace o aspektech nástroje, které chcete, v sekci příklady/poznámky.
Příklad
V následujících krocích provedu find
jako příklad, protože jeho koncepty jsou „jednodušší“ než xargs
vysvětlit (jeden příkaz najít soubory a druhý se zabývá stdin a zřetězeným prováděním dalšího výstupu příkazu). Předstírejme, že o tomto příkazu nevíme nic (nebo jen velmi málo).
Mám specifický problém, který je:musím hledat každý soubor s .jpg
rozšíření a s velikostí 500 kB (KiB =1024 bajtů, běžně nazývané kibibajty) nebo více ve složce ftp serveru.
Nejprve otevřete manuál:man find
. SYNOPSIS
je štíhlý. Pojďme hledat věci uvnitř manuálu:Napište / plus požadované slovo (size
). Bude indexovat mnoho položek -size
které budou počítat konkrétní velikosti. Uvízl. Nevím, jak hledat pomocí „více než“ nebo „méně než“ dané velikosti a muž mi to neukazuje.
Vyzkoušejte to a vyhledejte další nalezený záznam stisknutím n . OK. Našel jsem něco zajímavého:find
( -size +100M -fprintf /root/big.txt %-10s %pn )
. Možná nám tento příklad ukazuje, že s -size +100M
najde soubory o velikosti 100 MB nebo více. Jak bych to mohl potvrdit? Přejděte na začátek manuálové stránky a vyhledejte další slova.
Znovu zkusme slovo greater
. Stisknutím g nás zavede do hlavy manuálové stránky. / greater
a první záznam je:
Numeric arguments can be specified as
+n for **greater** than n,
-n for less than n,
n for exactly n.
Zní dobře. Zdá se, že tento blok manuálu potvrdil to, co jsme tušili. To se však nebude týkat pouze velikosti souborů. Bude platit pro všechny n
které lze nalézt na této manuálové stránce (jak říká fráze:„Číselné argumenty lze zadat jako“).
Dobrý. Pojďme najít způsob, jak filtrovat podle názvu:g / insensitive
. Proč? Necitlivý? WTF? Máme hypotetický ftp server, kde by lidé z "toho jiného OS" mohli dát název souboru s příponou .jpg
, .JPG
, .JpG
. To nás přivede k:
-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.
Nicméně po vyhledání lname
uvidíte, že to bude hledat pouze symbolické odkazy. Chceme skutečné soubory. Další záznam:
-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.
Skvělý. O -name
ani nemusím číst abyste viděli to -iname
je verze tohoto argumentu nerozlišující malá a velká písmena. Pojďme sestavit příkaz:
Příkaz: find /ftp/dir/ -size +500k -iname "*.jpg"
Co je zde implicitní:Vědomí, že zástupný znak ?
představuje „jakýkoli znak na jedné pozici“ a *
představuje „nula nebo více jakéhokoli znaku“. -name
Parametr vám poskytne souhrn těchto znalostí.
Tipy, které platí pro všechny příkazy
Některé možnosti, mnemotechnické pomůcky a „styl syntaxe“ procházejí všemi příkazy, což vám ušetří čas, protože nebudete muset manuálovou stránku vůbec otevírat. Ty se učí praxí a nejběžnější jsou:
- Obecně
-v
znamená verbózní.-vvv
je variací „velmi velmi podrobná“ na nějaký software. - Podle standardu POSIX lze obecně skládat argumenty s jednou pomlčkou. Příklad:
tar -xzvf
,cp -Rv
. - Obecně
-R
a/nebo-r
znamená rekurzivní. - Téměř všechny příkazy mají krátkou nápovědu s
--help
možnost. --version
zobrazuje verzi softwaru.-p
, při kopírování nebo přesunu obslužných programů znamená „zachovat oprávnění“.-y
znamená ve většině případů ANO nebo „pokračovat bez potvrzení“.
Všimněte si, že výše uvedené nejsou vždy pravdivé. Například -r
přepínač může znamenat velmi odlišné věci pro jiný software. Vždy je dobré zkontrolovat a ujistit se, že příkaz může být nebezpečný, ale toto jsou běžné výchozí hodnoty.
Výchozí hodnoty příkazů.
Na části pageru této odpovědi jsme viděli, že less -is
je pager man
. Výchozí chování příkazů není vždy zobrazeno v samostatné sekci na manuálových stránkách nebo v sekci, která je umístěna nejvýše.
Budete si muset přečíst možnosti, abyste zjistili výchozí nastavení, nebo pokud budete mít štěstí, napište / pager
dovede vás k těmto informacím. To také vyžaduje, abyste znali koncept pageru (softwaru, který posouvá manuálovou stránku), a to je věc, kterou získáte až po přečtení mnoha manuálových stránek.
proč je to důležité? To otevře vaše vnímání, pokud při čtení man(1)
najdete rozdíly v chování rolování a barev v systému Linux (less -is
pager) nebo FreeBSD man(1)
například.
A co SYNOPSIS
syntaxe?
Po získání všech informací potřebných k provedení příkazu můžete kombinovat možnosti, argumenty možností a operandy, aby byla vaše práce hotová. Přehled pojmů:
- Možnosti jsou přepínače, které určují chování příkazu. „Udělejte to “
“toto nedělejte “ nebo „jednat tímto způsobem “. Často se jim říká přepínače. - Argumenty možností se používají ve většině případů, kdy možnost není
binární (on/off) jako-t
on mount, který určuje typ
souborového systému (-t iso9660
,-t ext2
). „Udělejte to se zavřenýma očima “ nebo
„krmte zvířata, ale pouze lvy “. Také se nazývají argumenty. - Operandy jsou věci, na které má příkaz reagovat. Pokud používáte
cat file.txt
, operand je soubor ve vašem aktuálním
adresáři a jeho obsah se zobrazí naSTDOUT
.ls
je
příkaz, kde operand je volitelný. Tři tečky za operandem
vám implicitně říkají, žecat
může jednat s více operandy (soubory) v
ve stejnou dobu. Můžete si všimnout, že některé příkazy nastavily, jaký typ
operandu bude používat. Příklad:cat [OPTION] [FILE]...
Související souhrn:
- Pochopte souhrn v manuálové stránce
Kdy tato metoda nebude fungovat?
- Manuálové stránky bez příkladů
- Manuálové stránky, kde možnosti mají krátké vysvětlení
- Když používáte obecná klíčová slova jako
and
,to
,for
uvnitř manuálových stránek - Manuálové stránky, které nejsou nainstalovány. Zdá se to být zřejmé, ale pokud nemáte
lftp
(a jeho manuálové stránky) nainstalované nemůžete vědět, že je to vhodná volba jako sofistikovanější ftp klient spuštěnímman -k ftp
V některých případech budou příklady velmi jednoduché a budete muset provést některá provedení svého příkazu, abyste jej otestovali, nebo v nejhorším případě jej vygooglujte.
Ostatní:Programovací jazyky a jejich moduly:
Pokud programujete nebo jen vytváříte skripty, mějte na paměti, že některé jazyky mají své vlastní systémy manuálových stránek, jako je perl
(perldocs
), python(pydocs
), atd., obsahující konkrétní informace o metodách/funkcích, proměnných, chování a další důležité informace o modulu, který se pokoušíte použít a naučit se. To bylo užitečné pro mě, když jsem vytvářel skript pro stahování nepřečtených IMAP e-mailů pomocí perl Mail::IMAPClient
modul.
Tyto specifické manuálové stránky budete muset zjistit pomocí man -k
nebo hledat na internetu. Příklady:
[[email protected] ~]# man -k doc | grep perl
perldoc (1) - Look up Perl documentation in Pod format
[[email protected] ~]# 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,
);
…zde je spousta dalších věcí, se sekcemi jako běžná manuálová stránka…
S pythonem:
[[email protected] ~]# 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...
Nebo help()
funcion uvnitř python shellu, pokud si chcete přečíst více podrobností o nějakém objektu:
[email protected]:~$ 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.
Bonus: wtf
příkaz vám může pomoci se zkratkami a funguje jako whatis
pokud v databázi není nalezena žádná zkratka, ale to, co hledáte, je součástí databáze mužů. V Debianu je tento příkaz součástí bsdgames
balík. Příklady:
[email protected]:~$ wtf rtfm
RTFM: read the fine/fucking manual
[email protected]:~$ wtf afaik
AFAIK: as far as I know
[email protected]:~$ wtf afak
Gee... I don't know what afak means...
[email protected]:~$ wtf tcp
tcp: tcp (7) - TCP protocol.
[email protected]:~$ wtf systemd
systemd: systemd (1) - systemd system and service manager