ïŒèšäºã¯ãªãã©ã€ã³ã§èªãããšãã§ããŸãïŒ Markdown |
PDF |
PDFïŒprintïŒ |
HTML ïŒ
ãªãã§ïŒ
ç§ãã¡ã®åšãã®èª°ããåžžã«èšããŸãïŒãããªãã¯ããã®ããã°ã©ã ãæžãæ¹æ³ãåŠã³ããã§ããïŒ ä»ã®äººããããã©ã®ããã«è¡ãããèŠãŠãã ããïŒã ããã§ãç¹ã«å€§åŠã®ç ç©¶ãçµããã«è¿ã¥ããŠããã®ã§ããã®ã¢ããã€ã¹ã«åŸãããšã«ããŸããã 圌ãã
æããæ¹æ³ãšå®éã®äžçã§
ãããè¡ãæ¹æ³ãæ¯èŒããããšã¯ç¹ã«è峿·±ãã
GNU Coreutilsããã±ãŒãžã¯ãåŸãäŸãšããŠéžã°ããŸããã ããã«ã¯ãã¹ãŠããããŸãïŒ
- å³ããç§»æ€æ§ã®èŠä»¶ã
- 倧ããªã©ã€ããµã€ã¯ã«ã
- éçºè
ã®å·šå€§ãªããŒã ã
- ããŸããŸãªè€éãã®ã³ãŒãïŒäºçްãªãšã³ãŒããè¶
æŽç·ŽãããsedãçŽç²ã«é©çšãããwcããmkdir OSã«è¿ããã®ãŸã§ã
GNU Coreutils
GNU Core Utilitesã¯ãåºæ¬çãªãŠãŒã¶ãŒæäœãå®è¡ããããã®äžé£ã®ãŠãŒãã£ãªãã£ã§ãïŒãã£ã¬ã¯ããªã®äœæãç»é¢ãžã®ãã¡ã€ã«ã®è¡šç€ºãªã©ã éçºè
ã«ãããšããããã®ãŠãŒãã£ãªãã£ã¯ãã¹ãŠã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§å©çšå¯èœã§ããå¿
èŠããããŸããçŸåšèгå¯ããŠããã®ã¯ãWindowsçšã®
CygwinããããŸããã* nixã«ã€ããŠã¯äœãèšããŸããã Coreutilsã
æºæ ããããš
ãã POSIXæšæºã¯ãç°ãªãã·ã¹ãã éã§äœæ¥ã®åäžæ§ã
ç¶æããã®ã«åœ¹ç«ã¡ãŸãã Coreutilsã«ã¯ãcatãtailãechoãwcãªã©ã®äžè¬çã«äœ¿çšããããŠãŒãã£ãªãã£ãå«ãŸããŠããŸãã
æåã«ãyesãšåŒã°ããæãåçŽãªããã°ã©ã ãéžæããŸãããã ãã®ã·ã³ãã«ãã«ãããCoreutilsã§äœ¿çšãããããŒã«ãšã©ã€ãã©ãªãçè§£ã§ããŸãã
ãŠãŒãã£ãªãã£ã¯ã
ãããèšãããã«ãyesãŠãŒãã£ãªãã£ã§ã§ããããšã¯ããynããstdoutã«ç¡éã«åºåããããšã ãã§ãã yesã«åŒæ°ãæž¡ããšããyãã®ä»£ããã«yesãåŒæ°ãã¹ããŒã¹ä»ãã§åºåããŸãã 確ãã«ãåæ§ã®ããã°ã©ã ãCãå匷ãå§ãããã¹ãŠã®äººã«ãã£ãŠæžãããŸãããã€ãŸããå€ãã®äººããGNUã®å³ããã²ããçãããããããã®ããæ¹ãšåœŒãã®ã¢ãããŒããæ¯èŒããæ©äŒãæã£ãŠããŸãã å®çšçãªã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠã¯ãã¯
ãŠã£ãããã£ã¢ã«å°ãæžãããŠããŸãã
ãœãŒã¹ã³ãŒã
ãœãŒã¹ã³ãŒãã«æž¡ããŸãã
apt-get source
ã䜿çšããŠååŸããããã©ã«ãã§ã·ã¹ãã ã§äœ¿çšãããŠããããŒãžã§ã³ãååŸãããããªããžããªããææ°ããŒãžã§ã³ãååŸããŸãã 2çªç®ã®ãªãã·ã§ã³ãéžæããŸãããã䟿å©ã§äœ¿ããããã§ãã
- CoreutilsïŒ
git clone git://git.sv.gnu.org/coreutils
- GnulibïŒæ°åãããèŠãŠãã ããïŒïŒ
git clone git://git.savannah.gnu.org/gnulib.git
ãœãŒã¹ã³ãŒãã¯ãã¯ã1ã€ã®
coreutils/src/yes.c
ã«
coreutils/src/yes.c
ããããéããŸãã
ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«
æåã«æ³šæããããšã¯ãã³ãŒãã®ç°åžžãªãã©ãŒãããã§ãã ããã«ã€ããŠã¯ã
察å¿ãã GNUã³ãŒãã£ã³ã°æšæºã®
ç« ã§èªãããšãã§ããŸãã ããšãã°ã颿°ãå®çŸ©ããå Žåãæ»ãå€ã®åã¯å·Šè§æ¬åŒ§ã®ããã«å¥ã®è¡ã«ããå¿
èŠããããŸãã
int main (int argc, char **argv) { foo(); ... }
ã€ã³ãã³ããšé
眮ã«ã¯ã¹ããŒã¹ã®ã¿ã䜿çšãããŸãã ãã¹ãã®ã¬ãã«ãç°ãªãå Žåãã€ã³ãã³ãã®éãã¯2ã¹ããŒã¹ã§ãã æŒç®åã䜿çšããäžæ¬åŒ§ã¯ãç¹ã«ã²ãããã圢ãããŠããŸãã
if (x < foo (y, z)) haha = bar[4] + 5; else { while (z) { haha += foo (z, z); z--; } return ++x + bar (); }
12è¡
yes.c
ã¯ããã¹ãŠã®GPLããã°ã©ã ã®å¿
é ã³ã¡ã³ãã§å§ãŸããŸãã 圌ã¯ãã§ã«ä»ã®ããã°ã©ã ã§ç§ã®ç®ã®ããã«ç¥ã£ãŠããã®ã§ã圌ã®ååšã®å¿
èŠæ§ã¯ç§ã«ãšã£ãŠè¬ã§ããã ãã®ã³ã¡ã³ãã®ããã¹ãã¯ãGPLã®äœ¿çš
èª¬ææžã§ä¿®æ£ãããŠããããšãããããŸããã GPLã®äžã§ãœãããŠã§ã¢ããªãªãŒã¹ããã人ã¯èª°ã§ãããããã®12è¡ã®ã³ããŒã©ã€ãã¹ããŒãã¡ã³ããåãœãŒã¹ã³ãŒããã¡ã€ã«ã®å
é ã«è¿œå ããå¿
èŠããããšæžãããŠããŸãã
initialize_main
ããã°ã©ã ãæåã«è¡ãããšã¯ã
initialize_main
åŒã³åºãããšã§ãã ãã®é¢æ°ã¯ãããã°ã©ã ãåŒæ°ã«å¯ŸããŠç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã®ãã®ã§ãã å®éã«ã¯ãCoreutilsã«ã¯ããã®æ©èœãæçšãªãã®ã«äœ¿çšããåäžã®ãŠãŒãã£ãªãã£ã¯ãããŸããã
coreutils/src/system.h
ããã¹ã¿ãã䜿çšããã
coreutils/src/system.h
ïŒ
#ifndef initialize_main # define initialize_main(ac, av) #endif
ããã°ã©ã å
CoreutilsãŠãŒãã£ãªãã£ã¯ã2ã€ã®ããã°ã©ã åãåºå¥ããŸãã
- ãŠãŒã¶ãŒã倿Žã§ããªãæ£åŒåã
- å®è¡å¯èœãã¡ã€ã«ã®å®éã®ååã
å
¬åŒåã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã§ã³æ
å ±ã衚瀺ããããã«äœ¿çšãããŸãã
user@laptop:~$ yes --version yes (GNU coreutils) 8.5 Usage: yes [STRING]... or: yes OPTION
ããã«ããã®ååã¯å®è¡å¯èœãã¡ã€ã«ã®ååã«äŸåããŸããã
user@laptop:~$ /usr/bin/yes --version yes (GNU coreutils) 8.5 user@laptop:~$ cp /usr/bin/yes ./foo user@laptop:~$ ./foo --version yes (GNU coreutils) 8.5
ãã®åäœã¯ããã¡ã€ã«ã®å
é ã§ç¹å¥ã«å®çŸ©ããã
PROGRAM_NAME
ãã¯ãã«ãã£ãŠä¿èšŒãããŸãã
#define PROGRAM_NAME "yes"
æ¬åã¯
argv[0]
ããããªãã¯ãªãã§ååŸããããšã©ãŒãšãã³ãã衚瀺ããããã«äœ¿çšãããŸãã
user@laptop:~$ yes --help Usage: yes [STRING]... or: yes OPTION user@laptop:~$ /usr/bin/yes --help Usage: /usr/bin/yes [STRING]... or: /usr/bin/yes OPTION
set_program_name
ã®2è¡ç®ã®
set_program_name
颿°ãåŒã³åºãããšã«ããã
argv[0]
ã®å€ãã°ããŒãã«å€æ°
program_name
é
眮ãããŸãã
set_program_name (argv[0])
set_program_name
颿°
set_program_name
ã
Gnulibã©ã€ãã©ãªã«ãã£ãŠæäŸãããŸãã 察å¿ããã³ãŒãã¯ã
gnulib/lib/
ãã£ã¬ã¯ããªã®
progname.h
ããã³
progname.c
ã
set_program_name
ã¯ã
argv[0]
å€ã
progname.h
ã§å®£èšãããã°ããŒãã«å€æ°
program_name
ä¿åããã ãã§ãªããåçã©ã€ãã©ãªãéçºããããã®ããŒã«ã§ãã
GNU Libtoolã®äœ¿çšã«é¢é£ãã远å ã®å€æãå®è¡ããããšã«æ³šæããŠãã ããã
åœéå
Coreutilsã¯äžçäžã§äœ¿çšãããŠããããããã¹ãŠã®ãŠãŒãã£ãªãã£ã«ããŒã«ã©ã€ãºããæ©èœããããŸãã ããã«ããã®æ©èœã¯ã
GNU gettextããã±ãŒãžã®äœ¿çšã«ããæå°éã®åŽåã§æäŸãããŸãã ãã®ããã±ãŒãžã¯GNUãããžã§ã¯ããã¯ããã«è¶
ããŠåºãã£ãŠãããããgettextã®äœ¿çšã¯å°ãé©ãã¹ãããšã§ãã ããšãã°ãç§ã®ãæ°ã«å
¥ãã®Django Webãã¬ãŒã ã¯ãŒã¯ã®åœéåã¯ã
ç¹ã«gettextã«åºã¥ããŠæ§ç¯ã
ããŠããŸãã ããŸããŸãªèšèªããã¬ãŒã ã¯ãŒã¯ãšäžç·ã«gettextã䜿çšããããšã«ã€ããŠã¯ããã§ã«
Habrã§æžããŠã
ãŸã ã
gettextã®åªããç¹æ§ã¯ããã¹ãŠã®èšèªã§ã»ãŒåãæ¹æ³ã§äœ¿çšãããããšã§ãããCãäŸå€ã§ã¯ãããŸããã æšæºã®ããžãã¯é¢æ°
_
ããã®äœ¿çš
usage
ã¯
usage
颿°ã«ãããŸãïŒ
void usage (int status) { if (status != EXIT_SUCCESS) fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name); ... }
_
颿°ã®å®çŸ©ã¯ã䜿ãæ
£ãã
system.h
ãã¡ã€ã«ã«ãããŸãã
#define _(msgid) gettext (msgid)
Coreutilsã®åœéåã¡ã«ããºã ã®åæåã¯ã
main
3ã€ã®é¢æ°ãåŒã³åºãããšã«ããè¡ãããŸãã
setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE);
- setlocaleã¯ãã¢ããªã±ãŒã·ã§ã³ã§åäœããããã«ããã©ã«ãã®ãã±ãŒã«ç°å¢ãèšå®ããŸã
- bindtextdomainã¯ãç¹å®ã®ã¡ãã»ãŒãžãã¡ã€ã³ã®ç¿»èš³ãã¡ã€ã«ãæ¢ãå Žæãæå®ããŸã
- textdomainã¯çŸåšã®ã¡ãã»ãŒãžãã¡ã€ã³ãèšå®ããŸã
ãšã©ãŒåŠç
main
ã³ãŒãã«æ²¿ã£ãŠããã«é²ããšã次ã®è¡ããããŸãã
atexit (close_stdout)
çŽèгçã«ã
close_stdout
颿°ã¯æšæºåºåã¹ããªãŒã ãéãã
stdout
ãäœããã®ãã¡ã€ã«èšè¿°åã«çœ®ãæããŠãããã¡ãªã³ã°ãããåºåã䜿çšããå ŽåãããŒã¿æå€±ãæé€ãããšèãããããããŸããã ãããããªãœãŒã¹ãã¯ãªãŒã³ã¢ããããããã«è¿œå ã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã©ããã«ãããããããã®é¢æ°ã®ãœãŒã¹ã³ãŒããèŠã€ããŠå®éã«ããã§äœãèµ·ããããçè§£ããããšã«æåããŸããã§ããã
ã³ãã³ãã©ã€ã³åŒæ°
ããã¯ãããã°ã©ã èªäœã®äœæ¥ã«é¢ä¿ããªãæåŸã®è³ªåã§ãã ããã§ã¯ãåœéåã®å Žåãšåæ§ã«ãå€ãã®ãããžã§ã¯ãã«ã¯ããŒã«ãããå®çžŸã®ãããœãªã¥ãŒã·ã§ã³ïŒ
Pythonãªã© ïŒ
-getoptã¢ãžã¥ãŒã«ã䜿çšããŸãã ãã®ã¢ãžã¥ãŒã«ã¯éåžžã«åçŽã§ããå®éãéçºè
ã¯ã«ãŒãå
ã§
getopt
ãŸãã¯
getopt_long
颿°ã®ãããããåŒã³åºãå¿
èŠããããŸãã ã€ã³ã¿ãŒãããã§getoptã®è©³çްãèªãããšãã§ããŸãããŸããããã«ã€ããŠãæžããŠããŸãã
Gnulibã«ã¯
parse_long_options
ç¹å¥ãªé¢æ°ããããåŒæ°
--version
ããã³
--help
ãåŠçããŸããããã¯ãGNUã¢ããªã±ãŒã·ã§ã³
ããµããŒããã
å¿
èŠããããŸãã ããã¯
gnulib/lib/long-options.c
ãã¡ã€ã«ã«ãããäœæ¥ã§
getopt_long
ã䜿çšããŸãã
yesã®ãœãŒã¹ã³ãŒãã¯ãgetoptã®ã¯ãŒã«ãªäŸã§ãã åæã«ã倿°ã®åŒæ°ãè§£æããããšã§åŠç¿ã«äžå¿
èŠãªè€éãã¯ãªãããã¹ãŠã®getoptããŒã«ã®äœ¿çšããããŸãã æåã«ããã¡ããã
parse_long_options
åŒã³åºãã
parse_long_options
ãŸãã æ¬¡ã«ããã以äžããŒãªãã·ã§ã³ãæž¡ããããæ®ãã®åŒæ°ãããã°ããããåãªãä»»æã®æååã§ããããšã確èªããŸãã
parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version, usage, AUTHORS, (char const *) NULL); if (getopt_long (argc, argv, "+", NULL, NULL) != -1) usage (EXIT_FAILURE);
次ã®ã³ãŒãã¯ã次ã®ããã«ãã·ã¢èªã«ç¿»èš³ã§ããŸãããã³ãã³ãã©ã€ã³ã®åŒæ°ãªã¹ãã«--versionããã³--helpããŒä»¥å€ã«äœããªãã£ãå Žåããyããstdoutã«åºåããŸããïŒ
if (argc <= optind) { optind = argc; argv[argc++] = bad_cast ("y"); }
argv[argc]
ãžã®æžã蟌ã¿ã¯ãšã©ãŒã§
argv[argc]
ãŸãã
argv[argc]
æšæºã§ã¯ã
argv[argc]
èŠçŽ ãNULLãã€ã³ã¿ãŒã§ããããšãèŠæ±ããŠããŸãã
ã¡ã€ã³ãµã€ã¯ã«
ããŠãç§ãã¡ã¯ããã°ã©ã ã®ãŸãã«æ©èœæ§ã«å°éããŸããã ãã®ãŸãŸã§ãïŒ
while (true) { int i; for (i = optind; i < argc; i++) if (fputs (argv[i], stdout) == EOF || putchar (i == argc - 1 ? '\n' : ' ') == EOF) error (EXIT_FAILURE, errno, _("standard output")); }
ããã§ããã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯æ¬äœã§ã¯ãªã
if
æ¡ä»¶å
ã§å®è¡ãããããšã«æ³šæããŠãã ããã ãã®ãããKerniganãšRitchieã¯ãçµéšè±å¯ãªCããã°ã©ããŒã次ã®ãããªè¡ã®ã³ããŒãå®è£
ããŠãããšæžãããšãã«ã¯åãã€ããŸããã§ããã
while (*dst++ = *src++) ;