FAQïŒ OS Infernoãšã¯äœã§ããããªãå¿
èŠãªã®ã§ããïŒé·å¹Žã®Inferno OSã·ã§ã«ã¯ãéåžžã«åŠå®çãªææ
ãåŒãèµ·ãããŸããã ãããŠãç§ã¯
ã€ã³ãã§ã«ãshã§äœäººãã®äººã
ã
åãã§ããããšã«æ°ã¥ããããšããªãã£ãã ãããã圌ããèšãããã«ãããã¯æ±ºããŠé
ãããã¯ãŸãã§ã-ä»æ¥ãç§ã¯ã·ã§ã«ã«æ
éã«å¯ŸåŠããããšã«æ±ºããŸããããããŠçµæãšããŠãç§ãæéãåããŸãã-ããã¯æ¬åœã«ãŠããŒã¯ãªããšã§ãïŒ ä¿¡ããããªãã»ã©ãšã¬ã¬ã³ãã§ã·ã³ãã«ã
ããã§ãã客芳æ§ãé«ããããã«æ¬ ç¹ããå§ããŸãã äž»ãªããšã¯ãã·ã§ã«ãéåžžã«é
ãããšã§ãã çç±ã¯
/dis/sh.dis
ãŸãããããã¹ãŠã®ã·ã§ã«ãã€ã³ãã§ã«ãïŒå®éã«ã¯ããã€ããããŸãããçŸåšã¯
/dis/sh.dis
ã«ã€ããŠè©±ããŠ
/dis/sh.dis
ïŒã¯éåžžã«é
ãã§ãã ããã¯éåžžã«å¥åŠã§ã éåžžãLimboïŒJITã¢ãŒãïŒã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ã®é床ã¯ãCãšPerlãªã©ã®é«éã¹ã¯ãªããèšèªã®é床ã®éã§ãã ãããã£ãŠã
sh
æ¬æ Œçãªã¢ããªã±ãŒã·ã§ã³ã¯æ©èœããŸããã ããããããã«ããããããããããã¿ããšã«LimboãçºèŠããã®ã¯äžäŸ¿ã§ãããã®ããããã¹ãŠã®åãéå§ã¹ã¯ãªããããã®ä»ã®å°ããªããšã
sh
ã§èšè¿°ããå¿
èŠããããŸãã 2çªç®ã®é倧ãªæ¬ ç¹ã¯ãããã¹ãã³ã³ãœãŒã«ã§äœ¿çšããããšã®äžäŸ¿ããã³ãã³ãå±¥æŽã®æ¬ åŠãèªåè£å®ãå
¥åæã®äŸ¿å©ãªç·šéãéåžžã«ãã£ãšãããããšã§ãïŒããããç§ã¯
rlwrapãŠãŒãã£ãªãã£ã«ã€ããŠèãããšããã§ãã 第äž-ãã®ã·ã§ã«ã®æ§æã¯ã察ã«ãªã£ãŠããªãåŒçšç¬Šã䜿çšããããšã¯çããã絶察ã«ä»ã®ã·ã§ã«ã®ããã¯ã©ã€ãã䜿çšããŠã¹ã¯ãªããã®æ§æã匷調ããããšãããšïŒã€ã³ãã¡ãã«ã®æ¢è£œã®ããã¯ã©ã€ãããªãããïŒå®å
šãªæªå€¢ã«ã€ãªãããŸãã ä»æ¥ããã®åé¡ã解決ããããã«ãvimã®æ§æ匷調衚瀺ãå®è£
ããŸããããã®ãããã·ã§ã«ã«å¯ŸåŠããããã«åº§ããŸããããã®çµæãæ§æ匷調衚瀺ã®ä»£ããã«ãæµæã§ããããã®èšäºãæžããŠããŸãã :)
å
容
ç§ãã¡ã®ã¹ã¯ãªããã¯äœãããäœãããäœããäœãããŠããŸããïŒ
/dis/sh.dis
ãµããŒããããæ©èœã¯å°è±¡çã§ãïŒ æ¡ä»¶ä»ãã¹ããŒãã¡ã³ããšã«ãŒããããããŸããïŒ æ©èœãªãã ãããŠãäœãããã«ããããããã®æ¡ä»¶ã«ã©ã®ããã«ååšããããšãã§ããŸããïŒ ã芧ãã ããã ã ããäœã§ããïŒ
- ã¢ããªã±ãŒã·ã§ã³ã®èµ·åïŒãã€ãã©ã€ã³ããã³I / Oãªãã€ã¬ã¯ããå«ãïŒ
- è¡ãè¡ãªã¹ããã³ãã³ããããã¯
- ç°å¢å€æ°
- ãã¡ã€ã«åãã³ãã¬ãŒãïŒ*ãïŒã[...]ïŒ
- ããã€ãã®çµã¿èŸŒã¿ã³ãã³ããšæååãæäœããããã®ã³ãã³ã
ãããããæåŸã®ãã€ã³ããèŠãŠãããã¯ïŒ ããã€ãã®ç¹å¥ãªããŒã ã 確ãã«åœŒãã¯æ®ããããŸãããã¹ãŠãæ±ãã§ãããâŠããããããããããªãã¯æšæž¬ããŸããã§ããã çµã¿èŸŒã¿ã³ãã³ãã®ãã¡ãéåžžã¯
exit
ã
run
ãããã³
load
3ã€ã䜿çšãã
load
ã äžè¬çã«äœ¿çšãããæååã³ãã³ãã¯
quote
ãš
unquote
ã§ãã
run
ã«ã€ããŠã¯ãçŸåšã®ã·ã§ã«ïŒã¢ããã°
.
ãŸãã¯bashã®
source
ã§æå®ãããã¹ã¯ãªãããå®è¡ããã ãã§ãã
ãããã
load
-ã¯ããããã¯ç匟ã§ãïŒ Limboã§äœæãããè¿œå ã¢ãžã¥ãŒã«ãçŸåšã®ã·ã§ã«ã«ããŒãããé¢æ°ãäŸå€ãæ£èŠè¡šçŸãæ°åŠæŒç®ãªã©ã®å Žåãã·ã§ã«ã«æ©èœãå®å
šã«è¿œå ã§ããŸãã ãªã© ãããã®ã¢ãžã¥ãŒã«ãåçã«ã¢ã³ããŒãã§ãã
unload
ã³ãã³ãããããŸãã :)ããã«ãé¢ããããããŒãå¯èœãªã¢ãžã¥ãŒã«ããªããŠããã·ã§ã«ã¯å®å
šã«æ©èœçã§ã-ãããã裞ã®shãã«ifãšforãå®è£
ããããšã§ãèšäºã®æåŸã§èšŒæããŸãïŒ
ãããç§ãèšåããã®ãå¿ããŠããäœãã ïŒä»ã¯ç¢ºãã«ãããïŒãã ãšæããŸããïŒïŒåœŒã¯ãŸã ã³ã¡ã³ããæ¯æããŠããŸãã
#
å§ãŸãã :)
ã¢ããªã±ãŒã·ã§ã³ãèµ·åãã
* nixã·ã§ã«ãšã»ãšãã©åãã§ãïŒ
- ã¢ããªã±ãŒã·ã§ã³ïŒ
.dis
ãã¡ã€ã«ïŒããã³ã¹ã¯ãªããïŒæåã®è¡ãshebang #!
ã§ãããã¡ã€ã«ïŒãå®è¡ããŸã - ããŒã ã¯åé¢ãããŠã
;
&
ä»ããŠããã¯ã°ã©ãŠã³ãã§ã³ãã³ããå®è¡ãã- ã³ãã³ããã€ãã©ã€ã³
>
ã >>
ããã³<
ä»ããŠstdin / stdoutããªãã€ã¬ã¯ãããŸã
; echo one two | wc 1 2 8
ããããéãããããŸãã
è¿œå ã®ã³ãã³ãI / Oãªãã€ã¬ã¯ã
- ãã¡ã€ã«èšè¿°åã®æå®ïŒstderrã®ãªãã€ã¬ã¯ããŸãã¯è¿œå ã®èšè¿°åã«å ããŠãããã©ã«ãã§0ã1ãããã³2ã䜿çšå¯èœïŒ
cmd <stdin.txt >stdout.txt >[2]stderr.txt
cmd >[1=2]
ïŒstdinãstderrã«ãªãã€ã¬ã¯ãïŒcmd <[3]file.txt
ïŒã³ãã³ãã¯ããã¡ã€ã«ããèªã¿åãããã«è¿œå ã®ãã¡ã€ã«èšè¿°å3ãéããŠèµ·åãããŸãïŒcmda |[2] cmdb
ïŒæåã®ã³ãã³ãã®stdoutã®ä»£ããã«ãstderrã¯ãã€ãã©ã€ã³å
¥åã«éä¿¡ãããstdoutã¯åã«ç»é¢ã«è¡šç€ºãããŸãïŒcmda |[1=2] cmdb
ïŒstderrã¯stdout cmdaã§ã¯ãªããã€ãã©ã€ã³ã«å床éä¿¡ãããŸãããstdinã§ã¯ãªãstdout cmdbã«æ¥ç¶ããŸã-ãã¡ãããèªã¿åããšæžã蟌ã¿ã§ã¯ãªããªãŒãã³ããŸãïŒ
- èªã¿æžãã®ããã«åæã«éã
cmd <>in_pipe <>[1]out_pipe
ïŒstdinãšstdoutã¯ãåæã«ç°ãªããã¡ã€ã«ã®èªã¿åããšæžã蟌ã¿ã®ããã«éãããŠããŸãïŒ
- éç·åœ¢ã³ã³ãã¢
cmd <{;;} >{;;}
ïŒ cmd <{;;} >{;;}
äž¡æ¹ã®ãããã¯ã¯cmdãšäžŠè¡ããŠèµ·åãããŸãããcmdã¯2ã€ã®ãã©ã¡ãŒã¿ãŒãåãåããŸã-ãã¡ã€ã«åa la /fd/
ããã€ãçµç±ã§æåã®stdoutã«æ¥ç¶ãããŸãã³ãã³ããããã¯ãš2çªç®ã®ã³ãã³ããããã¯ã®æšæºå
¥åïŒ
æåŸã®æ©èœã¯ç¹ã«èå³æ·±ããã®ã§ãã ããšãã°ã2ã€ã®
cmp
ãã¡ã€ã«ããã«ããšæ¯èŒããæšæºã³ãã³ãã¯ããã¡ã€ã«ã§ã¯ãªããä»ã®2ã€ã®ã³ãã³ãã®çµæãæ¯èŒã§ããŸãïŒ
cmp <{ ls /dir1 } <{ ls /dir2 }
ã
$ã¹ããŒã¿ã¹
çµäºã¹ããŒã¿ã¹ã¢ããªã±ãŒã·ã§ã³ã³ãŒããå®è£
ããããã®éåžžã«çããã¢ãããŒãã åŸæ¥ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¯ããã¹ãŠã®ããã°ã©ã ã¯æ°åã§çµäºããŸãããã¹ãŠãæ£åžžãªå Žåã¯0ã倱æããå Žåã¯ãã®ä»ã®ããã°ã©ã ã§ãã infernoã§ã¯ããã¹ãŠã®ããã°ã©ã ã¯åçŽã«çµäºãããïŒãã¹ãŠãæ£åžžã«åŠçãããŠããå ŽåïŒãäŸå€ãã¹ããŒããŸããäŸå€ã®å€ã¯ãšã©ãŒããã¹ããå«ãæååã§ãã
ãããéåžžã®ãšã©ãŒã§ããå Žåããã®è¡ã¯ãfailïŒãã§å§ãŸãå¿
èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ãã¯ã©ãã·ã¥ãããŸããã§ãããããã®ãšã©ãŒããã®ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããŠãŒã¶ãŒã«è¿ãããšã§çµäºãããã ãã§ãïŒéåžžãããã¯ã·ã§ã«ã§ãïŒã ãšã©ãŒããfailïŒãã§å§ãŸããªãå Žåãã¢ããªã±ãŒã·ã§ã³ãçµäºããåŸããã®ããã»ã¹ã¯ã¡ã¢ãªã«æ®ãïŒãå£ãããç¶æ
ïŒããããã¬ãŒã§èª¿ã¹ãŠããã®äŸå€ãçºçããçç±ãèŠã€ããããšãã§ããŸãïŒä¿åãã代ããã«ãã³ã¢ãã³ãã«é¡äŒŒïŒã¡ã¢ãªå
ã®ãã£ã¹ã¯ã§ãã³ã°ããŸãïŒã
ãããã£ãŠãå®è¡äžã®ã³ãã³ãã®å®äºåŸããã®ãçµäºã³ãŒãã-ã€ãŸã äŸå€ãšã©ãŒããã¹ãã¯
$status
ç°å¢å€æ°ã«ãããŸãïŒãfailïŒã以å€ã®äŸå€ããã¹ãã«äœãå«ãŸããŠããªãå Žåãã
$status
ãè¡ã¯ãfailedãã«ãªã
$status
ïŒã
è¡ãè¡ãªã¹ããã³ãã³ããããã¯
Infernovã·ã§ã«ã¯
ãæååãšæååã®ãªã¹ã
ã®ã¿ãæ±ããŸãã
ã²ã
æååã¯ãã¹ããŒã¹ãç¹æ®æåãå«ãŸãªãåèªããŸãã¯äžéåŒçšç¬Šã§å²ãŸããæåã§ãã ãã®ãããªæååå
ã®å¯äžã®ããšã¹ã±ãŒãå¯èœãªãæåã¯ãåäžåŒçšç¬Šèªäœã§ããã2ã€ã®ãã®ãããªåŒçšç¬Šã§èšè¿°ãããŠããŸãã
; echo 'quote '' <-- here' quote ' <-- here
\ nã\ tãå€æ°ã®è£éãªã©ã¯ãããŸãã in rowsã¯ãµããŒããããŠããŸããã æååã«æ¹è¡æåãæ¿å
¥ããå¿
èŠãããå Žåã¯ããã®ãŸãŸïŒEnterããŒãæŒããŠïŒè²Œãä»ãããããã®æåãå«ãå€æ°ãšæååãé£çµããŸãã infernoã«ã¯ãã³ãŒãã«ãã£ãŠä»»æã®æåãåºåã§ãã
unicodeïŒ1ïŒãŠãŒãã£ãªãã£ããããŸããããã¯ããã«ãã䜿çšããŠè¡ãããŸãïŒæ§é
"{}
ã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãããçŸæç¹ã§ã¯bash
``
é¡äŒŒç©ãšèããŠãã ããïŒïŒ
; cr="{unicode -t 0D} ; lf="{unicode -t 0A} ; tab="{unicode -t 09} ; echo -n 'a'$cr$lf'b'$tab'c' | xd -1x 0000000 61 0d 0a 62 09 63 0000006
æååã«ã¯äºéåŒçšç¬Šã¯äœ¿çšãããŸããïŒã¡ãªã¿ã«ãäºéäºéåŒçšç¬Šã¯ã€ã³ãã¡ãŒã³ã·ã§ã«ã§ã¯äœã«ã䜿çšãããŸããïŒã
ã³ãã³ããããã¯
ã³ãã³ãã®ãããã¯ã¯äžæ¬åŒ§å
ã«æžã蟌ãŸãããããã¯å
šäœãã·ã§ã«ã«ãã£ãŠ
1è¡ãšããŠåŠçãããŸãïŒäžæ¬åŒ§å
ã®æåãå«ãïŒã
; { echo one; echo two } one two ; '{ echo one; echo two }' one two
åäžåŒçšç¬Šã§
sh
ããæååãšã®å¯äžã®éãã¯ã
sh
ãã³ãã³ããããã¯ã®æ§æããã§ãã¯ããããããããã³ã³ãã¯ããªè¡ã«åãã©ãŒãããããããšã§ãã
; echo { cmd | } sh: stdin: parse error: syntax error ; echo { cmd | cmd } {cmd|cmd} ; echo { echo one echo two } {echo one;echo two}
è¡ã®ãªã¹ã
æååã®ãªã¹ãã¯ã空çœæåã§åºåããããŒãå以äžã®æååã§ãã ãããã¯æ¬åŒ§ã§å²ãããšãã§ããŸãããã»ãšãã©ã®å Žåãããã¯å¿
èŠãããŸããã
ã·ã§ã«ã³ãã³ãã¯ã
åã«è¡ã®ãªã¹ãã§ããæåã®è¡ã«ã¯ã³ãã³ããŸãã¯ã³ãŒããããã¯ãå«ãŸããæ®ãã®è¡ã¯ãããã®ãã©ã¡ãŒã¿ãŒã§ãã
; echo one two three one two three ; echo (one two) (three) one two three ; (echo () (one (two three))) one two three ; ({echo Hello, $1!} World) Hello, World!
æååã®ãªã¹ããé£çµããã«ã¯ã
^
æŒç®åã䜿çšããŸãã åãæ°ã®èŠçŽ ãå«ã2ã€ã®ãªã¹ãã«é©çšã§ããŸãïŒèŠçŽ ã¯ãã¢ã§é£çµãããŸãïŒããŸãã¯ãªã¹ãã®1ã€ã«èŠçŽ ã1ã€ã ãå«ãŸããŠããå¿
èŠãããã2çªç®ã®ãªã¹ãã®åèŠçŽ ãšé£çµãããŸãã ç¹å¥ãªå ŽåãšããŠãäž¡æ¹ã®ãªã¹ãã«ãããã1ã€ã®èŠçŽ ããå«ãŸããŠããªãå Žåã2è¡ã®éåžžã®é£çµãååŸãããŸãã
; echo (abc) ^ (1 2 3) a1 b2 c3 ; echo (ab) ^ 1 a1 b1 ; echo 1 ^ (ab) 1a 1b ; echo a ^ b ab
éåžžã1ã€ã®ã·ã§ã«ã³ãã³ãã1è¡ã§èšè¿°ããå¿
èŠããããŸããã次ã®è¡ã§ã³ãã³ããç¶è¡ãããããšã瀺ãç¹å¥ãªæåã¯ãããŸããã ããããã³ãã³ããè€æ°ã®è¡ã«åå²ããããšã¯éåžžã«ç°¡åã§ããåã®è¡ã®è¡ïŒåäžåŒçšç¬ŠïŒãŸãã¯ã³ãã³ããããã¯ïŒäžæ¬åŒ§ïŒãŸãã¯è¡ã®ãªã¹ãïŒæ¬åŒ§ïŒãéãããéãããããããªã¹ãé£çµæŒç®åã§åã®è¡ãçµäºããŸãã
ç°å¢å€æ°
å°çã®ã·ã§ã«ã§å€æ°ãæäœããããšã¯ãåŸæ¥ã®ã·ã§ã«ã«äžèŠäŒŒãŠããŸãããã ãŸãããŠã¯ãããŸããïŒ
; a = 'World' ; echo Hello, $a! Hello, World!
/ env
Inferno OSã®ç°å¢å€æ°ã¯ãåŸæ¥ã®OSãšã¯ç°ãªãæ¹æ³ã§å®è£
ãããŸãã ç°å¢å€æ°ãæäœãã
int execvpe(const char *file, char *const argv[], char *const envp[]);
ãããªæªå€¢ãéããŠåããã»ã¹ã«æž¡ãããã®è¿œå ã®POSIX APIãå°å
¥ãã代ããã« ç°å¢å€æ°ã¯ãåã«
/env
ãã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ã§ãã ããã¯èå³æ·±ãå¯èœæ§ãæäŸããŸããããšãã°ãã¢ããªã±ãŒã·ã§ã³ã¯
/env
ã
ãšã¯ã¹ããŒãïŒ listenïŒ1ïŒããã³
exportïŒ4ïŒçµç±
ïŒããã ãã§ããããã¯ãŒã¯çµç±ã§ä»ã®ã¢ããªã±ãŒã·ã§ã³ã«ç°å¢å€æ°ãžã®ã¢ã¯ã»ã¹ãæäŸã§ããŸãã
/env
ãã¡ã€ã«ãäœæãåé€ãå€æŽããããšã«ãããç°å¢å€æ°ãäœæ/åé€/å€æŽã§ããŸãã ãã ããçŸåšã®shã¯ã¡ã¢ãªå
ã®ãã¹ãŠã®ç°å¢å€æ°ã®ã³ããŒãä¿æããŠããããã
/env
å
ã®ãã¡ã€ã«ãä»ããŠè¡ãããå€æŽã§ã¯ãçŸåšã®shã§ã¯ãªãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããŸãã äžæ¹ãã·ã§ã«ã®éåžžã®æ¹æ³ã§ïŒ
=
æŒç®åã䜿çšããŠïŒå€æ°ãå€æŽãããšã
/env
ãã¡ã€ã«ãèªåçã«æŽæ°ãããŸãã
ã·ã§ã«å€æ°åã«ã¯ã次ã®æåãå«ããããšãã§ããŸãã ãã¡ã€ã«åã«äœ¿çšã§ããªããã®ïŒããšãã°ãnames
.
ã
..
ãããã³
/
ãå«ãïŒã ãã®ãããªååã®å€æ°ã¯ãçŸåšã®shã§ã®ã¿äœ¿çšã§ããèµ·åããã¢ããªã±ãŒã·ã§ã³ã«ã¯è¡šç€ºãããŸããã
ãªã¹ã
å¥ã®éèŠãªéãã¯ããã¹ãŠã®å€æ°
ã«æååã®ãªã¹ãã®ã¿ãå«ãŸããŠããããšã§ãã 1è¡ãå€æ°ã«å
¥ããããšã¯ã§ããŸãã-ããã¯åžžã«1è¡ã®ãªã¹ãã«ãªããŸãã
空ã®ãªã¹ããå€æ°ã«ä¿åãããšïŒæ瀺çã«
a=()
ãå²ãåœãŠãããæé»çã«
a=
ãä»ã
a=
ïŒãå€æ°ãåé€ãããŸãã
$var
ã¯varå€æ°ããè¡ã®ãªã¹ããååŸããŠããŸããããã®äžã«ãããã®è¡ã1ã€ä»¥äžå«ãŸããŠããå ŽåããããŸãã$#var
ã¯ãæååãªã¹ãã®èŠçŽ æ°ãååŸããŠããŸã$var
$"var
ã¯ã $var
æååãªã¹ãã®ãã¹ãŠã®èŠçŽ ã1è¡ã«é£çµãããã®ã§ãïŒã¹ããŒã¹ã§åºåããŸãïŒ
; var = 'first str' second ; echo $var first str second ; echo $#var 2 ; echo $"var first str second
ã芧ã®ãšããã
$var
ãš
$"var
åºåã¯èŠèŠçã«ç°ãªããŸããã
echo
ã¯ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãã¹ããŒã¹ã§è¡šç€ºãã
$"
ã¯å€æ°ã®ãã¹ãŠã®èŠçŽ ãã¹ããŒã¹ã§çµåããããã§ãã ãã ããæåã®
echo
ã³ãã³ãã¯2ã€ã®ãã©ã¡ãŒã¿ãŒãåãåããæåŸã®ãã©ã¡ãŒã¿ãŒã¯åãåããŸããã
å€æ°ã®å€ãäœããã®æ¹æ³ã§æé»çã«é£çµãããã³ã«ãã·ã§ã«ã¯é£çµæŒç®å
^
æ¿å
¥ããŸãïŒèŠããŠããããã«ãããã¯æååã§ã¯ãªãæååã®ãªã¹ãã§æ©èœããŸãïŒã ããã¯äŸ¿å©ã§ãããç¿æ
£ã§ã¯ãããŸããããäºæããªãããšããããŸãã
; flags = abc ; files = file1 file2 ; echo -$flags $files.b -a -b -c file1.b file2.b ; echo { echo -$flags $files.b } {echo -^$flags $files^.b}
å€æ°ã®ãªã¹ããžã®å²ãåœãŠãæ©èœããŸãã å³åŽã®ãªã¹ããå·ŠåŽã®å€æ°ãããå€ãã®èŠçŽ ã§æ§æãããŠããå ŽåãæåŸã®å€æ°ã¯ãªã¹ãã®æ®ããåãåããåã®å€æ°ã§ã¯ããããã«1ã€ã®èŠçŽ ããããŸãã
; list = abcd ; (head tail) = $list ; echo $head a ; echo $tail bcd ; (xy) = (3 5) ; (xy) = ($y $x) ; echo 'x='^$x 'y='^$y x=5 y=3
ã¹ã¯ãªãããŸãã¯ã³ãŒããããã¯ã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒã®ãªã¹ãã¯å€æ°
$*
ãåã
ã®ãã©ã¡ãŒã¿ãŒã¯å€æ°
$1
ã
$2
ã...ã«ãããŸãã
ã¹ã³ãŒã
ã³ãŒãã®åãããã¯ã¯ãç¬èªã®ã¹ã³ãŒãã圢æããŸãã æŒç®å
=
ããã³
:=
ããŠãå€æ°ã«å€ãå²ãåœãŠãããšãã§ããŸãã 1ã€ç®ã¯ãæ¢åã®å€æ°ã®å€ãå€æŽããããçŸåšã®ã¹ã³ãŒãã«æ°ããå€æ°ãäœæããŸãã 2çªç®ã¯åžžã«æ°ããå€æ°ãäœæããçŸåšã®ãããã¯ã®çµãããŸã§ããã®ååïŒååšããå ŽåïŒã§å€æ°ã®å€ãå€ãäžæžãããŸãã
; a = 1 ; { a = 2 ; echo $a } 2 ; echo $a 2 ; { a := 3; echo $a } 3 ; echo $a 2 ; { b := 4; echo $b } 4 ; echo b is $b b is
å€æ°åç
§
å€æ°åã¯ã
$
æåã®åŸã®è¡ã§ãã ãŸããä»»æã®æååïŒåäžåŒçšç¬ŠãŸãã¯å¥ã®å€æ°ïŒã䜿çšã§ããŸãã
; 'var' = 10 ; echo $var 10 ; ref = 'var' ; echo $$ref 10 ; echo $'var' 10 ; echo $('va' ^ r) 10
ã³ãã³ãåºåã®ã€ã³ã¿ãŒã»ãã
å®éããã®ãããã¯ã¯ã³ãã³ãã®èµ·åã説æããã»ã¯ã·ã§ã³ãããå€ãåç
§ããŠããŸããã話ããŠããããšãæ確ã«ããããã«ãæåã«æååã®ãªã¹ããæäœããæ¹æ³ã説æããå¿
èŠããã£ããããä»ãŸã§å»¶æããªããã°ãªããŸããã§ããã
æ§æã®åŒ·èª¿è¡šç€ºãæ°žé ã«å£ããŠããŸãéåžžã«äžå¯Ÿã®åŒçšç¬Šã«äŒããŸãã
`{}
ïŒ `{}
å®è¡ããæååã®ãªã¹ããšããŠstdoutã«åºåãããã®ãè¿ããŸã;ãªã¹ãé
ç®ã¯$ifs
å€æ°ã®å€ã䜿çšããŠåºåãããŸã;å®çŸ©ãããŠããªãå Žåã3æåã®æååããããšèŠãªãããŸãïŒã¹ããŒã¹ãã¿ãããã³æ¹è¡ïŒ"{}
ïŒ "{}
å®è¡ããåºåå
容ãåäžè¡ãšããŠstdoutã«è¿ããŸã-ã³ãã³ããåºåãããã¹ãŠã®è¡ãé£çµããŸãïŒ
äŸãšããŠã
ls
åŒã³åºããä»ããŠãã¡ã€ã«ã®ãªã¹ããããŒãããŸãã ãã¡ã€ã«åã«ã¹ããŒã¹ãå«ãŸããŠããå¯èœæ§ãããããã
`{}
æšæºåäœã¯æ©èœããŸããããªã¹ãé
ç®ãæ¹è¡ã§åºåãã ãã§ãã
; ifs := "{unicode -t 0A} ; files := `{ ls / } ; echo $#files 82 ; ls / | wc -l 82
ãããå®éã«ã¯ãã·ã§ã«ã«ãã£ãŠãã¡ã€ã«åã®ãªã¹ãã«å±éããããã¡ã€ã«åãã³ãã¬ãŒãã«ãããããç°¡åã§ä¿¡é Œæ§ã®é«ããã®ã«ãªããŸãã
; files2 := /* ; echo $#files2 82
çµã¿èŸŒã¿ã³ãã³ã
çµã¿èŸŒã¿ã³ãã³ãã«ã¯ãéåžžã®ã³ãã³ããšæååã®æäœçšã®2ã€ã®ã¿ã€ãããããŸãã
éåžžã®ã³ãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³/ã¹ã¯ãªããã®èµ·åãšåãæ¹æ³ã§åŒã³åºãããŸãã
; run /lib/sh/profile ; load std ; unload std ; exit
æååãæäœããããã®ã³ãã³ãã¯ã
${ }
ãä»ããŠåŒã³åºãããæšæºã®æååãè¿ããŸãïŒã€ãŸããstdoutã«åºåãããããšãã°ãå€æ°ã®å€ãžã®ã¢ããŒã«ãè¿ãããŸãïŒã ãããã¯ãéåžžã®ã³ãã³ãã®ãã©ã¡ãŒã¿ãŒã§äœ¿çšããããå€æ°ã«å€ãå²ãåœãŠãå³åŽã§äœ¿çšããå¿
èŠããããŸãã ããšãã°ãã³ãã³ã
${quote}
ã¯ãæž¡ãããæååã®ãªã¹ãã1è¡ã§
${unquote}
ã
${unquote}
ã¯å察ã®æäœãå®è¡ããŠã1è¡ãæååã®ãªã¹ãã«å€æããŸãã
; list = 'ab' cd ; echo $list abcd ; echo ${quote $list} 'ab' cd ; echo ${unquote ${quote $list}} abcd
ifãforãé¢æ°ãè¿œå
ç§ãçŽæããããã«ããããã®éåžžã«å¿
èŠãªãã®ãã裞ã®shãã§å®è£
ããæ¹æ³ã瀺ããŸãã ãã¡ãããå®éã«ã¯ããã¯å¿
èŠãããŸãã
ãstdããŒãå¯èœã¢ãžã¥ãŒã«ã¯å¿
èŠãªãã®ãã¹ãŠãæäŸããããã䜿çšããæ¹ãã¯ããã«äŸ¿å©ã§ãã ããããããã«ããããããããã®å®è£
ã¯ã裞ã®shã®æ©èœã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ãšããŠèå³æ·±ããã®ã§ãã
ãã¹ãŠãæä»çã«äœ¿çšããŠå®è£
ãããŸãïŒ
- å€æ°
- è¡ãšè¡ãªã¹ã
- ã³ãŒããããã¯ãšãã®ãã©ã¡ãŒã¿ãŒ
ç§ãã¡ã¯ãæ©èœããå®è¡ããŸã
åè¿°ããããã«ãã·ã§ã«ã³ãã³ãã¯åãªãè¡ã®ãªã¹ãã§ããæåã®è¡ã¯ã³ãã³ãã§ãæ®ãã®è¡ã¯ãã®ãã©ã¡ãŒã¿ãŒã§ãã ãŸããã·ã§ã«ã³ãã³ããããã¯ã¯åãªãæååã§ãããå€æ°ã«ä¿åã§ããŸãã ãŸããã³ãã³ããããã¯ã¯ãã¹ãŠããã©ã¡ãŒã¿ãŒã
$*
ã
$1
ãªã©ã§åãåããŸãã
; hello = { echo Hello, $1! } ; $hello World Hello, World!
ããã«ãé¢æ°åããã°ã©ãã³ã°ã®æé«ã®ç²Ÿç¥ã§é¢æ°ãã«ãªãŒåããããšãã§ããŸãã :)
; greet = {echo $1, $2!} ; hi = $greet Hi ; hello = $greet Hello ; $hi World Hi, World! ; $hello World Hello, World!
å¥ã®äŸ-ãããã¯ãã©ã¡ãŒã¿ãŒã䜿çšããŠãçªå·ã§ç®çã®ãªã¹ãã¢ã€ãã ãååŸã§ããŸãã
; list = abcdef ; { echo $3 } $list c
ããªãã®ããã«
å®è£
ããããšã«èå³ããããæå°éã®æ©èœãå®çŸããå Žåã¯ãæ¬æ ŒçãªäŸ¿å©ãªãã®ãäœæããããšããŸããã§ããã forãå¿
èŠã§ããïŒã«ãŒãã1ååæ¢ããå¿
èŠããããŸããããããè¡ãã®ã«åé¡ãããå Žåã¯äžèŠã§ãïŒã
; do = { $* } ; dont = { } ; if = { (cmd cond) := $* { $2 $cmd } $cond $do $dont } ; for = { (var in list) := $* code := $$#* $iter $var $code $list } ; iter = { (var code list) := $* (cur list) := $list (next unused) := $list $if {$var=$cur; $code; $iter $var $code $list} $next } ; $for i in 10 20 30 { echo i is $i } i is 10 i is 20 i is 30 ;
é¢çœãããããªããš
ããã©ã«ãã§ã¯ãã·ã§ã«ã¯ã¹ã¯ãªããã®èµ·åæã«åå空éããã©ãŒã¯ãããããã¹ã¯ãªããã¯ãããèµ·åããããã»ã¹ã®åå空éãå€æŽã§ããŸããã ããã¯ã芪ã®åå空éãæ§æããã ãã®ã¿ã¹ã¯ãæã€ã¹ã¯ãªããã«ã¯é©åããŸããã ãã®ãããªã¹ã¯ãªããã¯
#!/dis/sh -n
å§ãŸãå¿
èŠããããŸãã
loaded
ã
loaded
çµã¿èŸŒã¿ã³ãã³ãã¯ãããŒãããããã¹ãŠã®ã¢ãžã¥ãŒã«ã®ãã¹ãŠã®çµã¿èŸŒã¿ã³ãã³ãããªã¹ãããŸãã ãŸãã
whatis
çµã¿èŸŒã¿ã³ãã³ãã¯ãå€æ°ãé¢æ°ãã³ãã³ããªã©ã«é¢ããæ
å ±ã衚瀺ããŸãã
ã·ã§ã«ã¢ãžã¥ãŒã«ã®ãªã¹ãã䜿çšããŠå€æ°
$autoload
ãäœæãããšããããã®ã¢ãžã¥ãŒã«ã¯èµ·åãããåã·ã§ã«ã«èªåçã«ããŒããããŸãã
ã·ã§ã«ã«ã¯æ§æç³ã®ãµããŒãããããŸãïŒ
&&
ããã³
||
ã ãããã®æŒç®åã¯bare shã§äœ¿çšã§ããŸãããçµã¿èŸŒã¿ã®
and
ããã³
or
ã³ãã³ãã®åŒã³åºãã«å€æãããŸãããããã¯bare shã§ã¯ãªãã
stdã¢ãžã¥ãŒã«ããã®ãã®ã§ãïŒãããã£ãŠã
&&
ããã³
||
ã¯
load std
åŸã«ã®ã¿äœ¿çšã§ããŸãïŒã
; echo { cmd && cmd } {and {cmd} {cmd}} ; echo { cmd || cmd } {or {cmd} {cmd}}
Limboã§äœæãããã¢ããªã±ãŒã·ã§ã³ã¯ãããšãã°ãã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãŒã§éå§ãããšããshã³ãã³ãã®ãããã¯ãå«ãè¡ã¯ã
shïŒ2ïŒã¢ãžã¥ãŒã«ã䜿çšããŠéåžžã«ç°¡åã«å®è¡ã§ããŸãã
å€æ°ãšè¡ãªã¹ãã䜿çšããã·ã§ã«ã®äœæ¥ã¹ã¿ã€ã«ã¯ãåŸæ¥ã®ã·ã§ã«ãšã¯ç°ãªããæåã«èšåããããšãã«ãå€æ°ã®ãã©ã¡ãŒã¿ãŒãšå€ãäžåºŠã ãã·ãŒã«ãããããšãèããå¿
èŠããããšããäºå®ã«ã€ãªãããŸãã ãããŠãããããæã£ãŠããã·ã³ãã«ãèããããšãªãã奜ããªå Žæã«ãããã転éã§ããŸãã
ãŸãšã
ãã®çãèšäºã¯ãã€ã³ãã§ã«ãã¢ã³ã·ã§ã«ã®ã»ãŒå®å
šãªãªãã¡ã¬ã³ã¹ã¬ã€ãã§ãã ã€ãŸããåºæ¬çãªã·ã§ã«ã®ãã¹ãŠã®æ©èœã詳现ã«ããããŠãã¹ãŠã®ãã¥ã¢ã³ã¹ãšäŸãšãšãã«èª¬æãããŠããŸãã
sh(1) , ,
$apid
,
$prompt
, - ,
sh
., .
/, :
! «» , , if for ( , raise
std â ..
/bin/false
:)
run
).
, . ,
sh-std(1) :
- (
and
, or
, if
) - (
!
, ~
, no
) - (
apply
, for
, while
, getlines
) - äž¡æ¹ã®ã¿ã€ãã®é¢æ°ïŒ
fn
ãsubfn
ïŒ - äŸå€ãšã¹ããŒã¿ã¹ãšã®ä»äºïŒ
raise
ãrescue
ãstatus
ïŒ - äœæ¥åãããã³ãªã¹ãïŒ
${hd}
ã${tl}
ã${index}
ã${split}
ã${join}
ïŒ - ãªã©
ãããããããã®è¿œå ã³ãã³ãã¯ãã¹ãŠãã·ã§ã«èªäœã®æ§æãè€éã«ãããã®ã§ã¯ãªããåçŽã§ãšã¬ã¬ã³ããªãŸãŸã§ãïŒ