Goでのシェルパイプの使用

コマンドラインで善良な市民になるということは、パイプを使用することを意味します。

垂直バーの使用|コマンドの出力を別のコマンドの入力として渡し、複数のコマンドをチェーンして一意の出力を提供できます。

パイプを入力として使用する2つのチュートリアルを作成しました。gocowsayそしてgololcat、しかし、パイプから入力を取得するプロセスについては詳しく説明しなかったので、このトピックに関する記事を次に示します。

次に例を示します。

package main

import ( “bufio” “fmt” “io” “os” )

func main() { info, err := os.Stdin.Stat() if err != nil { panic(err) }

<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">info</span>.<span style="color:#a6e22e">Mode</span>()<span style="color:#f92672">&amp;</span><span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">ModeCharDevice</span> <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">||</span> <span style="color:#a6e22e">info</span>.<span style="color:#a6e22e">Size</span>() <span style="color:#f92672">&lt;=</span> <span style="color:#ae81ff">0</span> {
	<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">"The command is intended to work with pipes."</span>)
	<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">"Usage: fortune | gocowsay"</span>)
	<span style="color:#66d9ef">return</span>
}

<span style="color:#a6e22e">reader</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bufio</span>.<span style="color:#a6e22e">NewReader</span>(<span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">Stdin</span>)
<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">output</span> []<span style="color:#66d9ef">rune</span>

<span style="color:#66d9ef">for</span> {
	<span style="color:#a6e22e">input</span>, <span style="color:#a6e22e">_</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">reader</span>.<span style="color:#a6e22e">ReadRune</span>()
	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">==</span> <span style="color:#a6e22e">io</span>.<span style="color:#a6e22e">EOF</span> {
		<span style="color:#66d9ef">break</span>
	}
	<span style="color:#a6e22e">output</span> = append(<span style="color:#a6e22e">output</span>, <span style="color:#a6e22e">input</span>)
}

<span style="color:#66d9ef">for</span> <span style="color:#a6e22e">j</span> <span style="color:#f92672">:=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">j</span> &lt; len(<span style="color:#a6e22e">output</span>); <span style="color:#a6e22e">j</span><span style="color:#f92672">++</span> {
	<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Printf</span>(<span style="color:#e6db74">"%c"</span>, <span style="color:#a6e22e">output</span>[<span style="color:#a6e22e">j</span>])
}

}

これがどのように機能するかを調べてみましょう。最初の興味深い行:

info, err := os.Stdin.Stat()

os.Stdin、StdoutやStderrのように、オープンですファイル。これは、標準入力ファイル記述子を指します。

Stat()を返すFileのメソッドですFileInfoファイルの説明、モードやファイルサイズなどの情報の提供。

次の興味深い作品は

info.Mode()&os.ModeCharDevice != 0

FileInfo.Mode()を返しますuint32ファイルモードとアクセス許可をconstとして決定するマスク(https://golang.org/pkg/os/#FileMode)。

ビット単位で署名し、ファイルモードがos.ModeCharDeviceであるかどうかを判別します。これは、ファイルがを指していることを確認する方法です。ModeCharDevice、Unix文字デバイス(端末)。ファイルが指しているのでos.Stdin、基本的に入力がパイプであることを除外しています。

モードが次の場合、ビット単位は0を返します。ない渡す定数。確認することもできます

info.Mode()&os.ModeCharDevice == os.ModeCharDevice

それは同じですが、より読みやすくなります。

これがfalseの場合、追加のチェックがあります

info.Size() <= 0

これは前のチェックと組み合わせて、入力パイプがあることを確認し、実際にはいくつかのバイトが含まれています。

確認することもできます

if info.Mode()&os.ModeNamedPipe != 0 {
	// we have a pipe input
}

これにより、入力がパイプから確実に送られます。

次に、プログラムはリーダーを作成します

reader := bufio.NewReader(os.Stdin)

bufioバッファリングされたI / Oを実装するパッケージで、基本的にラッピングio.Readerそしてio.Writer

デフォルトのバッファサイズである4096バイトを使用して、os.Stdinからバッファリングされたリーダーを提供するように依頼します。

bufio.Readerデータを読み取るための多くの方法を提供します。ReadByteReadBytesReadLineReadRuneReadSliceReadString

使用例ReadRuneそのため、読み取った各ルーンをに追加できますvar output []runeスライス、ハンドルユニコード何の努力もせずにchars。

続きを読む


その他のチュートリアル: