Durante la ricerca di un altro problema, mi sono imbattuto in un comando,
locate something | xargs -I {} bash -c "if [ -d "{}" ]; then echo {}; fi"
di cui volevo saperne di più. Quindi ho eseguito man xargs
e ottieni il seguente output:
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...
Sto cercando di migliorare nell'uso della documentazione per conoscere i programmi Linux, ma quella sezione "Sinossi" intimidisce i nuovi utenti. Sembra letteralmente incomprensibile rispetto a man locate
o man free
.
Finora, ho capito che le parentesi quadre significano facoltativo e le parentesi nidificate significano opzioni in facoltativo. Ma come dovrei indurre un comando valido con quello?
Non sto chiedendo aiuto con xargs qui. Sto cercando aiuto per interpretare una pagina man per capire comandi complicati. Voglio smettere di fare dei blog web indicizzati da Google e dell'aiuto personale degli altri il mio primo approccio all'apprendimento dei comandi Linux.
Risposta accettata:
Bene, questo è il mio modo molto personale di leggere le manpage:
Il manpager
Quando apri una pagina di manuale usando man
comando, l'output verrà visualizzato/renderizzato dal less
o more
comandi o qualsiasi altro comando che verrà impostato come pager (manpager).
Se stai usando Linux probabilmente hai la tua infrastruttura man già configurata per usare /usr/bin/less -is
(a meno che tu non abbia installato una distribuzione minima) come man(1)
, spiega nella sua sezione Opzioni:
-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.
Su FreeBSD e OpenBSD è solo questione di modificare il MANPAGER
variabile di ambiente poiché utilizzeranno principalmente more
e alcune funzioni come la ricerca e l'evidenziazione del testo potrebbero mancare.
C'è una buona risposta alla domanda su quali differenze more
, less
e most
have here(mai usato more
). La possibilità di scorrere all'indietro e in avanti per pagina con Spazio o in entrambi i modi in linea con ↓ o ↑ (anche, usando vi
collegamenti j e k ) è essenziale durante la navigazione nelle pagine di manuale. Premi h durante l'utilizzo di less
per vedere il riepilogo dei comandi disponibili.
Ed è per questo che ti consiglio di usare less
come tuo cercapersone. less
hanno alcune caratteristiche essenziali che verranno utilizzate durante questa risposta.
Come viene formattato un comando?
Convenzioni di utilità:The Open Group Base Specifications Issue 7 – IEEE Std 1003.1, 2013 Edition. Dovresti visitare quel link prima di provare a capire una pagina di manuale. Questo riferimento in linea descrive la sintassi degli argomenti delle utilità standard e introduce la terminologia utilizzata in POSIX.1-2017 per descrivere gli argomenti elaborati dalle utilità. Questo ti aggiornerà anche indirettamente sul vero significato di parole come parametri, argomenti, opzioni di argomenti...
L'intestazione di qualsiasi pagina di manuale ti sembrerà meno criptica dopo aver compreso la notazione delle convenzioni di utilità:
utility_name[-a][-b][-c option_argument]
[-d|-e][-f[option_argument]][operand...]
Pensa a cosa vuoi fare.
Quando fai le tue ricerche su xargs
l'hai fatto per uno scopo, giusto? Avevi un'esigenza specifica che consisteva nella lettura dell'output standard e nell'esecuzione di comandi in base a tale output.
Ma quando non so quale comando voglio?
Usa man -k
o apropos
(sono equivalenti). Se non so come trovare un file:man -k file | grep search
. Leggi le descrizioni e trova quella che meglio si adatta alle tue esigenze. Esempio:
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 funziona con le espressioni regolari per impostazione predefinita, (man apropos
, leggi la descrizione e scopri cosa -r
fa), e in questo esempio sto cercando ogni pagina di manuale in cui la descrizione inizia con "report".
Per cercare informazioni relative alla lettura dell'elaborazione di input/output standard e al raggiungimento di xargs
come opzione possibile:
man -k command| grep input
xargs (1) - build and execute command lines from standard input
Leggi sempre la DESCRIPTION
prima di iniziare
Prenditi del tempo e leggi la descrizione. Leggendo semplicemente la descrizione di xargs
comando impareremo che:
xargs
legge da STDIN ed esegue il comando necessario. Ciò significa anche che dovrai avere una certa conoscenza di come funziona l'input standard e come manipolarlo tramite pipe per concatenare i comandi- Il comportamento predefinito è agire come
/bin/echo
. Questo ti dà un piccolo suggerimento che se hai bisogno di concatenare più di unxargs
, non è necessario utilizzare echo per stampare. - Abbiamo anche appreso che i nomi di file unix possono contenere spazi vuoti e nuove righe, che questo potrebbe essere un problema e l'argomento
-0
è un modo per impedire che le cose esplodano utilizzando separatori di caratteri nulli. La descrizione ti avverte che il comando utilizzato come input deve supportare anche questa funzione e che GNUfind
supportalo. Grande. Usiamo molto find conxargs
. xargs
si fermerà se viene raggiunto lo stato di uscita 255.
Alcune descrizioni sono molto brevi e ciò è generalmente dovuto al fatto che il software funziona in modo molto semplice. Non pensare nemmeno di saltare questa parte della manpage 😉
Altre cose a cui prestare attenzione...
Sai che puoi cercare file usando find
. Ci sono un sacco di opzioni e se guardi solo il SYNOPSIS
, sarai sopraffatto da quelli. È solo la punta dell'iceberg. Escluso NAME
, SYNOPSIS
e DESCRIPTION
, avrai le seguenti sezioni:
-
AUTHORS
:le persone che hanno creato o aiutato nella creazione del comando
. -
BUGS
:elenca tutti i difetti noti. Potrebbero essere solo limitazioni di implementazione. -
ENVIRONMENT
:Aspetti della tua shell che potrebbero essere influenzati dal comando o variabili che verranno utilizzate. -
EXAMPLES
oNOTES
:Autoesplicativo. -
REPORTING BUGS
:Chi dovrai contattare se trovi bug su questo strumento o nella sua documentazione. -
COPYRIGHT
:Persona che ha creato e declinazioni di responsabilità sul software. Tutto relativo alla licenza del software stesso. -
SEE ALSO
:Altri comandi, strumenti o aspetti di lavoro correlati a questo comando e che non potrebbero rientrare in nessuna delle altre sezioni.
Molto probabilmente troverai informazioni interessanti sugli aspetti che desideri da uno strumento nella sezione esempi/note.
Esempio
Nei passaggi seguenti eseguirò find
ad esempio, poiché i suoi concetti sono "più semplici" di xargs
per spiegare (un comando trova i file e l'altro si occupa dello stdin e dell'esecuzione pipeline di altri output del comando). Facciamo finta di non sapere nulla (o molto poco) di questo comando.
Ho un problema specifico che è:devo cercare ogni file con il .jpg
estensione e con dimensioni di 500 KiB (KiB =1024 byte, comunemente chiamato kibibyte) o più all'interno di una cartella del server ftp.
Per prima cosa, apri il manuale:man find
. La SYNOPSIS
è magro. Cerchiamo cose all'interno del manuale:digita / più la parola che desideri (size
). Indicizzerà molte voci -size
che conterà dimensioni specifiche. Rimasto bloccato. Non so come cercare con "più di" o "meno di" una determinata dimensione e l'uomo non me lo mostra.
Proviamo e cerchiamo la voce successiva trovata premendo n . OK. Trovato qualcosa di interessante:find
( -size +100M -fprintf /root/big.txt %-10s %pn )
. Forse questo esempio ce lo mostra con -size +100M
troverà file con 100 MB o più. Come potrei confermare? Andare all'inizio della manpage e cercare altre parole.
Di nuovo, proviamo la parola greater
. Premendo g ci porterà all'inizio della manpage. / greater
e la prima voce è:
Numeric arguments can be specified as
+n for **greater** than n,
-n for less than n,
n for exactly n.
Sembra fantastico. Sembra che questo blocco del manuale abbia confermato quanto sospettavamo. Tuttavia, questo non si applicherà solo alle dimensioni dei file. Si applicherà a qualsiasi n
che può essere trovato in questa manpage (come diceva la frase:"Gli argomenti numerici possono essere specificati come").
Bene. Troviamo un modo per filtrare per nome:g / insensitive
. Come mai? Insensibile? Perché? Abbiamo un ipotetico server ftp, in cui le persone di "quell'altro sistema operativo" potrebbero dare un nome file con estensioni come .jpg
, .JPG
, .JpG
. Questo ci porterà a:
-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.
Tuttavia, dopo aver cercato lname
vedrai che questo cercherà solo collegamenti simbolici. Vogliamo file reali. La voce successiva:
-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.
Grande. Non ho nemmeno bisogno di leggere su -name
per vedere quel -iname
è la versione senza distinzione tra maiuscole e minuscole di questo argomento. Assembliamo il comando:
Comando: find /ftp/dir/ -size +500k -iname "*.jpg"
Cosa è implicito qui:la conoscenza che il carattere jolly ?
rappresenta "qualsiasi carattere in una singola posizione" e *
rappresenta "zero o più di qualsiasi carattere". Il -name
parametro ti darà un riepilogo di questa conoscenza.
Suggerimenti che si applicano a tutti i comandi
Alcune opzioni, mnemonici e "stile sintassi" viaggiano attraverso tutti i comandi facendoti guadagnare un po' di tempo non dovendo aprire la manpage. Quelli si imparano con la pratica e i più comuni sono:
- In genere,
-v
significa prolisso.-vvv
è una variazione "molto molto dettagliata" su alcuni software. - Seguendo lo standard POSIX, generalmente è possibile impilare argomenti con un trattino. Esempio:
tar -xzvf
,cp -Rv
. - Generalmente
-R
e/o-r
significa ricorsivo. - Quasi tutti i comandi hanno un breve aiuto con
--help
opzione. --version
mostra la versione di un software.-p
, su utilità di copia o spostamento significa "conserva i permessi".-y
significa SÌ, o "procedi senza conferma" nella maggior parte dei casi.
Nota che quanto sopra non è sempre vero però. Ad esempio, il -r
switch può significare cose molto diverse per software diversi. È sempre una buona idea controllare e assicurarsi quando un comando potrebbe essere pericoloso, ma si tratta di valori predefiniti comuni.
Valori predefiniti dei comandi.
Nella parte del cercapersone di questa risposta, abbiamo visto che less -is
è il cercapersone di man
. Il comportamento predefinito dei comandi non viene sempre mostrato in una sezione separata delle pagine man o nella sezione più in alto.
Dovrai leggere le opzioni per scoprire le impostazioni predefinite o, se sei fortunato, digitare / pager
ti condurrà a quelle informazioni. Ciò richiede anche che tu conosca il concetto di pager (software che scorre la manpage), e questa è una cosa che acquisirai solo dopo aver letto molte manpage.
Perché è importante? Questo aprirà la tua percezione se trovi differenze nel comportamento di scorrimento e colore durante la lettura di man(1)
su Linux(less -is
pager) o FreeBSD man(1)
per esempio.
E che dire della SYNOPSIS
sintassi?
Dopo aver ottenuto tutte le informazioni necessarie per eseguire il comando, puoi combinare opzioni, argomenti di opzioni e operandi in linea per completare il tuo lavoro. Panoramica dei concetti:
- Le opzioni sono le opzioni che determinano il comportamento di un comando. "Fai questo ”
“non farlo ” o “agisci in questo modo “. Spesso chiamati interruttori. - Gli argomenti-opzione vengono utilizzati nella maggior parte dei casi in cui un'opzione non è
binaria(on/off) come-t
su mount, che specifica il tipo di un
filesystem(-t iso9660
,-t ext2
). "Fai questo ad occhi chiusi ” o
“nutri gli animali, ma solo i leoni “. Chiamati anche argomenti. - Gli operandi sono cose su cui vuoi che agisca quel comando. Se usi
cat file.txt
, l'operando è un file all'interno della directory
corrente e il suo contenuto verrà mostrato suSTDOUT
.ls
è un comando
in cui un operando è facoltativo. I tre punti dopo l'operando
ti dicono implicitamente checat
può agire su più operandi (file) contemporaneamente. Potresti notare che alcuni comandi hanno impostato il tipo di operando
che verrà utilizzato. Esempio:cat [OPTION] [FILE]...
Cose relative alla sinossi:
- Comprendi la sinossi nella pagina di manuale
Quando questo metodo non funzionerà?
- Manpage che non hanno esempi
- Manpage in cui le opzioni hanno una breve spiegazione
- Quando utilizzi parole chiave generiche come
and
, dato
,for
all'interno delle manpage - Manpage non installate. Sembra ovvio ma, se non hai
lftp
(e le sue manpage) installato non puoi sapere che è un'opzione adatta come client ftp più sofisticato eseguendoman -k ftp
In alcuni casi gli esempi saranno piuttosto semplici e dovrai eseguire alcune esecuzioni del tuo comando per testarlo o, nel peggiore dei casi, farlo su Google.
Altro:Linguaggi di programmazione e relativi moduli:
Se stai programmando o semplicemente creando script, tieni presente che alcuni linguaggi hanno i propri sistemi di pagine di manuale, come perl
(perldocs
), python(pydocs
), ecc., contenenti informazioni specifiche su metodi/funzioni, variabili, comportamento e altre informazioni importanti sul modulo che stai cercando di utilizzare e imparare. Questo mi è stato utile quando stavo creando uno script per scaricare e-mail IMAP non lette utilizzando il perl Mail::IMAPClient
modulo.
Dovrai capire quelle pagine man specifiche usando man -k
o cercando in linea. Esempi:
[[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,
);
...un sacco di altre cose qui, con sezioni come una normale manpage...
Con Python:
[[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...
Oppure, il help()
funzione all'interno della shell python se vuoi leggere maggiori dettagli di alcuni oggetti:
[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: Il wtf
comando può aiutarti con gli acronimi e funziona come whatis
se non viene trovato nessun acronimo sul suo database, ma quello che stai cercando fa parte del database man. Su Debian questo comando fa parte di bsdgames
pacchetto. Esempi:
[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