echo는 메시지를 화면에 출력하거나, 배치 파일에서 실행되는 명령 자체를 화면에 보여줄지(에코) 켜고 끄는 내장 명령이다.
이 장을 읽기 전에
선행 챕터: 이 장은 29장: more로 Part 3(텍스트 검색과 출력 제어)을 마친 뒤 이어지며, Part 4(배치 스크립팅)의 첫 장이다. 지금까지 세 Part는 이미 있는 파일과 그 내용을 다뤘다면, 이 장부터는 명령을 반복 가능한 .bat 프로그램으로 묶는 법을 다룬다.
이 장의 깊이: 입문. echo 자체는 단순하지만, 배치 스크립팅 전반에서 가장 많이 쓰이는 명령이라 함정도 그만큼 잘 알려져 있다. 다루지 않는 것: 변수 자체를 만들고 값을 넣는 것은 31장(set)에서 다룬다.
사용법
| |
옵션
| 옵션 | 설명 |
|---|---|
on | off | 명령 에코 기능을 켜거나 끔(기본값은 on) |
<메시지> | 화면에 표시할 텍스트 |
인수 없이 echo만 실행하면 현재 에코 설정을 표시한다.
예시
| |
| |
주의사항·함정
echo.은 점 앞에 공백이 있으면 안 된다: 빈 줄을 출력하는 관용구인 echo.은 점과 echo 사이에 공백이 없어야 한다. 공백을 넣으면 점 자체가 그대로 출력된다.
“To echo a blank line on the screen, type: echo. — Don’t include a space before the period. Otherwise, the period appears instead of a blank line.” — Microsoft Learn, “echo”
변수가 비어 있으면 “ECHO is off.“가 출력된다: echo %var%에서 var가 정의되지 않았거나 빈 문자열이면, 화면에는 의도한 빈 줄 대신 다음 메시지가 나온다.
“If there’s an empty variable in a batch file while using echo, it displays ‘ECHO is off’. To prevent seeing this message, and produce a blank line instead, place a colon (
:) between echo and the variable. For example,echo:%var%.” — Microsoft Learn, “echo”
즉 echo %var% 대신 echo:%var%로 쓰면, var가 비어 있어도 “ECHO is off.” 대신 빈 줄이 출력된다. 사용자 입력이나 외부 명령 결과를 그대로 echo로 출력하는 스크립트에서 이 함정에 자주 걸린다.
특수문자는 캐럿(^)으로 이스케이프한다: 파이프(|), 앰퍼샌드(&), 리다이렉션(<, >)을 그대로 출력하려면 그 문자 바로 앞에 ^를 붙인다. 괄호로 묶인 블록(if나 for의 본문) 안에서는 여는 괄호·닫는 괄호((, )) 자체도 ^로 이스케이프해야 한다는 점이 특히 자주 놓치는 부분이다 — 위 두 번째 예시의 echo. 앞줄에서 ^(s^)가 그 사례다. 느낌표(!)를 출력하려면 문자열 전체를 큰따옴표로 감싼 뒤 느낌표 앞에 캐럿을 붙이거나("Hello World^!"), 큰따옴표 없이 캐럿을 두 번 겹쳐 쓴다(Hello World^^!).
PowerShell의 대응 명령은 두 갈래로 나뉜다: Write-Host는 콘솔에 직접 출력한다는 점에서 echo의 단순한 화면 표시 목적과 비슷하지만, Write-Output은 화면이 아니라 파이프라인에 값을 흘려보내 다음 명령이 그 데이터를 이어받게 하는 용도다. 이 둘은 흔히 오해하듯 서로 바꿔 써도 되는 관계가 아니다 — 파이프라인으로 데이터를 넘길 작정으로 Write-Host를 쓰면 그 출력은 캡처도 파이프도 되지 않아 조용히 사라져 버린다. CMD의 echo는 애초에 화면 표시라는 목적 하나만 가지므로 이런 구분 자체가 존재하지 않는다.
흔한 오개념
“Write-Host와 Write-Output은 그냥 화면에 출력하는 두 가지 방법일 뿐이다”는 오해가 있다. CMD에서 넘어온 사람뿐 아니라 PowerShell을 어느 정도 써본 사람도 자주 걸리는 함정이다. Write-Output은 파이프라인으로 객체를 내보내 $result = Get-Thing처럼 다음 명령이나 변수가 그 값을 받을 수 있게 하지만, Write-Host는 콘솔에 직접 그리는 것이라 변수에 담거나 파이프로 넘길 수 없다. 함수 안에서 진행 상황 로그는 Write-Host로, 실제 반환값은 값을 그대로 남기거나 Write-Output으로 내보내는 식으로 구분하지 않으면, 함수의 반환값에 로그 메시지가 뒤섞여 들어가는 버그가 생긴다.
다음 장에서는
다음은 31장 — 환경 변수를 표시·설정하고 산술 연산까지 지원하는 set 명령을 다룬다.
평가 기준
- echo로 메시지를 출력하고,
echo off/echo on으로 명령 에코를 제어할 수 있다. echo.으로 빈 줄을 출력할 때 점 앞에 공백이 없어야 하는 이유를 설명할 수 있다.- 빈 변수를 echo할 때 “ECHO is off.“가 출력되는 함정과
echo:해법을 설명할 수 있다. ^로 특수문자와 괄호를 이스케이프하는 규칙을 적용할 수 있다.
![Featured image of post [CMD] 30. echo - 메시지 출력과 에코 설정](/post/cmd/echo-command-display-message-windows-cmd/wordcloud_hu_279c7c24e94357df.webp)
![[CMD] 28. sort - 텍스트 입력 정렬](/post/cmd/sort-command-sort-text-lines-windows-cmd/wordcloud_hu_bfce5355b7171630.webp)
![[CMD] 29. more - 출력을 한 화면씩 표시](/post/cmd/more-command-page-output-windows-cmd/wordcloud_hu_a8d7dcffe8f1e769.webp)
![[CMD] 30. echo - 메시지 출력과 에코 설정](/post/cmd/echo-command-display-message-windows-cmd/wordcloud_hu_a118dc2c2f925b5b.webp)
![[CMD] 31. set - 환경 변수 표시·설정과 산술 연산](/post/cmd/set-command-environment-variables-windows-cmd/wordcloud_hu_9a17bda8a3ec494f.webp)
![[CMD] 32. if - 배치 파일 조건 분기](/post/cmd/if-command-conditional-batch-windows-cmd/wordcloud_hu_94854caa43b14568.webp)
![[CMD] 33. for - 파일·디렉터리·숫자 범위 반복](/post/cmd/for-command-loop-batch-windows-cmd/wordcloud_hu_73a7fba9029a93f7.webp)
![[CMD] 35. goto - 배치 파일 레이블로 실행 흐름 이동](/post/cmd/goto-command-batch-label-jump-windows-cmd/wordcloud_hu_6dd399e5e75f965d.webp)
![[CMD] 36. shift - 배치 매개변수 위치 이동](/post/cmd/shift-command-batch-parameters-windows-cmd/wordcloud_hu_da5f78c8c575c1b1.webp)