Lors de la recherche d'un autre problème, je suis tombé sur une commande ,
locate something | xargs -I {} bash -c "if [ -d "{}" ]; then echo {}; fi"
que je voulais en savoir plus. J'ai donc couru man xargs
et obtenez la sortie suivante:
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 mieux utiliser la documentation pour en savoir plus sur les programmes Linux, mais cette section "Synopsis" intimide les nouveaux utilisateurs. Il ressemble littéralement à du charabia par rapport à man locate
ou man free
.
Jusqu'à présent, je comprends que les crochets signifient facultatif et les crochets imbriqués signifient les 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 pour 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 de l'apprentissage des commandes Linux.
Eh bien, c'est ma façon très personnelle de lire les pages de manuel:
Lorsque vous ouvrez une page de manuel à l'aide de la commande man
, la sortie sera affichée/rendue par les commandes less
ou more
, 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) comme man(1)
, expliquez 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 de modifier la variable d'environnement MANPAGER
car ils utiliseront principalement more
, et certaines fonctionnalités comme la recherche et la mise en évidence du texte pourraient être manquantes.
Il existe 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 faire défiler vers l'avant par page avec Space ou dans les deux sens par ligne avec ↓ ou ↑(également, en utilisant les liaisons vi
j et k) est essentiel lors de la navigation dans les pages de manuel. presse h en utilisant less
pour voir le résumé des commandes disponibles.
Et c'est pourquoi je vous suggère d'utiliser less
comme pager pour vous. less
possède quelques fonctionnalités essentielles qui seront utilisées lors de cette réponse.
Conventions utilitaires : The Open Group Base Specifications Issue 7 - IEEE Std 1003.1, 2013 Edition. Vous devriez visiter ce lien avant d'essayer de comprendre une page de manuel. Cette référence en ligne décrit la syntaxe d'argument des utilitaires standard et présente 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 des mots comme les paramètres, les arguments, l'option d'argument ...
La tête de n'importe quelle page de manuel vous semblera moins cryptique après avoir compris la notation des conventions utilitaires:
utility_name[-a][-b][-c option_argument]
[-d|-e][-f[option_argument]][operand...]
Lorsque vous faites vos recherches sur xargs
vous l'avez fait pour un purpouse, non? Vous aviez un besoin spécifique de lire la sortie standard et d'exécuter des commandes basées sur cette sortie.
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-en une qui répondra 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 les expressions régulières par défaut, (man apropos
, Lisez la description et découvrez ce que fait -r
), Et sur cet exemple, je recherche chaque page de manuel où la description commence par "rapport ".
Pour rechercher des informations relatives à la lecture du traitement d'entrée/sortie standard et à l'accès à xargs
comme option possible:
man -k command| grep input
xargs (1) - build and execute command lines from standard input
DESCRIPTION
avant de commencerPrenez le temps de lire la description. En lisant simplement la description de la commande xargs
, nous apprendrons que:
xargs
lit à partir de STDIN et exécute la commande nécessaire. Cela signifie également que vous aurez besoin d'avoir une certaine connaissance du fonctionnement de l'entrée standard et de la façon de la manipuler via des canaux pour chaîner des commandes./bin/echo
. Cela vous donne un petit conseil: si vous devez chaîner plusieurs xargs
, vous n'avez pas besoin d'utiliser l'écho pour imprimer.-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 en entrée doit également prendre en charge cette fonctionnalité et que GNU find
la prend en charge. Génial. Nous utilisons beaucoup de find avec xargs
.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 ;)
Vous savez que vous pouvez rechercher des fichiers à l'aide de find
. Il y a une tonne d'options et si vous ne regardez que le SYNOPSIS
, vous serez submergé par celles-ci. Ce n'est que la pointe de l'iceberg. À l'exception de 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 peut s'agir uniquement de limitations d'implémentation.
ENVIRONMENT
: Aspects de votre Shell qui pourraient être affectés par la commande, ou variables qui seront utilisées.
EXAMPLES
ou NOTES
: 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 renonce au logiciel. Tous liés à la licence du logiciel lui-même.
SEE ALSO
: Autres commandes, outils ou aspects fonctionnels liés à cette commande, et ne pouvant tenir sur 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.
Dans les étapes suivantes, je prendrai find
comme exemple, car ses concepts sont "plus simples" que xargs
pour expliquer (une commande recherche des fichiers et l'autre traite de l'exécution stdin et en pipeline de autre sortie de commande). Disons simplement que nous ne savons rien (ou très peu) à propos de cette commande.
J'ai un problème spécifique qui est: je dois rechercher chaque fichier avec l'extension .jpg
, Et avec 500 Ko (Kio = 1024 octets, communément appelé kibibyte), ou plus en taille dans un dossier de serveur ftp.
Tout 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 un grand nombre d'entrées -size
Qui compteront des tailles spécifiques. Est resté coincé. Je ne sais pas comment chercher 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 %p\n \)
. 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 en tête de la page de manuel et chercher d'autres mots.
Encore une fois, essayons le mot greater
. Pressage 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'applique pas uniquement aux tailles de fichier. Il s'appliquera à tout n
qui peut être trouvé sur cette page de manuel (comme le disait la phrase: "Les arguments numériques peuvent être spécifiés comme").
Bien. Laissez-nous trouver un moyen de filtrer par nom: g/insensitive
. Pourquoi? Insensible? Wtf? Nous avons un serveur ftp hypothétique, où "les autres OS" pourraient donner un nom de fichier avec des extensions comme .jpg
, .JPG
, .JpG
. Cela nous conduira à:
-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 les 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 sur -name
Pour voir que -iname
Est la version insensible à la casse de cet argument. Permet d'assembler la commande:
Commande: find /ftp/dir/ -size +500k -iname "*.jpg"
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 paramètre -name
Vous donnera un résumé de cette connaissance.
Certaines options, mnémoniques et "style de syntaxe" parcourent toutes les commandes, vous faisant gagner du temps sans avoir à ouvrir la page de manuel du tout. Ceux-ci sont appris par la pratique et les plus courants sont:
-v
Signifie verbeux. -vvv
Est une variante "très très verbeuse" de certains logiciels.tar -xzvf
, cp -Rv
.-R
Et/ou -r
Signifie récursif.--help
.--version
Affiche la version d'un logiciel.-p
, Lorsque vous copiez ou déplacez des utilitaires signifie "conserver les autorisations".-y
Signifie OUI, ou "procéder sans confirmation" dans la plupart des cas.Notez que ce qui précède n'est pas toujours vrai cependant. Par exemple, le commutateur -r
Peut signifier 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 peut être dangereuse, mais ce sont des valeurs par défaut courantes.
Au niveau du pager de cette réponse, nous avons vu que less -is
Est le pager de man
. Le comportement par défaut des commandes n'est pas toujours affiché dans une section séparée sur les pages de manuel, ou dans la section la plus en haut.
Vous devrez lire les options pour connaître les valeurs par défaut, ou si vous êtes chanceux, en tapant /pager
vous mènera à cette information. Cela vous oblige également à connaître 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 beaucoup de pages de manuel.
Pourquoi est-ce important? Cela ouvrira votre perception si vous trouvez des différences sur le comportement du défilement et des couleurs lors de la lecture man(1)
sur Linux (pager less -is
) Ou FreeBSD man(1)
par exemple.
SYNOPSIS
?Après avoir obtenu toutes les informations nécessaires à l'exécution de la commande, vous pouvez combiner des options, des arguments d'option et des opérandes en ligne pour faire votre travail. Aperçu des concepts:
-t
Au montage, qui spécifie le type d'un système de fichiers (-t iso9660
, -t ext2
). " Faites cela les yeux fermés" ou " nourrissez les animaux, mais seulement les lions". Aussi appelé arguments.cat file.txt
, L'opérande est un fichier dans votre répertoire courant, et son contenu sera affiché sur STDOUT
. ls
est une commande où un opérande est facultatif. Les trois points après l'opérande vous indiquent implicitement que cat
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 à utiliser. Exemple: cat [OPTION] [FILE]...
Trucs de synopsis associés:
and
, to
, for
dans les pages de manuellftp
(et ses pages de manuel), vous ne pouvez pas savoir que c'est une option appropriée en tant que client ftp plus sophistiqué en exécutant man -k ftp
Dans certains cas, les exemples seront assez simples, et vous devrez effectuer certaines exécutions de votre commande pour le tester, ou dans le pire des cas, le faire sur Google.
Si vous programmez ou créez simplement des scripts, gardez à l'esprit que certaines langues ont leurs propres systèmes de pages de manuel, comme Perl
(perldocs
), python (pydocs
), etc. 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 à l'aide du module Perl Mail::IMAPClient
.
Vous devrez trouver ces pages de manuel spécifiques en utilisant man -k
Ou en recherchant en ligne. Exemples:
[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,
);
... des tonnes d'autres choses ici, avec des sections comme une page de manuel régulière ...
Avec python:
[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...
Ou, la fonction help()
inside python Shell si vous voulez lire plus de détails sur un objet:
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.
Bonus: La commande wtf
peut vous aider avec les acronymes et elle fonctionne comme whatis
si aucun acronyme sur sa base de données n'est trouvé, mais ce que vous recherchez fait partie de la base de données man. Sur Debian, cette commande fait partie du paquet bsdgames
. Exemples:
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
Ceci est assez bien expliqué dans man man
:
The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.
bold text type exactly as shown.
italic text replace with appropriate argument.
[-abc] any or all arguments within [ ] are optional.
-a|-b options delimited by | cannot be used together.
argument ... argument is repeatable.
[expression] ... entire expression within [ ] is repeatable.
Quant à la façon dont vous êtes censé écrire une commande valide à partir de cela, eh bien, vous ne l'êtes pas. Le synopsis est utile une fois que vous savez comment fonctionne une commande. Cela peut vous aider à rafraîchir votre mémoire. Afin de comprendre le fonctionnement de la commande, vous devez lire la page de manuel. Surtout les descriptions des options et la section des exemples.
Parfois, le synopsis suffit. Par exemple, dans man ls
:
SYNOPSIS
ls [OPTION]... [FILE]...
D'autres fois, cela ne sert à rien sauf si vous savez déjà comment utiliser la commande en question. Par exemple, man dd
:
dd [OPERAND]...
dd OPTION
Donc, en conclusion, ne vous inquiétez pas si vous n'obtenez pas le synopsis. C'est normal. Lisez la page de manuel elle-même.
Quelques notions de base pour comprendre le synopsis
[foo]
représente un argument ou un paramètre facultatif.[foo [ bar ] ]
la syntaxe est utilisée, vous pouvez utiliser foo et vous pouvez ajouter une barre.[ -S size ]
, qui indique que l'argument -S attend une taille obligatoire.Par exemple : foo [-S size ] filename ...
veux dire
foo
-S
peut être utilisé, vous devez dire size
(le nom vous donne un indice)filename
(cela vous donne également un indice, voir man mkdir
)...
vous indique que vous pouvez utiliser plusieurs fichiers.Vous devez toujours aller dans la profondeur de la page de manuel pour comprendre l'option (dans mon exemple ci-dessus, ce que -S size
est à propos )
man
les pages sont normalement affichées avec less
de nos jours. Cela permet de les parcourir. Je ne m'embêterais pas avec le synopsis, surtout pas parce que vous avez une ligne de commande particulière que vous voulez comprendre.
Frappez le / et commencez à taper -I
et alors Enter. Le premier hit sera dans le synopsis, le second (utilisez n pour la suite) vous donne l'explication détaillée de -I
.
Une chose clé à retenir est que vous ne pouvez pas seulement regarder le manuel d'une commande, dans le cas de commandes qui exécutent d'autres commandes.
Pour votre exemple de commande
locate something | xargs -I {} bash -c "if [ -d "{}" ]; then echo {}; fi"
Vous avez besoin d'informations non seulement sur xargs
mais aussi sur bash
et [
(cela peut être dans la page de manuel test
). Vous pouvez également avoir besoin d'informations sur votre shell (probablement aussi bash) pour les règles de citation, car votre commande comprend une chaîne complexe entre guillemets. Je peux déjà vous dire que l'argument cité est faux (et faux d'une manière qui n'apparaîtra que lorsque vous rencontrez un fichier avec des espaces dans le nom); l'intérieur "{}"
devrait probablement être '{}'
.
Donc, vous devez d'abord vous référer à la page de manuel xargs et voir [-I replace-str]
pour quoi -I {}
signifie et [command [initial-arguments]]
pour ce que bash
et tout ce que cela signifie. Vous feriez alors référence à la page de manuel bash
pour savoir ce que -c
le fait, etc.
Ajoutant aux bonnes réponses déjà données:
1) Si vous êtes intéressé par un utilitaire gnu, en particulier ceux comme sed
et grep
, parfois, l'utilisation de la commande info
fera apparaître une version considérablement développée de la commande information. sed
, par exemple, a une section détaillée sur la façon d'écrire des expressions régulières et une autre section avec des exemples d'utilisation très complexes.
2) C'est un "manuel". Un manuel est principalement conçu pour vous aider à vous souvenir des détails de quelque chose que vous comprenez déjà. Il est conçu pour que vous puissiez obtenir rapidement les détails dont vous avez besoin et sortir. (Et beaucoup trop n'ont pas d'exemples d'utilisation ou seulement des exemples triviaux.)
Lorsque j'ai besoin d'apprendre quelque chose de nouveau, même une petite fonctionnalité d'une commande qui ne m'est pas claire, je vais sur le Web et je recherche en utilisant les meilleurs mots clés auxquels je peux penser (par exemple Linux
xargs
) et ajoutez le mot howto
, examples
ou tutorial
. C'est très souvent très productif.
J'utilise habituellement duckduckgo car il préserve ma confidentialité, mais si j'ai besoin de plus de contrôle sur mes recherches, j'utilise Google parce que je peux lui dire de rechercher uniquement sur un site Web ou de ne renvoyer que les résultats de l'année dernière. (Il possède de nombreuses autres options de recherche avancée. Vous pouvez les rechercher sur Google.;))
Un autre conseil:
Pour les commandes que je référence souvent, j'enregistre la page de manuel dans un fichier texte
man bash > bashman.txt
et charger ce fichier dans une autre fenêtre de mon éditeur de texte afin que je puisse basculer d'avant en arrière, copier et coller, etc. Je fais généralement le fichier en lecture seule, donc je ne finis pas par le malmener par accident, mais puisque c'est mon copie personnelle, je pourrais l'éditer comme je le souhaite, en ajoutant des balises pour que je puisse trouver une section plus facilement ou même en ajoutant mes propres notes ou exemples.
Le seul inconvénient est que la page de manuel d'origine peut être mise à jour et que ma copie est statique.
Pour obtenir une aide rapide avec votre commande spécifique, vous pouvez utiliser Explain Shell . Par exemple. votre commande . Après avoir obtenu la première compréhension de haut niveau de la façon dont cela fonctionne, vous devez continuer avec les pages de manuel comme le recommandent les autres réponses.
Il existe deux outils utiles pour en savoir plus sur les commandes Linux:
cheat
affichera l'option fréquemment utilisée pour une ligne de commande. Vous pouvez également ajouter votre propre command + option
à afficher via cheat
pour une commande spécifique.bropages
l'outil fournit un exemple pour une ligne de commande, il est possible d'ajouter votre propre exemple ou de voter en amont/en aval pour l'exemple donné après avoir obtenu le code de vérification via bro thanks
. La commande doit voter apparaîtra en haut de la page bro
.Je suggère tldr
pour un outil complet semblable à l'homme. Pages de manuel simplifiées et axées sur la communauté. Dans Ubuntu, vous pouvez l'installer via snap, mais il a également des versions pour d'autres distributions. Il vous fournit également plusieurs exemples d'utilisation courants. 100% recommandé.
> Je recherche de l'aide pour interpréter une page de manuel afin de comprendre des commandes compliquées.
Je pense que c'est le malentendu ici. Ce qui rend Linux/UNIX si puissant, c'est que vous pouvez construire des commandes très longues et efficaces par ex. rediriger la sortie standard d'une commande (ici, locate
) vers la stdin d'une autre (ici, xargs
) via un tube (|
). Par conséquent, comme Random832 l'a correctement dit, vous ne trouverez pas une seule page de manuel qui explique ce que fait votre exemple de commande.
Je vous recommande de lire un guide de scriptage Linux Shell; le Advanced Bash-Scripting Guide est un excellent document. Je vous en prie, ne vous laissez pas intimider; maîtriser Linux nécessite des années et est un processus sans fin, mais vous pouvez apprendre les bases dans un délai raisonnable.
Reportez-vous ensuite aux pages de manuel lorsque vous avez besoin de connaître les détails d'une commande spécifique.
Une fois que vous en avez l'essentiel, Commandlinef et Bash One-Liners valent également la peine d'être lus pour obtenir de bons exemples.