Scroll to navigation

GETOPT(3) Manual del Programador de Linux GETOPT(3)

NOMBRE

getopt, getopt_long, getopt_long_only, optarg, optind, opterr, optopt - Parse command-line options

SINOPSIS

#include <unistd.h>
int getopt(int argc, char * const argv[],
           const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
#include <getopt.h>
int getopt_long(int argc, char * const argv[],
           const char *optstring,
           const struct option *longopts, int *longindex);
int getopt_long_only(int argc, char * const argv[],
           const char *optstring,
           const struct option *longopts, int *longindex);

Requisitos de Macros de Prueba de Características para glibc (véase feature_test_macros(7)):

getopt(): _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE
getopt_long(), getopt_long_only(): _GNU_SOURCE

DESCRIPCIÓN

La función getopt() analiza los argumentos de la línea de órdenes. Sus argumentos argc y argv son el número y el vector de argumentos como los pasados a la función main() cuando se ejecuta el programa. Un elemento de argv que comience con '-' (y que no sea exactamente "-" ni "--") es un elemento de opción. Los caracteres de este elemento (aparte del '-' inicial) son caracteres de opción. Si getopt() se llama repetidamente, devuelve sucesivamente cada uno de los caracteres de opción de cada uno de los elementos de opción.

The variable optind is the index of the next element to be processed in argv. The system initializes this value to 1. The caller can reset it to 1 to restart scanning of the same argv, or when scanning a new argument vector.

Si getopt() encuentra otro carácter de opción, lo devuelve, actualizando la variable externa optind y una variable estática nextchar de forma que la siguiente llamada a getopt() pueda seguir la búsqueda en el siguiente carácter de opción o elemento de argv.

Si no hay más caracteres de opción, getopt() devuelve -1. Entonces optind es el índice en argv del primer elemento de argv que no es una opción.

optstring is a string containing the legitimate option characters. If such a character is followed by a colon, the option requires an argument, so getopt() places a pointer to the following text in the same argv-element, or the text of the following argv-element, in optarg. Two colons mean an option takes an optional arg; if there is text in the current argv-element (i.e., in the same word as the option name itself, for example, "-oarg"), then it is returned in optarg, otherwise optarg is set to zero. This is a GNU extension. If optstring contains W followed by a semicolon, then -W foo is treated as the long option --foo. (The -W option is reserved by POSIX.2 for implementation extensions.) This behavior is a GNU extension, not available with libraries before glibc 2.

By default, getopt() permutes the contents of argv as it scans, so that eventually all the nonoptions are at the end. Two other scanning modes are also implemented. If the first character of optstring is '+' or the environment variable POSIXLY_CORRECT is set, then option processing stops as soon as a nonoption argument is encountered. If the first character of optstring is '-', then each nonoption argv-element is handled as if it were the argument of an option with character code 1. (This is used by programs that were written to expect options and other argv-elements in any order and that care about the ordering of the two.) The special argument "--" forces an end of option-scanning regardless of the scanning mode.

While processing the option list, getopt() can detect two kinds of errors: (1) an option character that was not specified in optstring and (2) a missing option argument (i.e., an option at the end of the command line without an expected argument). Such errors are handled and reported as follows:

  • By default, getopt() prints an error message on standard error, places the erroneous option character in optopt, and returns '?' as the function result.
  • If the caller has set the global variable opterr to zero, then getopt() does not print an error message. The caller can determine that there was an error by testing whether the function return value is '?'. (By default, opterr has a nonzero value.)
  • If the first character (following any optional '+' or '-' described above) of optstring is a colon (':'), then getopt() likewise does not print an error message. In addition, it returns ':' instead of '?' to indicate a missing option argument. This allows the caller to distinguish the two different types of errors.

getopt_long() y getopt_long_only()

The getopt_long() function works like getopt() except that it also accepts long options, started with two dashes. (If the program accepts only long options, then optstring should be specified as an empty string (""), not NULL.) Long option names may be abbreviated if the abbreviation is unique or is an exact match for some defined option. A long option may take a parameter, of the form --arg=param or --arg param.

longopts es un puntero al primer elemento de un vector de struct option declarado en <getopt.h> como


struct option {
    const char *name;
    int         has_arg;
    int        *flag;
    int         val;
};


Los significados de los diferentes campos son:

nombre
es el nombre de la opción larga.
has_arg
es: no_argument (ó 0) si la opción no toma un argumento; required_argument (ó 1) si la opción requiere un argumento; u optional_argument (ó 2) si la opción toma un argumento opcional.
flag
especifica cómo se devuelven los resultados para una opción larga. Si flag es NULL, entonces getopt_long() devuelve val. (Por ejemplo, el programa puede poner val como el carácter de opción corta equivalente.) De otro modo, getopt_long() devuelve 0, y flag apunta a una variable que se pone a val si la opción se encuentra, pero que se deja intacta si la opción no se encuentra.
val
es el valor a devolver, o a cargar en la variable apuntada por flag.

El último elemento del vector tiene que ser llenado con ceros.

Si longindex no es NULL, apunta a una variable que toma el valor del índice de la opción larga relativa a longopts.

getopt_long_only() es como getopt_long(), pero tanto '-' como "--" pueden indicar una opción larga. Si una opción que empiece por '-' (no "--") no concordara con una opción larga, pero sí con una corta, se consideraría como tal.

VALOR DEVUELTO

If an option was successfully found, then getopt() returns the option character. If all command-line options have been parsed, then getopt() returns -1. If getopt() encounters an option character that was not in optstring, then '?' is returned. If getopt() encounters an option with a missing argument, then the return value depends on the first character in optstring: if it is ':', then ':' is returned; otherwise '?' is returned.

getopt_long() y getopt_long_only() también devuelven el carácter de la opción cuendo se reconoce una corta. Para una opción larga, devuelven val si flag es NULL, y 0 en otra circunstancia. Las devoluciones de error y -1 son las mismas que para getopt(), más '?' indicando una concordancia ambigua o un parámetro extraño.

ENTORNO

POSIXLY_CORRECT
Si está definida, entonces el procesamiento de las opciones se para tan pronto como se encuentre un argumento que no sea una opción.
_<PID>_GNU_nonoption_argv_flags_
Esta variable era utilizada por bash(1) 2.0 para comunicar a glibc qué argumentos eran el resultado de la expansión de comodines y, por tanto, no debían considerarse como opciones. Este comportamiento se eliminó en la versión 2.01 de bash(1) pero el soporte permanece en glibc.

ATRIBUTOS

Para obtener una explicación de los términos usados en esta sección, véase attributes(7).
Interfaz Atributo Valor
getopt(), getopt_long(), getopt_long_only() Seguridad del hilo MT-Unsafe race:getopt env

CONFORME A

getopt():
POSIX.1-2001, POSIX.1-2008, and POSIX.2, provided the environment variable POSIXLY_CORRECT is set. Otherwise, the elements of argv aren't really const, because these functions permute them. Nevertheless, const is used in the prototype to be compatible with other systems.
The use of '+' and '-' in optstring is a GNU extension.
On some older implementations, getopt() was declared in <stdio.h>. SUSv1 permitted the declaration to appear in either <unistd.h> or <stdio.h>. POSIX.1-1996 marked the use of <stdio.h> for this purpose as LEGACY. POSIX.1-2001 does not require the declaration to appear in <stdio.h>.
getopt_long() y getopt_long_only():
These functions are GNU extensions.

NOTAS

A program that scans multiple argument vectors, or rescans the same vector more than once, and wants to make use of GNU extensions such as '+' and '-' at the start of optstring, or changes the value of POSIXLY_CORRECT between scans, must reinitialize getopt() by resetting optind to 0, rather than the traditional value of 1. (Resetting to 0 forces the invocation of an internal initialization routine that rechecks POSIXLY_CORRECT and checks for GNU extensions in optstring.)

EJEMPLOS

getopt()

The following trivial example program uses getopt() to handle two program options: -n, with no associated value; and -t val, which expects an associated value.

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
    int flags, opt;
    int nsecs, tfnd;
    nsecs = 0;
    tfnd = 0;
    flags = 0;
    while ((opt = getopt(argc, argv, "nt:")) != -1) {
        switch (opt) {
        case 'n':
            flags = 1;
            break;
        case 't':
            nsecs = atoi(optarg);
            tfnd = 1;
            break;
        default: /* '?' */
            fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
                    argv[0]);
            exit(EXIT_FAILURE);
        }
    }
    printf("flags=%d; tfnd=%d; nsecs=%d; optind=%d\n",
            flags, tfnd, nsecs, optind);
    if (optind >= argc) {
        fprintf(stderr, "Expected argument after options\n");
        exit(EXIT_FAILURE);
    }
    printf("name argument = %s\n", argv[optind]);
    /* Other code omitted */
    exit(EXIT_SUCCESS);
}

