PowerShell 출력 스트림 살펴보기
PowerShell 출력 스트림 살펴보기 (about_Output_Streams)
PowerShell 명령을 실행하면 결과가 그냥 화면에 나오는 것처럼 보이지만, 사실 그 뒤에는 몇 갈래로 나뉜 통로가 있어요. 이 통로를 출력 스트림(output stream) 이라고 부르는데요, 메시지의 종류에 따라 서로 다른 스트림으로 흘러가게 돼요. 어떤 스트림들이 있고, 각각 언제 쓰는지 하나씩 살펴볼게요.
본문
출력 스트림이 왜 필요한가요?
PowerShell은 여러 개의 출력 스트림을 제공해요. 각 스트림은 서로 다른 종류의 메시지를 위한 채널 역할을 해요. 스트림에 메시지를 쓸 때는 해당하는 cmdlet을 쓰거나 리다이렉션을 사용해요. 리다이렉션에 대한 자세한 내용은 about_Redirection을 참고해 주세요.
PowerShell이 지원하는 출력 스트림
| 스트림 번호 | 설명 | 도입된 버전 | 쓰기 cmdlet |
|---|---|---|---|
| 1 | 성공 스트림 (Success stream) | PowerShell 2.0 | Write-Output |
| 2 | 오류 스트림 (Error stream) | PowerShell 2.0 | Write-Error |
| 3 | 경고 스트림 (Warning stream) | PowerShell 2.0 | Write-Warning |
| 4 | 자세한 스트림 (Verbose stream) | PowerShell 2.0 | Write-Verbose |
| 5 | 디버그 스트림 (Debug stream) | PowerShell 2.0 | Write-Debug |
| 6 | 정보 스트림 (Information stream) | PowerShell 5.0 | Write-Information 또는 Write-Host |
| n/a | 진행률 스트림 (Progress stream) | PowerShell 2.0 | Write-Progress |
참고: 진행률 스트림(Progress stream)은 리다이렉션을 지원하지 않아요.
성공 스트림 (Success stream)
성공 스트림은 평범하게 정상적인 결과가 나왔을 때 사용하는 기본 스트림이에요. 객체를 이 스트림으로 명시적으로 보내고 싶다면 Write-Output cmdlet을 쓰면 돼요. 이 스트림은 객체가 PowerShell 파이프라인을 통과할 때 사용되기 때문에 특히 중요해요. 네이티브 애플리케이션의 stdout 스트림이 바로 이 성공 스트림과 연결돼요.
오류 스트림 (Error stream)
오류 스트림은 오류 결과를 위한 기본 스트림이에요. Write-Error cmdlet으로 명시적으로 쓸 수 있고요, 이 스트림은 네이티브 애플리케이션의 stderr 스트림과 연결돼요. 대부분의 상황에서 이런 오류는 실행 파이프라인을 중단시킬 수 있어요. 이 스트림에 기록된 오류는 $Error 자동 변수에도 함께 추가돼요. 자동 변수에 대한 자세한 내용은 about_Automatic_Variables를 참고해 주세요.
경고 스트림 (Warning stream)
경고 스트림은 오류 스트림에 기록되는 것보다 가벼운 오류 상황을 위한 곳이에요. 보통 조건에서는 경고가 실행을 중단시키지 않아요. 그리고 경고는 $Error 자동 변수에 기록되지 않아요. 명시적으로 보내려면 Write-Warning cmdlet을 쓰면 돼요.
자세한 스트림 (Verbose stream)
자세한 스트림은 명령을 대화형으로 실행하거나 스크립트로 실행할 때 문제를 해결하도록 돕는 메시지를 위한 곳이에요. Write-Verbose cmdlet으로 메시지를 명시적으로 쓸 수 있어요. 많은 cmdlet이 내부 동작을 이해하는 데 유용한 자세한 출력을 제공하는데, 이 메시지는 -Verbose 공통 매개 변수를 사용할 때만 출력돼요. 자세한 내용은 about_CommonParameters를 참고해 주세요.
디버그 스트림 (Debug stream)
디버그 스트림은 스크립터가 자기 코드가 왜 실패하는지 이해하도록 돕는 메시지를 위한 곳이에요. Write-Debug cmdlet으로 명시적으로 쓸 수 있고요, 이 메시지는 -Debug 공통 매개 변수를 사용할 때만 출력돼요. about_CommonParameters를 참고해 주세요.
디버그 메시지는 최종 사용자보다는 스크립트와 cmdlet 개발자를 위해 만들어진 거예요. 깊은 문제 해결에 필요한 내부 세부 사항을 담을 수 있거든요.
정보 스트림 (Information stream)
정보 스트림은 사용자가 스크립트가 지금 무엇을 하고 있는지 이해하도록 돕는 메시지를 위한 곳이에요. 개발자가 PowerShell을 통해 정보를 전달하는 추가 스트림으로도 쓸 수 있는데요, 이때 스트림 데이터에 태그를 붙여 그 스트림만을 위한 처리를 할 수 있어요. Write-Information cmdlet으로 명시적으로 쓸 수 있어요.
여기서 한 가지 중요한 차이가 있어요. Write-Host도 정보 스트림에 작성하지만, 정보 스트림을 리다이렉트하지 않는 한 호스트 콘솔에도 함께 출력돼요. 반면 Write-Information은 정보 스트림에만 작성한다는 점이 달라요.
진행률 스트림 (Progress stream)
진행률 스트림은 오래 걸리는 명령과 스크립트에서 진행 상황을 알려주는 메시지를 위한 곳이에요. Write-Progress cmdlet으로 명시적으로 쓸 수 있어요. 앞서 말했듯이 진행률 스트림은 리다이렉션을 지원하지 않아요.