ãJava BlockingQueueã§éã¶ï¼ãã¤ãã©ã¤ã³ãã£ããã§ãã¤ãã©ã¤ã³ã®è©±ãããã®ã§ãæ¬æ¥ã®ãã¤ã¾ãUnixã®ãã¤ãããªãã¤ã¬ã¯ããå°ã調ã¹ã¦ã¿ã¾ããã
ãã¾ã«è©±é¡ã¨ãªã some-command >file 2>&1 㨠some-command 2>&1 >fileã®æåã®éãã«ã¤ãã¦ããã·ã§ã«ã¯ã³ãã³ãã©ã¤ã³ãªãã¤ã¬ã¯ãã®æå®ãå³ããå·¦ã«è§£éå®è¡ããããªãã¦èª¬æãè¦ã¤ããã¾ãããããªãã«ãªï¼ ãã¼ã¸ã³ã°ã¯å·¦ããå³ã«ãããã®ã§ããããã¼ãºããªã¼ãéé ã«ãã©ããã¨ã¯ã§ãããã©ããããªãã¨ããå¿
ç¶æ§ã¯ãªãã«ããªããã
次ã®è¨äºãèªãã¨ããå³ããå·¦ããªãã¦äºæ ãããªããã¨ãåããã§ãããã
ãã¦ããã§ã¯ãè¤éãªãªãã¤ã¬ã¯ãå¦çãå®å ¨ã«çè§£ã§ãã妿¹ç®ã示ãã¾ããããä¾ãã°ã次ã®ã³ãã³ãã©ã¤ã³ãä½ããããåããããã«ãªãã£ã¦ãã¨ã§ã :-)
some-command 3>&1 >/dev/null 2>&3 3>&- | less
ã·ã§ã«ãè¡ã£ã¦ããå é¨å¦çãç¥ãã°ããã®ã§ãããããã§ã¯å¥ã®ã¢ããã¼ããåãã¾ã*1ã
å 容ï¼
- ã³ãã³ãå®è¡ãè¨è¿°ããããè¨èª
- ãã¤ãã©ã¤ã³ã®ãªãã®ã³ãã³ãå®è¡åä½
- ãªãã¤ã¬ã¯ãã¯ä»£å ¥æ
- è¤éãªä¾ãã¹ãããªããã
âã³ãã³ãå®è¡ãè¨è¿°ããããè¨èª
ãã¤ãè¨å·ã|ãã鿬¡å®è¡ã®è¨å·ã;ããå«ãã é·ãã³ãã³ãã©ã¤ã³ããï¼ã¤ã®ã³ãã³ãã¨ãã®å¼æ°ãããã¨ãªãã¤ã¬ã¯ãæå®ãããªãâæåâã«åè§£ã§ãã¾ãããããã£ãæåããªãã¨å¼ã¶ãåã¯ç¥ããªãã®ã§ãä»®ã«ãã³ãã³ãå®è¡åä½ãã¨ã§ãå¼ã³ã¾ããã*2ã
ä¾ãã°ãgrep ^a < infile > outfileã¯å
¨ä½ã§1ã¤ã®ã³ãã³ãå®è¡åä½ã§ãããããæ¬¡ã®ããã«æ¸ãã¦ã¿ã¾ãããã
ãªããããããï¼ ãã£ãä»ãåãèããã¨ã¨ã«ã²ã³ãªè¨æ³ã§ãããã®è¨æ³ã使ã£ã¦ãªãã¤ã¬ã¯ãã®ç§å¯ããã°ãããã¨ããéèã§ãã
# ããã©ã«ãã®åæå
in fd0 = in(/dev/tty)
out fd1 = out(/dev/tty)
out fd2 = out(/dev/tty)# ãªãã¤ã¬ã¯ãæå®
fd0 = in(infile) # < infile ã«å¯¾å¿
fd1 = out(outfile) # > outfile ã«å¯¾å¿grep ^a
fdã¯ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ã®ã¤ããã§ãfd0ã¯ã0çªã®ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ãã®ãã¨ã§ãã詳細ã¯ã¨ããããæ¬¡ã®ãã¨ã¯ç¥ã£ã¦ããã¦ãã ããã
- 0çªã®ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ã¯æ¨æºå ¥å
- 1çªã®ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ã¯æ¨æºåºå
- 2çªã®ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ã¯æ¨æºã¨ã©ã¼åºå
ä»ã«ãfd3ããfd9ã¾ã§ä½¿ãã¾ãï¼ã·ã§ã«ã®å®è£ ã«ããã¾ããã©ï¼ã
in fd0 ã¯ãã0çªã®ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿fd0ãå
¥åç¨ã«ä½¿ããã¨ãã宣è¨ã§ããin(/dev/tty) ã¯ããã¡ã¤ã«/dev/ttyãå
¥åç¨ã«éããã¢ãã示ãã¾ããããã¦ã¤ã³ã¼ã«ã¯æ®éã®ä»£å
¥æ¼ç®åã§ããout fd1 = out(/dev/tty) ãªãããåºåç¨ã«éãããã¡ã¤ã«/dev/ttyãã1çªã®ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ï¼åºåç¨ï¼fd1ã«å²ãå½ã¦ããã¨èªãã¾ãã/dev/ttyã¯ç¹æ®ãªãã¡ã¤ã«ã§ãin(/dev/tty)ã¯ãã¼ãã¼ãããã®å
¥åãout(/dev/tty)ã¯ç»é¢ã¸ã®åºåãæå³ãã¾ããWindowsãªãã/dev/ttyã®ä»£ããã«conã¨ããååã使ãã¾ãã
ãªãã¤ã¬ã¯ãæå®ããªããã°ãããã©ã«ãã®åæåããã®ã¾ã¾ä½¿ããã¾ããä»åã®ä¾ã§ã¯ã< infile > outfile ã«å¯¾å¿ãã代å
¥æã«ããããã©ã«ãã®åæåã䏿¸ãï¼å¤æ´ï¼ããã¦ãã¾ããgrep ^aãå®è¡ãããã¨ãã«ã¯ãfd0ãin(infileï¼ã«ãfd1ãout(outfile)ã«è¨å®ããã¦ãã¾ãï¼fd2ã¯ãã®ã¾ã¾ï¼ãå®éã®ã·ã§ã«ã¯ãç¡é§ãªåæåã¯ããªãã¨æãã¾ãããããã©ã«ããæ¸ãã¦ãããã»ããåããããããã¨ã
ãã®ãããªâä»£å ¥æâã並ã¹ã¦ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿éãè¨å®ãã¦ãããæå¾ã®è¡ã«å®è¡ããã³ãã³ãã¨å¼æ°ãæ¸ãã¾ã -- ããããã³ãã³ãå®è¡ãè¨è¿°ããããè¨èªã®æ§æã§ãã
âãã¤ãã©ã¤ã³ã®ãªãã®ã³ãã³ãå®è¡åä½
次ã«ãcat infile | grep ^a | less ãèãã¦ã¿ã¾ãããããã®ãã¤ãã©ã¤ã³ã®ãªãã«ããgrep ^aã¯ã³ãã³ãå®è¡åä½ã§ãããæ¬¡ã®ããã«è¨è¿°ããã¾ãã
in fd0 = in(l-pipe)
out fd1 = out(r-pipe)
out fd2 = out(/dev/tty)grep ^a
ããã§ãl-pipeãr-pipeã¯ãã¡ã¤ã«åã§ã¯ãªãã¦ãã³ãã³ãã®å·¦å´ï¼leftï¼ã®ãã¤ãã¨å³å´ï¼rightï¼ã®ãã¤ããæå³ããã¨ãã¾ããgrep ^aã ãè¦ã¦ãã¦ããã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ã®ç¶æ³ã¯åããã¾ãããããã¤ãã©ã¤ã³ã®ãªãã«ããã¨ããç¶æ³ãå«ãã¦è¨è¿°ãã¦ãã¾ãã
åããã¤ãã©ã¤ã³å ã®lessã®å®è¡ã¯æ¬¡ã®ããã§ããã
in fd0 = in(l-pipe)
out fd1 = out(/dev/tty)
out fd2 = out(/dev/tty)less
grepã®r-pipeã¨lessã®l-pipeã¯åããã¤ããããã¦ããã®ã§ããã¼ã¿ãgrepããlessã¸ã¨æµãã¾ãã
âãªãã¤ã¬ã¯ãã¯ä»£å ¥æ
åç¯ã®ä¾ã§ã¯ãªãã¤ã¬ã¯ããåºã¦ããªãã£ãã®ã§ãããä»åº¦ã¯ cat infile | grep [ 2>&1 | less ãèãã¾ããããgrep [ã¯ã¨ã©ã¼ã§ grep: Invalid regular expression ã¨ããã¨ã©ã¼ã¡ãã»ã¼ã¸ãæ¨æºã¨ã©ã¼åºåãã¤ã¾ãfd2ã«åºåããã¾ãã
ã³ãã³ãå®è¡åä½grep [ 2>&1ã¯ã次ã®ããã«è¨è¿°ã§ãã¾ãã
# ããã©ã«ãã®åæå
in fd0 = in(l-pipe)
out fd1 = out(r-pipe)
out fd2 = out(/dev/tty)# ãªãã¤ã¬ã¯ãæå®
fd2 = fd1grep [
ãªãã¤ã¬ã¯ãæå®2>&1ã¯ãfd2 = fd1ã¨ãã代å
¥æã¨è§£éããã¾ããfd1ã®å¤ã¯out(r-pipe)ã ã£ãã®ã§ã代å
¥æã«ããfd2ã®å¤ãout(r-pipe)ã¨ãªãã¾ãããã®çµæãgrepã«ããfd2ã¸ã®æ¸ãè¾¼ã¿ï¼ã¨ã©ã¼ã¡ãã»ã¼ã¸ï¼ã¯ãã¤ãã«éãè¾¼ã¾ããçµæçã«lessã«æµãã¾ãã
ãªãããã®ãã¤ãã©ã¤ã³ãå®è¡ãã¦ããåãæãlessã ã¨åããã«ããã®ã§ãcat infile | grep [ 2>&1 | cat > outfileã¨ãã¦ããã¡ã¤ã«outfileã®ä¸èº«ãè¦ãã¨ããããããã¾ããã
âè¤éãªä¾ãã¹ãããªããã
- çªå·>file ã¯ãfdçªå· = out(file)
- çªå·1>&çªå·2 ã¯ãfdçªå·1 = fdçªå·2
ã¨ãã翻訳è¦åã«åºã¥ãã¦ãåé ã«æãã2ã¤ã®ã³ãã³ãã©ã¤ã³ some-command >file 2>&1 㨠some-command 2>&1 >file ãåæãã¦ã¿ã¾ãããã
some-command >file 2>&1ã¯ã
# ããã©ã«ãã®åæå
in fd0 = in(/dev/tty)
out fd1 = out(/dev/tty)
out fd2 = out(/dev/tty)# ãªãã¤ã¬ã¯ãæå®
fd1 = out(file)
fd2 = fd1some-command
ãªãã¤ã¬ã¯ãæå®>file 2>&1ã¯ãå·¦ããå³ã«è§£éããã¾ãã>fileã¯1>fileã®ç¥è¨ã§ãfd1 = out(file)ã¨ç¿»è¨³ããã¾ããããã©ã«ãã®åæåã䏿¸ãããã¦ãfd1ã®å¤ã¯out(file)ã¨ãªãã¾ãããã®å¾ã§ãfd2 = fd1ãå®è¡ãããã®ã§ãfd2ã®å¤ãout(file)ã«ãªãã¾ãããã®çµæã¨ãã¦ãfd1ã®åºåãfd2ã®åºåãåããã¡ã¤ã«ã«å
¥ãã¾ãã
䏿¹ãsome-command 2>&1 >fileã¯ã
# ããã©ã«ãã®åæå
in fd0 = in(/dev/tty)
out fd1 = out(/dev/tty)
out fd2 = out(/dev/tty)# ãªãã¤ã¬ã¯ãæå®
fd2 = fd1
fd1 = out(file)some-command
fd2 = fd1ãå
ã«å®è¡ãããã®ã§ãfd2ã®å¤ã¯fd1ã¨åãout(/dev/tty)ã¨ãªãã¾ãããããã¯çµå±ãä½ãããªãã®ã¨ä¸ç·ã§ããããã®å¾ã®fd1 = out(file)ã§fd1ã®å¤ã¯å¤æ´ããã¾ããããã¯ãsome-command >file ã¨ä½ãå¤ããã¾ããããããããããªä¾ããã£ã¦ã¿ã¾ããããsome-command 3>&1 >/dev/null 2>&3 3>&- | less ã®æåã®å®è¡åä½ã®å ´åã¯ã
ããã§ãnoneã¯ãä½ã表ããªãå¤ãã§ãnoneããã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ã«ä»£å ¥ãããã¨ããã®ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ã¯éããã使ããªããªãã¾ãã䏿çã«ä½¿ã£ããã¡ã¤ã«ãã£ã¹ã¯ãªãã¿ã®å¾å§æ«ã«noneã使ãã¾ãï¼å¾å§æ«ããªãã¦ããããã¦ã大ä¸å¤«ã§ããï¼ãã³ãã³ãã©ã¤ã³æ§æã§ã¯ãçªå·nã«å¯¾ãã¦
# ããã©ã«ãã®åæå
in fd0 = in(/dev/tty)
out fd1 = out(r-pipe)
out fd2 = out(/dev/tty)# ãªãã¤ã¬ã¯ãæå®
fd3 = fd1
fd1 = out(/dev/null)
fd2 = fd3
fd3 = nonesome-command
n>&-ã¨ãã¦ãã¡ã¤ã«ãã£ã¹ã¯ãªãã¿nãéãã¾ãããã¦ãä»£å ¥æã追ããããã¨ã
fd3 = fd1 # fd1ã®å¤ãfd3ã«ä¿å fd3 = out(r-pipe)
fd1 = out(/dev/null) # fd1ã®å¤ãout(/dev/null)ã§ä¸æ¸ã
fd2 = fd3 # fd2ã®å¤ã¯fd3ã®å¤ã§ããout(r-pipe)ã¨ãªã
fd3 = none # fd3ãå¾å§æ«# fd1 is out(/dev/null)
# fd2 is out(r-pipe)
# fd3 is none
ãã£ã¦ãsome-commandã®æ¨æºåºåï¼fd1ï¼ã¯/dev/nullã«æ¨ã¦ãããæ¨æºã¨ã©ã¼åºåï¼fd2ï¼ããã¤ãã«éãè¾¼ã¾ãã¾ãããã¤ãã®å ã«lessãããã®ã§ãsome-commandã®ã¨ã©ã¼ã¡ãã»ã¼ã¸ã ããlessã§é²è¦§ã§ããããã§ãã
å¿çãè£è¶³ï¼
*1:ã·ã§ã«ã®å é¨å¦çãå¥ãªè¡¨ç¾ã«ãã¦ããã ããã¨çªã£ãã¾ãããã§ãããå°ãªãã¨ãã·ã¹ãã ã³ã¼ã«dup2ã¨ãã¯åºãã¦ã¾ããã
*2:bashã®manãã¼ã¸ã«ããã¨ãsimple commandã¨å¼ã¶ã®ãé©åã¿ããã§ãã