[How do Unix pipes work?](https://www.vegardstikbakke.com/how-do-pipes-work-sigpipe/)を読みました。
```bash
`gutter:false;
$ cat hogehoge.txt | head -n 2
```
上記を実行した時にhogehoge.txtが大きなファイルでも2行出力した途端に停止します。
cat hogehoge.txtだけした時には時間がかかるのに、pipeで繋いだ時には一瞬で終わるのはどうしてか?
Unixのpipeは後ろの処理が終了した時にSIGPIPEシグナルで前のプロセスが停止するそうです。
記事の中ではpythonとgoでcatを作成してSIGPIPEを受けて停止するように作成する例が出ていました。
RubyやSwiftではどうやってやるのでしょうか。
## Rubyの場合
```ruby
`gutter:true;
#! ruby -Ku
while gets
puts $_
end
```
SIGPIPEをよしなに処理してくれるようです。
## Swiftの場合
Swiftの場合は、ファイルから順に読み込んで処理するメソッドがなかったので、StreamReaderを作成する必要がありました。
StreamReaderを作成すれば以下のように処理できます。
```c
`gutter:true;
import Foundation
for argument in CommandLine.arguments {
if let streamReader = StreamReader(path: argument) {
defer {
streamReader.close()
}
while let line = streamReader.nextLine() {
print(line)
}
}
}
```
[source](https://github.com/k28/swift_study/tree/master/command_line_tool)はこちら
rubyはコマンドラインツールを作成するのがしやすいと思いました。
## 参考URL
- [Read a file/URL line-by-line in Swift](https://stackoverflow.com/questions/24581517/read-a-file-url-line-by-line-in-swift)
0 件のコメント :
コメントを投稿