En recherchant un autre problème, je suis tombé sur une commande,
locate something | xargs -I {} bash -c "if [ -d "{}" ]; then echo {}; fi"
dont je voulais en savoir plus. J'ai donc lancé man xargs
et obtenez le résultat suivant :
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...
J'essaie de m'améliorer dans l'utilisation de la documentation pour en savoir plus sur les programmes Linux, mais cette section "Synopsis" est intimidante pour les nouveaux utilisateurs. Cela ressemble littéralement à du charabia par rapport à man locate
ou man free
.
Jusqu'à présent, je comprends que les crochets signifient facultatifs et les crochets imbriqués signifient des options en option. Mais comment suis-je censé induire une commande valide avec ça ?
Je ne demande pas d'aide avec xargs ici. Je cherche de l'aide pour interpréter une page de manuel afin de comprendre des commandes compliquées. Je veux arrêter de faire des blogs Web indexés par Google et de l'aide personnelle des autres ma première approche pour apprendre les commandes Linux.
Réponse acceptée :
Eh bien, voici ma façon très personnelle de lire les pages de manuel :
La page de manuel
Lorsque vous ouvrez une page de manuel à l'aide de man
commande, la sortie sera affichée/rendue par la commande less
ou more
commandes, ou toute autre commande qui sera définie comme votre pager (manpager).
Si vous utilisez Linux, vous êtes probablement servi avec votre infrastructure man déjà configurée pour utiliser /usr/bin/less -is
(sauf si vous avez installé une distribution minimale) en tant que man(1)
, expliquez dans sa section Options :
-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.
Sur FreeBSD et OpenBSD, il suffit d'éditer le MANPAGER
variable d'environnement car ils utiliseront principalement more
, et certaines fonctionnalités telles que la recherche et la surbrillance de texte peuvent être manquantes.
Il y a une bonne réponse à la question de savoir quelles différences more
, less
et most
ont ici (jamais utilisé most
). La possibilité de faire défiler vers l'arrière et vers l'avant par page avec Espace ou dans les deux sens par ligne avec ↓ ou ↑ (aussi, en utilisant vi
liaisons j et k ) est essentiel lors de la navigation dans les pages de manuel. Appuyez sur h en utilisant less
pour voir le récapitulatif des commandes disponibles.
Et c'est pourquoi je vous suggère d'utiliser less
comme votre téléavertisseur. less
ont quelques fonctionnalités essentielles qui seront utilisées lors de cette réponse.
Comment une commande est-elle formatée ?
Conventions utilitaires :Spécifications de base du groupe ouvert, numéro 7 – IEEE Std 1003.1, édition 2013. Vous devriez visiter ce lien avant d'essayer de comprendre une page de manuel. Cette référence en ligne décrit la syntaxe des arguments des utilitaires standard et introduit la terminologie utilisée dans POSIX.1-2017 pour décrire les arguments traités par les utilitaires. Cela vous informera également indirectement de la véritable signification de mots tels que paramètres, arguments, option d'argument…
L'en-tête de n'importe quelle page de manuel vous semblera moins énigmatique après avoir compris la notation des conventions d'utilité :
utility_name[-a][-b][-c option_argument]
[-d|-e][-f[option_argument]][operand...]
Gardez à l'esprit ce que vous voulez faire.
Lorsque vous faites vos recherches sur xargs
vous l'avez fait dans un but, n'est-ce pas ? Vous aviez un besoin spécifique qui était de lire la sortie standard et d'exécuter des commandes basées sur cette sortie.
Mais, quand je ne sais pas quelle commande je veux ?
Utilisez man -k
ou apropos
(ils sont équivalents). Si je ne sais pas comment trouver un fichier :man -k file | grep search
. Lisez les descriptions et trouvez celle qui répondra le mieux à vos besoins. Exemple :
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 fonctionne avec des expressions régulières par défaut, (man apropos
, lisez la description et découvrez ce que -r
fait), et dans cet exemple, je recherche toutes les pages de manuel dont la description commence par "rapport".
Pour rechercher des informations liées à la lecture du traitement d'entrée/sortie standard et à l'atteinte de xargs
comme option possible :
man -k command| grep input
xargs (1) - build and execute command lines from standard input
Lisez toujours la DESCRIPTION
avant de commencer
Prenez le temps de lire la description. En lisant simplement la description du xargs
commande nous apprendrons que :
xargs
lit à partir de STDIN et exécute la commande nécessaire. Cela signifie également que vous devrez avoir une certaine connaissance du fonctionnement de l'entrée standard et de la manière de la manipuler via des canaux pour chaîner des commandes- Le comportement par défaut est d'agir comme
/bin/echo
. Cela vous donne une petite astuce si vous avez besoin d'enchaîner plus d'unxargs
, vous n'avez pas besoin d'utiliser echo pour imprimer. - Nous avons également appris que les noms de fichiers Unix peuvent contenir des blancs et des retours à la ligne, que cela pourrait être un problème et que l'argument
-0
est un moyen d'empêcher les choses d'exploser en utilisant des séparateurs de caractères nuls. La description vous avertit que la commande utilisée comme entrée doit également prendre en charge cette fonctionnalité et que GNUfind
soutiens le. Génial. On utilise beaucoup find avecxargs
. xargs
s'arrêtera si l'état de sortie 255 est atteint.
Certaines descriptions sont très courtes et c'est généralement parce que le logiciel fonctionne de manière très simple. Ne pensez même pas à sauter cette partie de la page de manuel 😉
Autres choses auxquelles prêter attention…
Vous savez que vous pouvez rechercher des fichiers en utilisant find
. Il y a une tonne d'options et si vous ne regardez que le SYNOPSIS
, vous serez submergé par ceux-ci. Ce n'est que la pointe de l'iceberg. Hors NAME
, SYNOPSIS
, et DESCRIPTION
, vous aurez les sections suivantes :
-
AUTHORS
:les personnes qui ont créé ou aidé à la création de la
commande. -
BUGS
:répertorie tous les défauts connus. Il ne peut s'agir que de limitations de mise en œuvre. -
ENVIRONMENT
:Aspects de votre shell qui pourraient être affectés par la commande, ou variables qui seront utilisées. -
EXAMPLES
ouNOTES
:S'explique. -
REPORTING BUGS
:Qui vous devrez contacter si vous trouvez des bogues sur cet outil ou dans sa documentation. -
COPYRIGHT
:Personne qui a créé et avis de non-responsabilité concernant le logiciel. Tous liés à la licence du logiciel lui-même. -
SEE ALSO
:Autres commandes, outils ou aspects de travail liés à cette commande et qui ne peuvent tenir dans aucune des autres sections.
Vous trouverez très probablement des informations intéressantes sur les aspects que vous souhaitez d'un outil dans la section exemples/notes.
Exemple
Dans les étapes suivantes, je vais prendre find
par exemple, puisque ses concepts sont "plus simples" que xargs
pour expliquer (une commande trouve des fichiers et l'autre traite de stdin et de l'exécution en pipeline d'autres sorties de commande). Imaginons simplement que nous ne savons rien (ou très peu) de cette commande.
J'ai un problème spécifique qui est :je dois chercher chaque fichier avec le .jpg
extension, et avec 500KiB (KiB =1024 byte, communément appelé kibibyte), ou plus en taille à l'intérieur d'un dossier de serveur ftp.
D'abord, ouvrez le manuel :man find
. Le SYNOPSIS
est mince. Cherchons des choses dans le manuel :Tapez / plus le mot que vous voulez (size
). Il indexera beaucoup d'entrées -size
qui comptera des tailles spécifiques. Est resté coincé. Je ne sais pas comment rechercher avec "plus que" ou "moins que" une taille donnée, et l'homme ne me le montre pas.
Essayons et recherchons la prochaine entrée trouvée en appuyant sur n . D'ACCORD. Trouvé quelque chose d'intéressant :find
( -size +100M -fprintf /root/big.txt %-10s %pn )
. Peut-être que cet exemple nous montre qu'avec -size +100M
il trouvera des fichiers de 100 Mo ou plus. Comment pourrais-je confirmer ? Aller à l'en-tête de la page de manuel et rechercher d'autres mots.
Encore une fois, essayons le mot greater
. En appuyant sur g nous mènera à la tête de la page de manuel. / greater
, et la première entrée est :
Numeric arguments can be specified as
+n for **greater** than n,
-n for less than n,
n for exactly n.
Super. Il semble que ce bloc du manuel ait confirmé ce que nous soupçonnions. Cependant, cela ne s'appliquera pas seulement aux tailles de fichiers. Il s'appliquera à n'importe quel n
que l'on peut trouver sur cette page de manuel (comme le dit la phrase :"Les arguments numériques peuvent être spécifiés comme").
Bon. Trouvons un moyen de filtrer par nom :g / insensitive
. Pourquoi? Insensible? Wtf ? Nous avons un serveur ftp hypothétique, où "cet autre système d'exploitation" pourrait donner un nom de fichier avec des extensions comme .jpg
, .JPG
, .JpG
. Cela nous mènera à :
-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.
Cependant, après avoir recherché lname
vous verrez que cela ne recherchera que des liens symboliques. Nous voulons de vrais fichiers. L'entrée suivante :
-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.
Génial. Je n'ai même pas besoin de lire à propos de -name
pour voir que -iname
est la version insensible à la casse de cet argument. Assemblons la commande :
Commande : find /ftp/dir/ -size +500k -iname "*.jpg"
Qu'est-ce qui est implicite ici :la connaissance que le caractère générique ?
représente "n'importe quel caractère à une seule position" et *
représente "zéro ou plus de n'importe quel caractère". Le -name
paramètre vous donnera un résumé de ces connaissances.
Conseils qui s'appliquent à toutes les commandes
Certaines options, mnémoniques et "style de syntaxe" parcourent toutes les commandes, ce qui vous fait gagner du temps en n'ayant pas du tout à ouvrir la page de manuel. Ceux-ci sont appris par la pratique et les plus courants sont :
- Généralement,
-v
signifie verbeux.-vvv
est une variante "très très verbeux" sur certains logiciels. - Conformément à la norme POSIX, les arguments à un tiret peuvent généralement être empilés. Exemple :
tar -xzvf
,cp -Rv
. - Généralement
-R
et/ou-r
signifie récursif. - Presque toutes les commandes ont une brève aide avec le
--help
option. --version
affiche la version d'un logiciel.-p
, les utilitaires de copie ou de déplacement signifient "préserver les autorisations".-y
signifie OUI, ou "continuer sans confirmation" dans la plupart des cas.
Notez que ce qui précède n'est pas toujours vrai. Par exemple, le -r
switch peut signifier des choses très différentes pour différents logiciels. C'est toujours une bonne idée de vérifier et de s'assurer qu'une commande pourrait être dangereuse, mais ce sont des valeurs par défaut courantes.
Valeurs par défaut des commandes.
Au niveau du téléavertisseur de cette réponse, nous avons vu que less -is
est le téléavertisseur de man
. Le comportement par défaut des commandes n'est pas toujours affiché dans une section séparée des pages de manuel ou dans la section la plus placée en haut.
Vous devrez lire les options pour connaître les valeurs par défaut, ou si vous avez de la chance, taper / pager
vous mènera à cette information. Cela nécessite également que vous connaissiez le concept du pager (logiciel qui fait défiler la page de manuel), et c'est une chose que vous n'acquérirez qu'après avoir lu de nombreuses pages de manuel.
Pourquoi est-ce important ? Cela ouvrira votre perception si vous trouvez des différences sur le comportement de défilement et de couleur lors de la lecture de man(1)
sous Linux(less -is
téléavertisseur) ou FreeBSD man(1)
par exemple.
Et qu'en est-il du SYNOPSIS
syntaxe ?
Après avoir obtenu toutes les informations nécessaires pour exécuter la commande, vous pouvez combiner des options, des arguments d'option et des opérandes en ligne pour faire votre travail. Présentation des concepts :
- Les options sont les commutateurs qui dictent le comportement d'une commande. "Fais ça ”
“ne fais pas ça " ou " agir de cette façon “. Souvent appelés commutateurs. - Les arguments d'option sont utilisés dans la plupart des cas lorsqu'une option n'est pas
binaire (on/off) comme-t
au montage, qui spécifie le type d'un
système de fichiers (-t iso9660
,-t ext2
). "Fais ça les yeux fermés " ou
"nourrir les animaux, mais seulement les lions “. Aussi appelés arguments. - Les opérandes sont des choses sur lesquelles vous voulez que cette commande agisse. Si vous utilisez
cat file.txt
, l'opérande est un fichier dans votre répertoire courant
, et son contenu sera affiché surSTDOUT
.ls
est une commande
où un opérande est facultatif. Les trois points après l'opérande
vous indiquent implicitement quecat
peut agir sur plusieurs opérandes (fichiers) à
en même temps. Vous remarquerez peut-être que certaines commandes ont défini le type d'opérande
qu'elles utiliseront. Exemple :cat [OPTION] [FILE]...
Synopsis connexe :
- Comprendre le synopsis dans la page de manuel
Quand cette méthode ne fonctionnera-t-elle pas ?
- Pages de manuel sans exemples
- Pages de manuel où les options ont une courte explication
- Lorsque vous utilisez des mots clés génériques tels que
and
,to
,for
dans les pages de manuel - Pages de manuel non installées. Cela semble évident mais, si vous n'avez pas
lftp
(et ses pages de manuel) installé, vous ne pouvez pas savoir qu'il s'agit d'une option appropriée en tant que client ftp plus sophistiqué en exécutantman -k ftp
Dans certains cas, les exemples seront assez simples, et vous devrez faire quelques exécutions de votre commande pour tester, ou dans le pire des cas, la chercher sur Google.
Autre :Langages de programmation et ses modules :
Si vous programmez ou créez simplement des scripts, gardez à l'esprit que certains langages ont leurs propres systèmes de pages de manuel, comme perl
(perldocs
), python(pydocs
), etc., contenant des informations spécifiques sur les méthodes/fonctions, les variables, le comportement et d'autres informations importantes sur le module que vous essayez d'utiliser et d'apprendre. Cela m'a été utile lorsque je créais un script pour télécharger des e-mails IMAP non lus en utilisant le perl Mail::IMAPClient
module.
Vous devrez comprendre ces pages de manuel spécifiques en utilisant man -k
ou effectuer une recherche en ligne. Exemples :
[[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,
);
…des tonnes d'autres choses ici, avec des sections comme une page de manuel normale…
Avec 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...
Ou, le help()
fonction à l'intérieur du shell python si vous souhaitez lire plus de détails sur un objet :
[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 : Le wtf
La commande peut vous aider avec les acronymes et fonctionne comme whatis
si aucun acronyme n'est trouvé dans sa base de données, mais ce que vous recherchez fait partie de la base de données man. Sur Debian cette commande fait partie de bsdgames
emballer. Exemples :
[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