golang

golang Pipe CommandLine

kimbs0301 2025. 5. 11. 10:39

golang os.Stdin 사용해서 커맨드라인 파이프 사용하기

 

바이너리 파일 출력

main.go

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	fi, err := os.Stdin.Stat()
	if err != nil {
		fmt.Println(err)
		return
	}
	if (fi.Mode() & os.ModeNamedPipe) == 0 {
		fmt.Println("no pipe")
		return
	}

	fmt.Println("pipe")
	buf := make([]byte, 4096, 4096)
	for {
		n, err := os.Stdin.Read(buf)

		if err == io.EOF {
			break
		}
		if err != nil {
			fmt.Println(err)
			break
		}
		fmt.Printf("bytes %x\n", buf[:n])
	}
}

 

$ go build -o PipeTest.exe main.go

$ tar czp /data/db/mariadb/backup/full | ./PipeTest.exe

 

 

텍스트 파일 출력

main.go

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	fi, err := os.Stdin.Stat()
	if err != nil {
		fmt.Println(err)
		return
	}
	if (fi.Mode() & os.ModeNamedPipe) == 0 {
		fmt.Println("no pipe")
		return
	}

	fmt.Println("pipe")
	//var buf []byte
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		fmt.Printf("%s\n", scanner.Bytes())
		//buf = append(buf, scanner.Bytes()...)
	}
	if err := scanner.Err(); err != nil {
		fmt.Println(err)
	}
	//fmt.Printf("%s\n", buf)
}

 

$ go build -o PipeTest.exe main.go

$ cat /data/logs/server.log | ./PipeTest.exe

 

 

references
https://zetcode.com/golang/pipe/