getopt_long()

El siguiente programa de ejemplo ilustra el empleo de getopt_long() con la mayoría de sus características.

#include <stdio.h>     /* para printf */
#include <stdlib.h>    /* para exit */
#include <getopt.h>
int
main(int argc, char **argv)
{
    int c;
    int digit_optind = 0;
    while (1) {
        int this_option_optind = optind ? optind : 1;
        int option_index = 0;
        static struct option long_options[] = {
            {"add",     required_argument, 0,  0 },
            {"append",  no_argument,       0,  0 },
            {"delete",  required_argument, 0,  0 },
            {"verbose", no_argument,       0,  0 },
            {"create",  required_argument, 0, 'c'},
            {"file",    required_argument, 0,  0 },
            {0,         0,                 0,  0 }
        };
        c = getopt_long(argc, argv, "abc:d:012",
                 long_options, &option_index);
        if (c == -1)
            break;
        switch (c) {
        case 0:
            printf("option %s", long_options[option_index].name);
            if (optarg)
                printf(" with arg %s", optarg);
            printf("\n");
            break;
        case '0':
        case '1':
        case '2':
            if (digit_optind != 0 && digit_optind != this_option_optind)
              printf("digits occur in two different argv-elements.\n");
            digit_optind = this_option_optind;
            printf("option %c\n", c);
            break;
        case 'a':
            printf("option a\n");
            break;
        case 'b':
            printf("option b\n");
            break;
        case 'c':
            printf("option c with value '%s'\n", optarg);
            break;
        case 'd':
            printf("option d with value '%s'\n", optarg);
            break;
        case '?':
            break;
        default:
            printf("?? getopt returned character code 0%o ??\n", c);
        }
    }
    if (optind < argc) {
        printf("non-option ARGV-elements: ");
        while (optind < argc)
            printf("%s ", argv[optind++]);
        printf("\n");
    }
    exit(EXIT_SUCCESS);
}

VÉASE TAMBIÉN

getopt(1), getsubopt(3)

COLOFÓN

Esta página es parte de la versión 5.10 del proyecto Linux man-pages. Puede encontrar una descripción del proyecto, información sobre cómo informar errores y la última versión de esta página en https://www.kernel.org/doc/man-pages/.

TRADUCCIÓN

La traducción al español de esta página del manual fue creada por Gerardo Aburruzaga García <gerardo.aburruzaga@uca.es>, Juan Piernas <piernas@ditec.um.es> y Miguel Pérez Ibars <mpi79470@alu.um.es>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.

Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a debian-l10n-spanish@lists.debian.org>..

9 Junio 2020 GNU