Mientras investigaba otro problema, me encontré con un comando,
locate something | xargs -I {} bash -c "if [ -d "{}" ]; then echo {}; fi"
sobre el que quería aprender más. Así que ejecuté man xargs
y obtenga el siguiente resultado:
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...
Estoy tratando de mejorar en el uso de la documentación para aprender sobre los programas de Linux, pero esa sección de "Sinopsis" es intimidante para los nuevos usuarios. Literalmente parece un galimatías en comparación con man locate
o man free
.
Hasta ahora, entiendo que los corchetes significan opcionales y los corchetes anidados significan opciones en opcionales. Pero, ¿cómo se supone que debo inducir un comando válido con eso?
No estoy pidiendo ayuda con xargs aquí. Estoy buscando ayuda para interpretar una página de manual para comprender comandos complicados. Quiero dejar de hacer que los blogs web indexados por Google y la ayuda personal de otros sean mi primer enfoque para aprender los comandos de Linux.
Respuesta aceptada:
Bueno, esta es mi forma muy personal de leer las páginas de manual:
El buscapersonas
Cuando abre una página de manual usando el man
comando, la salida será mostrada/renderizada por less
o more
comandos, o cualquier otro comando que se establecerá como su buscapersonas (manpager).
Si está utilizando Linux, probablemente tenga su infraestructura man ya configurada para usar /usr/bin/less -is
(a menos que haya instalado alguna distribución mínima) como man(1)
, explique en su sección Opciones:
-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.
En FreeBSD y OpenBSD es solo cuestión de editar el MANPAGER
variable de entorno ya que en su mayoría usarán more
y es posible que falten algunas funciones, como la búsqueda y el resaltado de texto.
Hay una buena respuesta a la pregunta de qué diferencias more
, less
y most
tener aquí (nunca he usado most
). La capacidad de desplazarse hacia atrás y hacia adelante por página con Espacio o en ambos sentidos por línea con ↓ o ↑ (también, usando vi
enlaces j y k ) es esencial al navegar por las páginas de manual. Presione h mientras usa less
para ver el resumen de los comandos disponibles.
Y es por eso que te sugiero que uses less
como su buscapersonas. less
tienen algunas funciones esenciales que se utilizarán durante esta respuesta.
¿Cómo se formatea un comando?
Convenciones de utilidades:las especificaciones básicas de Open Group Edición 7:IEEE Std 1003.1, edición de 2013. Debe visitar ese enlace antes de intentar comprender una página de manual. Esta referencia en línea describe la sintaxis de los argumentos de las utilidades estándar e introduce la terminología utilizada en POSIX.1-2017 para describir los argumentos procesados por las utilidades. Esto también lo actualizará indirectamente sobre el significado real de palabras como parámetros, argumentos, opción de argumento...
El encabezado de cualquier página de manual le parecerá menos críptico después de comprender la notación de las convenciones de la utilidad:
utility_name[-a][-b][-c option_argument]
[-d|-e][-f[option_argument]][operand...]
Ten en cuenta lo que quieres hacer.
Al investigar sobre xargs
Lo hiciste con un propósito, ¿verdad? Tenía una necesidad específica que era leer la salida estándar y ejecutar comandos basados en esa salida.
Pero, ¿cuándo no sé qué comando quiero?
Usa man -k
o apropos
(son equivalentes). Si no sé cómo encontrar un archivo:man -k file | grep search
. Lea las descripciones y encuentre uno que se adapte mejor a sus necesidades. Ejemplo:
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 funciona con expresiones regulares por defecto, (man apropos
, lea la descripción y descubra qué -r
lo hace), y en este ejemplo estoy buscando cada página de manual donde la descripción comienza con "informe".
Para buscar información relacionada con la lectura del procesamiento de entrada/salida estándar y llegar a xargs
como posible opción:
man -k command| grep input
xargs (1) - build and execute command lines from standard input
Lea siempre la DESCRIPTION
antes de empezar
Tómate un tiempo y lee la descripción. Con solo leer la descripción de los xargs
comando aprenderemos que:
xargs
lee de STDIN y ejecuta el comando necesario. Esto también significa que deberá tener algún conocimiento de cómo funciona la entrada estándar y cómo manipularla a través de canalizaciones para encadenar comandos- El comportamiento predeterminado es actuar como
/bin/echo
. Esto le da un pequeño consejo que si necesita encadenar más de unxargs
, no necesita usar echo para imprimir. - También hemos aprendido que los nombres de archivo de Unix pueden contener espacios en blanco y saltos de línea, que esto podría ser un problema y el argumento
-0
es una forma de evitar que las cosas exploten usando separadores de caracteres nulos. La descripción le advierte que el comando que se utiliza como entrada también debe ser compatible con esta característica, y que GNUfind
apoyarlo Estupendo. Usamos mucho find conxargs
. xargs
se detendrá si se alcanza el estado de salida 255.
Algunas descripciones son muy cortas y eso generalmente se debe a que el software funciona de una manera muy simple. Ni se te ocurra saltarte esta parte de la página de manual 😉
Otras cosas a las que prestar atención...
Sabes que puedes buscar archivos usando find
. Hay un montón de opciones y si solo miras el SYNOPSIS
, te sentirás abrumado por esos. Es solo la punta del iceberg. Excluyendo NAME
, SYNOPSIS
y DESCRIPTION
, tendrás las siguientes secciones:
-
AUTHORS
:las personas que crearon o ayudaron en la creación del comando
. -
BUGS
:enumera los defectos conocidos. Podrían ser solo limitaciones de implementación. -
ENVIRONMENT
:Aspectos de su shell que podrían verse afectados por el comando o las variables que se utilizarán. -
EXAMPLES
oNOTES
:Se explica por sí mismo. -
REPORTING BUGS
:A quién deberá contactar si encuentra errores en esta herramienta o en su documentación. -
COPYRIGHT
:Persona que creó y descargos de responsabilidad sobre el software. Todo relacionado con la licencia del propio software. -
SEE ALSO
:Otros comandos, herramientas o aspectos de trabajo que están relacionados con este comando, y que no podrían encajar en ninguna de las otras secciones.
Lo más probable es que encuentre información interesante sobre los aspectos que desea de una herramienta en la sección de ejemplos/notas.
Ejemplo
En los siguientes pasos tomaré find
como ejemplo, ya que sus conceptos son “más simples” que xargs
para explicar (un comando busca archivos y el otro trata con stdin y la ejecución canalizada de otra salida de comando). Finjamos que no sabemos nada (o muy poco) sobre este comando.
tengo un problema especifico que es:tengo que buscar cada archivo con el .jpg
extensión, y con 500 KiB (KiB =1024 bytes, comúnmente llamado kibibyte), o más de tamaño dentro de una carpeta de servidor ftp.
Primero, abre el manual:man find
. La SYNOPSIS
es delgado Busquemos cosas dentro del manual:Escriba / más la palabra que quieras (size
). Indexará muchas entradas -size
que contará tamaños específicos. Quedó atascado. No sé cómo buscar con "más de" o "menos de" un tamaño determinado, y el hombre no me muestra eso.
Pruébelo y busque la siguiente entrada que encuentre presionando n . ESTÁ BIEN. Encontré algo interesante:find
( -size +100M -fprintf /root/big.txt %-10s %pn )
. Tal vez este ejemplo nos muestra que con -size +100M
encontrará archivos con 100 MB o más. ¿Cómo podría confirmar? Ir al encabezado de la página de manual y buscar otras palabras.
De nuevo, probemos con la palabra greater
. Presionando g nos llevará al encabezado de la página de manual. / greater
, y la primera entrada es:
Numeric arguments can be specified as
+n for **greater** than n,
-n for less than n,
n for exactly n.
Suena genial. Parece que este bloque del manual confirmó lo que sospechábamos. Sin embargo, esto no solo se aplicará al tamaño de los archivos. Se aplicará a cualquier n
que se puede encontrar en esta página de manual (como decía la frase:"Los argumentos numéricos se pueden especificar como").
Bien. Busquemos una manera de filtrar por nombre:g / insensitive
. ¿Por qué? ¿Insensible? ¿Qué? Tenemos un servidor ftp hipotético, donde la gente de "ese otro sistema operativo" podría dar un nombre de archivo con extensiones como .jpg
, .JPG
, .JpG
. Esto nos llevará 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.
Sin embargo, después de buscar lname
verás que esto solo buscará enlaces simbólicos. Queremos archivos reales. La siguiente entrada:
-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.
Estupendo. Ni siquiera necesito leer sobre -name
para ver que -iname
es la versión insensible a mayúsculas y minúsculas de este argumento. Vamos a ensamblar el comando:
find /ftp/dir/ -size +500k -iname "*.jpg"
Lo que está implícito aquí:el conocimiento de que el comodín ?
representa "cualquier carácter en una sola posición" y *
representa “cero o más de cualquier carácter”. El -name
El parámetro le dará un resumen de este conocimiento.
Consejos que se aplican a todos los comandos
Algunas opciones, mnemónicos y "estilo de sintaxis" viajan a través de todos los comandos, lo que le permite ganar algo de tiempo al no tener que abrir la página de manual. Los que se aprenden con la práctica y los más comunes son:
- Generalmente,
-v
significa detallado.-vvv
es una variación "muy, muy detallada" en algún software. - Siguiendo el estándar POSIX, generalmente se pueden apilar argumentos de un guión. Ejemplo:
tar -xzvf
,cp -Rv
. - Generalmente
-R
y/o-r
significa recursivo. - Casi todos los comandos tienen una breve ayuda con
--help
opción. --version
muestra la versión de un software.-p
, en las utilidades para copiar o mover significa "conservar permisos".-y
significa SÍ, o "continuar sin confirmación" en la mayoría de los casos.
Sin embargo, tenga en cuenta que lo anterior no siempre es cierto. Por ejemplo, el -r
cambiar puede significar cosas muy diferentes para diferentes programas. Siempre es una buena idea verificar y asegurarse de que un comando pueda ser peligroso, pero estos son valores predeterminados comunes.
Valores predeterminados de los comandos.
En la parte del buscapersonas de esta respuesta, vimos que less -is
es el localizador de man
. El comportamiento predeterminado de los comandos no siempre se muestra en una sección separada en las páginas de manual, o en la sección que está más arriba.
Tendrá que leer las opciones para encontrar los valores predeterminados o, si tiene suerte, escribir / pager
te llevará a esa información. Esto también requiere que conozca el concepto del buscapersonas (software que desplaza la página de manual), y esto es algo que solo adquirirá después de leer muchas páginas de manual.
¿Por qué es eso importante? Esto abrirá su percepción si encuentra diferencias en el desplazamiento y el comportamiento del color mientras lee man(1)
en Linux(less -is
localizador) o FreeBSD man(1)
por ejemplo.
¿Y la SYNOPSIS
? sintaxis?
Después de obtener toda la información necesaria para ejecutar el comando, puede combinar opciones, argumentos de opción y operandos en línea para realizar su trabajo. Resumen de conceptos:
- Las opciones son los interruptores que dictan el comportamiento de un comando. “Haz esto ”
“no hagas esto ” o “actúa de esta manera “. A menudo llamados interruptores. - Los argumentos de opción se usan en la mayoría de los casos cuando una opción no es
binaria (activada/desactivada) como-t
en el montaje, que especifica el tipo de un sistema de archivos
(-t iso9660
,-t ext2
). “Haz esto con los ojos cerrados ” o
“alimenta a los animales, pero solo a los leones “. También llamados argumentos. - Los operandos son elementos sobre los que desea que actúe el comando. Si usa
cat file.txt
, el operando es un archivo dentro de su directorio actual
, y su contenido se mostrará enSTDOUT
.ls
es un comando
donde un operando es opcional. Los tres puntos después del operando
te dicen implícitamente quecat
puede actuar en múltiples operandos (archivos) al mismo tiempo. Puede notar que algunos comandos han establecido qué tipo de operando
utilizará. Ejemplo:cat [OPTION] [FILE]...
Sinopsis relacionadas:
- Comprender la sinopsis en la página de manual
¿Cuándo dejará de funcionar este método?
- Páginas de manual que no tienen ejemplos
- Páginas de manual donde las opciones tienen una breve explicación
- Cuando usa palabras clave genéricas como
and
,to
,for
dentro de las páginas de manual - Páginas de manual que no están instaladas. Parece obvio pero, si no tienes
lftp
(y sus páginas de manual) instalado, no puede saber que es una opción adecuada como un cliente ftp más sofisticado ejecutandoman -k ftp
En algunos casos, los ejemplos serán bastante simples y tendrá que realizar algunas ejecuciones de su comando para probar o, en el peor de los casos, buscarlo en Google.
Otros:Lenguajes de programación y sus módulos:
Si está programando o simplemente creando scripts, tenga en cuenta que algunos lenguajes tienen sus propios sistemas de páginas de manual, como perl
(perldocs
), python(pydocs
), etc., que contiene información específica sobre métodos/funciones, variables, comportamiento y otra información importante sobre el módulo que está tratando de usar y aprender. Esto fue útil para mí cuando estaba creando un script para descargar correos electrónicos IMAP no leídos usando perl Mail::IMAPClient
módulo.
Tendrá que descubrir esas páginas de manual específicas usando man -k
o buscando en línea. Ejemplos:
[[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,
);
…toneladas de otras cosas aquí, con secciones como una página de manual normal…
Con pitón:
[[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...
O bien, la help()
funcion dentro de python shell si desea leer más detalles de algún objeto:
[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.
Bonificación: El wtf
El comando puede ayudarlo con las siglas y funciona como whatis
si no se encuentra ningún acrónimo en su base de datos, pero lo que está buscando es parte de la base de datos man. En Debian, este comando es parte de bsdgames
paquete. Ejemplos:
[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