파이프의 입력 행당 순차 명령 실행

2156 단어 5명령
타이틀과 같은 거동을 하는 프로그램을 만들어 보았다는 기사입니다.

개요 lbyl이라는 프로그램을 만들었습니다. (이름은 line-by-line의 약자입니다) ↓ 이런 식으로 사용합니다. > ./long-lasting-script | lbyl growlnotify.exe ? 이 예에서는, long-lasting-script 로부터 파이프 된 표준 입력을 행 단위로 분할해, growlnotify 의 인수에 건네주고 있습니다. 말미의 「?」가 인수의 위치를 ​​지시하는 마커입니다. lbyl 의 인수에 건네받은 프로그램은, 표준 입력의 행 마다 입력을 받을 때마다, 개별의 프로세스로서 기동합니다. 옵션 -throttling=xxx 로 스로틀링하고 있는 경우는, 지정의 밀리 세컨드마다 입력을 축적한 다음에 프로세스를 기동합니다. 옵션 -async (을)를 사용하면(자), 프로세스를 동시 기동할 수도 있습니다. 옵션 -pipe 를 지정하면(자), 인수가 아니고, 기동시킨 프로세스의 표준 입력에 흘려 넣습니다. 배경 사용 사례 예를 들어, 장시간 걸리는 유지보수용 스크립트를 흘리고 있고, 자신에게 편리한 타이밍으로 상황을 확인하고 싶다고 합니다. 다른 작업을 하면서 깜박임 콘솔을 보는 것도 귀찮습니다. 여기에는 알림 앱을 사용하여 알림을 보내고 싶습니다. 그건 그렇고, 유지 보수 스크립트는 표준 출력과 표준 오류 (콘솔 화면)에 상황을 순차적으로 출력합니다. 또한 명령줄에서 알림 앱에 게시하는 명령이 있다고 가정합니다. (예 : growlnotify.exe) 문제점 lbyl 없이 간단하게 하려고 하면, 이런 느낌이 될지도 모릅니다. > ./long-lasting-script | growlnotify.exe 여기서 문제점이 두 가지. growlnotify 는 파이프(표준 입력)로부터의 메시지의 유입에 대응하고 있지 않다. 파이프(표준 입력)를 항상 감시하고 매번 처리를 해주는 프로그램은 의외로 적다. 전자는 xargs라는 것을 사용하면 해결할 것 같습니다. 나는 Windows를 사용하지만 Windows에서도 비슷한 것을 할 수 있습니다. 다만… 후자에 대해서는 다음을 시도해보십시오. (Windows) > ping 0.0.0.0 | more # 이것은 순차적으로 출력된다 > ping 0.0.0.0 | msg * # 끝까지 처리 된 후 함께 표시됩니다. > ping 0.0.0.0 | iconv -t utf-8 | more # 요 iconv 함께 표시 요점은 프로그램에 의해 거동이 제대로 된다는 것입니다. lbyl에서 위의 예는 다음과 같이 바뀝니다. > ping 0.0.0.0 | lbyl -pipe more > ping 0.0.0.0 | lbyl -pipe msg * > ping 0.0.0.0 | lbyl -pipe iconv -t utf-8 | more lbyl 로부터 호출하는 것으로 행 마다의 출력이 됩니다. 출력의 시작부터 종료까지 시간이 걸리는 명령에서도 순차 출력을 얻을 수 있습니다. 개발 하는 일은 상당히 간단합니다. 표준 입력을 버퍼를 위해서, 1행마다 (-throttle=0 의 경우) 혹은 지정 시간 후의 읽어들일 때 (-throttle != 0 의 경우) 인수에 건네진 프로그램을 기동하는 것 뿐입니다. 다만, 기동한 것만으로는, 기동한 프로세스의 출력이 lbyl 의 출력에 흐르지 않습니다. 따라서 exec.Command() 의 반환값의 Stdout, Stderr 에 os.Stdout, os.Stderr 를 건네주는 형태로 출력을 공유하고 있습니다. 기타 lbyl은 Go에서 만들었습니다. 필요한 라이브러리가 충분히 갖추어져 거의 표준 라이브러리로 부족했습니다. 옵션의 구현도, 캐릭터 라인 조작도, 프로세스 기동도 간단하게 짜넣고 있습니다. 또한 Go의 이점으로 크로스 컴파일을 쉽게 할 수있었습니다. (Windows 이외의 환경은 별로 사용하지 않지만)

좋은 웹페이지 즐겨찾기