getopt(3) - wariua/manpages-ko GitHub Wiki
getopt, getopt_long, getopt_long_only, optarg, optind, opterr, optopt - λͺ λ Ήν μ΅μ νμ±
#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);
glibc κΈ°λ₯ νμΈ λ§€ν¬λ‘ μ건 (feature_test_macros(7) μ°Έκ³ ):
-
getopt()
: _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE
-
getopt_long()
,getopt_long_only()
: _GNU_SOURCE
getopt()
ν¨μλ λͺ
λ Ήν μΈμλ€μ νμ± νλ€. μΈμ argc
μ argv
λ νλ‘κ·Έλ¨ νΈμΆ μ main()
ν¨μλ‘ μ λ¬λ μΈμ κ°μ λ° λ°°μ΄μ΄λ€. argv
μ νλͺ© μ€ '-'λ‘ μμνλ (κ·Έλ¬λ©΄μ "-"μ΄λ "--"λ μλ) κ² μ΅μ
νλͺ©μ΄λ€. κ·Έ νλͺ©μ (μ²μ '-'λ₯Ό μ μΈν) λ¬Έμλ€μ΄ μ΅μ
λ¬Έμμ΄λ€. getopt()
λ₯Ό λ°λ³΅ν΄μ νΈμΆνλ©΄ μ΅μ
νλͺ© κ°κ°μ μ΅μ
λ¬Έμ κ°κ°μ μ°¨λ‘λ‘ λ°ννλ€.
λ³μ optind
λ argv
μμ λ€μμΌλ‘ μ²λ¦¬ν νλͺ©μ μΈλ±μ€μ΄λ€. μμ€ν
μμ μ΄ κ°μ 1λ‘ μ΄κΈ°ν νλ€. νΈμΆμκ° μ΄ κ°μ 1λ‘ μ¬μ€μ ν΄μ λμΌν argv
λ₯Ό λ€μ νκ±°λ μλ‘μ΄ μΈμ 벑ν°λ₯Ό νμ μ μλ€.
getopt()
μμ μ΅μ
λ¬Έμλ₯Ό λ μ°ΎμΌλ©΄ κ·Έ λ¬Έμλ₯Ό λ°ννκ³ , μΈλΆ λ³μ optind
μ μ μ λ³μ nextchar
λ₯Ό κ°±μ ν΄μ λ€μ getopt()
νΈμΆμμ κ·Έ λ€μ μ΅μ
λ¬Έμ λ΄μ§ argv
νλͺ©μ κ³μ νμ μ μλλ‘ νλ€.
μ΅μ
λ¬Έμκ° λλ μμΌλ©΄ getopt()
κ° -1μ λ°ννλ€. κ·Έλ optind
λ μ΅μ
μ΄ μλ 첫 λ²μ§Έ argv
νλͺ©μ argv
λ΄ μΈλ±μ€μ΄λ€.
optstring
μ μ ν¨ν μ΅μ
λ¬Έμλ€μ λ΄μ λ¬Έμμ΄μ΄λ€. κ·Έ λ¬Έμ λ€μ μ½λ‘ μ΄ μμΌλ©΄ μ΅μ
μ μΈμκ° μμ΄μΌ νλ©° getopt()
μμλ κ°μ argv
νλͺ© λ΄μ λ€μ ν
μ€νΈλ λ€μ argv
νλͺ©μ ν
μ€νΈμ λν ν¬μΈν°λ₯Ό optarg
μ μ§μ΄λ£λλ€. μ½λ‘ μ΄ λ κ°λ©΄ κ·Έ μ΅μ
μ΄ μ νμ μΈμλ₯Ό λ°λλ€λ λ»μ΄λ€. νμ¬ argv
νλͺ© λ΄μ ν
μ€νΈκ° μμΌλ©΄ (μ¦ λμΌ λ¨μ΄μ μ΅μ
μ΄λ¦κ³Ό ν¨κ» μμΌλ©΄, "-oarg"μ²λΌ) optarg
λ‘ λ°νλκ³ μλλ©΄ optarg
κ° 0μΌλ‘ μ€μ λλ€. μ΄ λ°©μμ GNU νμ₯μ΄λ€. κ·Έλ¦¬κ³ optstring
μ W
κ° μκ³ μΈλ―Έμ½λ‘ μ΄ λ°λΌμ€λ©΄ -W foo
λ₯Ό κΈ΄ μ΅μ
--foo
μ²λΌ λ€λ£¬λ€. (-W
μ΅μ
μ POSIX.2μμ ꡬν νμ₯μ©μΌλ‘ μμ½λΌ μλ€.) μ΄ λμ λ°©μμ GNU νμ₯μ΄λ©° glibc 2 μ μ λΌμ΄λΈλ¬λ¦¬μμλ μ¬μ© λΆκ°λ₯νλ€.
κΈ°λ³Έμ μΌλ‘ getopt()
μμλ argv
μ λ΄μ©λ¬Όμ μλ‘ λ°κΏμ μ΅μ’
μ μΌλ‘ μ΅μ
μλ κ²λ€μ΄ λ€λ‘ κ°κ² νλ€. κ·Έμ λ€λ₯Έ λμ λ°©μλ λ κ°μ§ ꡬνλΌ μλ€. optstring
μ 첫 λ¬Έμκ° '+'μ΄κ±°λ νκ²½ λ³μ POSIXLY_CORRECT
κ° μ€μ λΌ μμΌλ©΄ μ΅μ
μλ μΈμλ₯Ό λ§λμλ§μ μ²λ¦¬λ₯Ό λ©μΆλ€. λ optstring
μ 첫 λ¬Έμκ° '-'μ΄λ©΄ μ΅μ
μλ argv
νλͺ© κ°κ°μ λ¬Έμ μ½λκ° 1μΈ μ΅μ
μ μΈμμΈ κ²μ²λΌ μ²λ¦¬νλ€. (μ΅μ
κ³Ό λ€λ₯Έ argv
νλͺ©λ€μ μ무 μμλ‘λ λ°μ μ μκ³ κ·Έ λμμμ μμμ κ΄μ¬ μλ νλ‘κ·Έλ¨μμ μ΄ λ°©μμ μ΄λ€.) νλ λ°©μμ΄ λλ κ°μ νΉμ μΈμ "--"λ μ΅μ
νμμ κ°μ λ‘ λλΈλ€.
μ΅μ
λͺ©λ‘μ μ²λ¦¬νλ λμ getopt()
λ λ κ°μ§ μ€λ₯λ₯Ό νμ§ν μ μλ€. (1) optstring
μ μ§μ νμ§ μμ μ΅μ
λ¬Έμκ° μλ κ²½μ°μ (2) μ΅μ
μΈμκ° λΉ μ Έ μλ κ²½μ°(μ¦ λͺ
λ Ήν λ§μ§λ§ μ΅μ
μ νμ μΈμκ° μλ κ²½μ°)μ΄λ€. κ·Έλ° μ€λ₯λ€μ λ€μκ³Ό κ°μ΄ μ²λ¦¬νκ³ λ³΄κ³ νλ€.
-
κΈ°λ³Έμ μΌλ‘λ
getopt()
μμ μ€λ₯ λ©μμ§λ₯Ό νμ€ μ€λ₯λ‘ μ°κ³ , λ¬Έμ μ μ΅μ λ¬Έμλ₯Όoptopt
μ μ§μ΄λ£κ³ , ν¨μ κ²°κ³Όλ‘ '?'λ₯Ό λ°ννλ€. -
νΈμΆμκ° μ μ λ³μ
opterr
λ₯Ό 0μΌλ‘ μ€μ νμΌλ©΄getopt()
μμ μ€λ₯ λ©μμ§λ₯Ό μ°μ§ μλλ€. νΈμΆμλ ν¨μ λ°ν κ°μ΄ '?'μΈμ§ κ²μ¬ν΄μ μ€λ₯κ° μμλμ§ μμλΌ μ μλ€. (κΈ°λ³Έμ μΌλ‘opterr
λ 0 μλ κ°μ κ°μ§κ³ μλ€.) -
optstring
μ (μμ μ€λͺ ν μ νμ '+' λ΄μ§ '-' λ€μμ) 첫 λ²μ§Έ λ¬Έμκ° μ½λ‘ (':')μ΄λ©΄ λ§μ°¬κ°μ§λ‘getopt()
κ° μ€λ₯ λ©μμ§λ₯Ό μ°μ§ μλλ€. λλΆμ΄ λΉ μ§ μ΅μ μΈμλ₯Ό λνλ΄λ λ° '?' λμ ':'λ₯Ό λ°ννλ€. κ·Έλμ νΈμΆμκ° λ κ°μ§ μ€λ₯λ₯Ό ꡬλ³ν μ μκ² λλ€.
getopt_long()
ν¨μλ getopt()
μ²λΌ λμνλ λμ λ κ°λ‘ μμνλ κΈ΄ μ΅μ
λ€λ λ°λλ€. (νλ‘κ·Έλ¨μμ κΈ΄ μ΅μ
λ§ λ°μΌλ €λ κ²½μ°μλ optstring
μ NULLμ μλλΌ λΉ λ¬Έμμ΄("")λ‘ μ§μ ν΄μΌ νλ€.) μ§§κ² μ€μΈ μ΅μ
λ¬Έμκ° μ μΌνκ±°λ μ΄λ―Έ μ μλ μ΄λ€ μ΅μ
κ³Ό μΌμΉνλ κ²½μ°μλ κΈ΄ μ΅μ
μ΄λ¦μ μΆμ½ν μλ μλ€. κΈ΄ μ΅μ
μμλ --arg=param
μ΄λ --arg param
ννλ‘ λ§€κ°λ³μλ₯Ό λ°μ μ μλ€.
longopts
λ <getopt.h>
μ λ€μμ²λΌ μ μΈλ struct option
μ λ°°μ΄ μ²« νλͺ©μ κ°λ¦¬ν€λ ν¬μΈν°μ΄λ€.
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
κ° νλμ μλ―Έλ λ€μκ³Ό κ°λ€.
name
- κΈ΄ μ΅μ μ μ΄λ¦μ΄λ€.
has_arg
-
no_argument
(0)μ΄λ©΄ μ΅μ μ μΈμλ₯Ό λ°μ§ μκ³ ,required_argument
(1)μ΄λ©΄ μ΅μ μ μΈμκ° νμμ΄κ³ ,optional_argument
(2)μ΄λ©΄ μ΅μ μμ μ νμ μΈμλ₯Ό λ°λλ€. flag
- κΈ΄ μ΅μ
μ λν κ²°κ³Όλ₯Ό μ΄λ»κ² λ°ννλμ§ μ§μ νλ€.
flag
κ° NULLμ΄λ©΄getopt_long()
μ΄val
μ λ°ννλ€. (μλ₯Ό λ€μ΄ νΈμΆ νλ‘κ·Έλ¨μμλval
μ λμνλ μ§§μ μ΅μ λ¬Έμλ‘ μ€μ ν μ μλ€.) μλλ©΄getopt_long()
μ΄ 0μ λ°ννλ©°, μ΅μ μ μ°ΎμμΌλ©΄flag
κ° κ°λ¦¬ν€λ λ³μλ₯Όval
λ‘ μ€μ νκ³ μ°Ύμ§ λͺ»νμΌλ©΄ κ·Έλλ‘ λλ€. val
- λ°νλλ κ°, λλ
flag
κ° κ°λ¦¬ν€λ λ³μμ λ£μ κ°.
λ°°μ΄ λ§μ§λ§ νλͺ©μ΄ 0μΌλ‘ μ±μμ Έ μμ΄μΌ νλ€.
longindex
κ° NULLμ΄ μλλ©΄ κ°λ¦¬ν€λ λ³μλ₯Ό longopts
μμμ κΈ΄ μ΅μ
μΈλ±μ€λ‘ μ€μ νλ€.
getopt_long_only()λ
getopt_long()`κ³Ό λΉμ·νλ "--"λΏ μλλΌ '-'λ‘λ κΈ΄ μ΅μ
μ λνλΌ μ μλ€. '-'λ‘ ("--" μλ) μμνλ μ΅μ
κ³Ό μΌμΉνλ κΈ΄ μ΅μ
μ΄ μκ³ μ§§μ μ΅μ
μ μλ κ²½μ°μλ μ§§μ μ΅μ
μΌλ‘ νμ± νλ€.
μ΅μ
μ μ±κ³΅μ μΌλ‘ μ°Ύμ κ²½μ° getopt()
κ° μ΅μ
λ¬Έμλ₯Ό λ°ννλ€. λͺ
λ Ήν μ΅μ
λ€μ λͺ¨λ νμ± νμΌλ©΄ getopt()
κ° -1μ λ°ννλ€. optstring
μ μλ μ΅μ
λ¬Έμλ₯Ό λ§λ¬μΌλ©΄ getopt()
κ° '?'μ λ°ννλ€. μΈμκ° λΉ μ Έ μλ μ΅μ
μ λ§λ¬μΌλ©΄ optstring
μ 첫 λ¬Έμμ λ°λΌ λ°ν κ°μ΄ μ ν΄μ§λ€. μ¦ μ²« λ¬Έμκ° ':'μ΄λ©΄ ':'μ λ°ννκ³ μλλ©΄ '?'λ₯Ό λ°ννλ€.
getopt_long()
κ³Ό getopt_long_only()
λ μ§§μ μ΅μ
μ μΈμνμ λλ μ΅μ
λ¬Έμλ₯Ό λ°ννλ€. κΈ΄ μ΅μ
μΈ κ²½μ°μλ flag
κ° NULLμ΄λ©΄ val
μ λ°ννκ³ μλλ©΄ 0μ λ°ννλ€. μ€λ₯ λ° -1 λ°νμ getopt()
μμμ κ°μΌλ©°, μΆκ°λ‘ μ¬λ¬ κ°μ§λ‘ ν΄μν μ μλ κ²½μ°λ λΆνμν λ§€κ°λ³μκ° μλ κ²½μ°μ '?'λ₯Ό λ°ννλ€.
POSIXLY_CORRECT
- μ€μ λ κ²½μ° μ΅μ μλ μΈμλ₯Ό λ§λμλ§μ μ΅μ μ²λ¦¬λ₯Ό λ©μΆλ€.
_<PID>_GNU_nonoption_argv_flags_
-
bash(1)
2.0μμ μ΄ λ³μλ₯Ό μ¬μ©νλλ° μ΄λ€ μΈμκ° μμΌλμΉ΄λ νμ₯μ κ²°κ³Όμ΄λ―λ‘ μ΅μ μΌλ‘ λ€λ€μ μ λλ€λ κ±Έ glibcμκ² μλ € μ£Όλ μ©λμλ€.bash(1)
λ²μ 2.01μμ μ΄ λμμ΄ μ κ±°λμμ§λ§ glibcμλ μ§μμ΄ λ¨μ μλ€.
μ΄ μ μμ μ¬μ©νλ μ©μ΄λ€μ λν μ€λͺ μ attributes(7)λ₯Ό 보λΌ.
μΈν°νμ΄μ€ | μμ± | κ° |
---|---|---|
getopt() , getopt_long() ,getopt_long_only()
|
μ€λ λ μμ μ± | MT-Unsafe race:getopt env |
-
getopt()
: -
νκ²½ λ³μ
POSIXLY_CORRECT
κ° μ€μ λΌ μλ€λ©΄ POSIX.1-2001, POSIX.1-2008, POSIX.2. μλλΌλ©΄argv
μ νλͺ©λ€μ κ΅νμ΄ κ°λ₯ν΄μΌ νλ―λ‘ μ§μ§const
κ° μλλ€. λ€λ₯Έ μμ€ν κ³Όμ νΈνμ±μ μν΄ μνμμλconst
μΈ κ²μ²λΌ νλ€.optstring
μ '+' λ° '-'λ₯Ό μ°λ κ²μ GNU νμ₯μ΄λ€.μΌλΆ ꡬμ ꡬνλ€μμλ
getopt()
κ°<stdin.h>
μ μ μΈλΌ μμλ€. SUSv1μμλ μ μΈμ΄<unistd.h>
μ<stdio.h>
μ΄λ μͺ½μμ λμ€λ νμ©νλ€. POSIX.1-1996μμ μ΄ μ©λμ<stdio.h>
λ₯Ό μ°λ κ²μ LEGACYλ‘ νμνλ€. POSIX.1-2001μμλ<stdio.h>
μ μ μΈμ΄ λμμΌ νλ€κ³ μꡬνμ§ μλλ€. -
getopt_long()
λ°getopt_long_only()
: - μ΄ ν¨μλ€μ GNU νμ₯μ΄λ€.
μ¬λ¬ μΈμ 벑ν°λ₯Ό νκ±°λ κ°μ 벑ν°λ₯Ό μ¬λ¬ λ² λ€μ νλ νλ‘κ·Έλ¨μμ optstring
μ λμ '+'μ '-' κ°μ GNU νμ₯μ μ°κ³ μΆκ±°λ νμ μ¬μ΄μ POSIXLY_CORRECT
μ κ°μ λ°κΎΈκ³ μΆμ κ²½μ°μλ optind
λ₯Ό (μ ν΅μ κ°μΈ 1 λμ ) 0μΌλ‘ μ¬μ€μ ν΄μ getopt()
λ₯Ό μ¬μ΄κΈ°ν ν΄μΌ νλ€. (0μΌλ‘ μ¬μ€μ νλ©΄ λ΄λΆ μ΄κΈ°ν 루ν΄μ΄ νΈμΆλΌμ POSIXLY_CORRECT
λ₯Ό μ¬νμΈνκ³ optstring
μ GNU νμ₯μ νμΈνλ€.)
λ€μμ κ°λ¨ν μμ νλ‘κ·Έλ¨μμλ getopt()
λ₯Ό μ¬μ©ν΄ λ κ°μ§ νλ‘κ·Έλ¨ μ΅μ
μ μ²λ¦¬νλ€. μ°κ³ κ°μ΄ μλ -n
μ΅μ
, κ·Έλ¦¬κ³ μ°κ³λ κ°μ΄ νμν -t val
μ΅μ
μ΄λ€.
#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]);
/* λλ¨Έμ§ μ½λ μλ΅ */
exit(EXIT_SUCCESS);
}
λ€μ μμ νλ‘κ·Έλ¨μμλ getopt_long()
μ μ¬λ¬ κΈ°λ₯μ μ¬μ©νλ κ±Έ λ³΄μ¬ μ€λ€.
#include <stdio.h> /* for printf */
#include <stdlib.h> /* for 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);
}
getopt(1)
, getsubopt(3)
2019-03-06