본문 바로가기

Tools and Utilities/그 외 여러가지 도구들

[Windows] CLI, cmd.exe, Windows Powershell 등 완벽 개념정리!!

안녕하세요~!~~! 커피러브입니다.

저번 글에 이어서, cmd.exe(이하 cmd)와 Windows Powershell(이하 파워쉘)의 차이점에 대해 정리해보도록 하겠습니다!!~~~!

저번 글을 안 보신 분들은 보고 와주셔야 이해가 됩니다.

https://cuffyluv.tistory.com/196

 

[Linux] 쉘, 터미널, bash, git bash, mingw-w64 등 완벽 개념정리!!!

안녕하세요~!~~! 커피러브입니다.학교 수업으로 리눅스를 공부하다가, git bash와 mingw-w64가 정확히 뭔가? 왜 등장한건가? 의문이 들어서이참에 shell, bash, terminal, console까지 한꺼번에 정리해보려고

cuffyluv.tistory.com

급하신 분들은 파란 글씨만 보셔도 됩니다!!


이 글을 보면 알 수 있는 것들~!~~!

  • CLI(Command Line Interface)
  • Windows Console
  • Windows Terminal
  • cmd.exe
  • Windows Powershell

이 글을 이해하기 위해 필요한 선수지식


1. CLI(Command Line Interface)

cmd와 파워 쉘을 설명하기 전에, 먼저 CLI는 뭐냐?? 를 알아야 합니당~!~!!

CLI는 '한 줄 한 줄씩 글자를 입력하여 컴퓨터에 명령을 내리는 방식'입니다.

그리고 그 한 줄의 명령어를 Command Line이라고 부르구영~~~

 

여기서 핵심은 '방식'!!!

CLI는 GUI랑 대비되어서 '이런 식으로 명령을 내린다!'하는 방식의 일종이지, 쉘이나 터미널같은 것들과는 다른 범주의 개념입니다.

하지만 이 CLI방식을 사용하는 것 또한 CLI라고 부르기도 합니다. (Shell은 CLI방식을 사용한다 -> Shell은 CLI이다)

또한 모든 Shell들은 CLI방식을 사용하고 있다고 볼 수 있습니당~~

 

이걸 이해하고~~~ 출발해 봅시당.


2. Windows Console

지금 위에 보고계시는 화면이 Windows Console인데요.

보통명사가 아니라 고유명사입니다!! 윈도우에서 윈도우 버전 10까지 쓰던 윈도우 기본 터미널이에용.

즉, 이름이 콘솔이긴 하지만, 얘는 엄연히 터미널입니다.

 

근데, 얘는 보면 좀 꾸져보이지 않나용??

뭔가 좀 글씨도 못나보이고... 위에 탭에도 암것두 없구...

그래서!! 마이크로소프트에서 이대론 못살겠다!! Windows Console을 대신할 수 있는 새로운 터미널을 하나 만들어보자!! 해서 나온 게 대망의 'Windows Terminal'입니다.


3. Windows Terminal

직접 찍은 스샷 ㅎ

얘도 Windows Console처럼 고유명사인데요, 윈도우 버전 11 베타버전부터 기본 설치되어 있는, 윈도우가 19년도에 발표한 윈도우의 최신 기본 터미널입니다.

얘는 Windows Console대비 여러 개선점을 가졌지만, 가장 눈에 띄는 개선점은 위에 탭이 생겨서 여러 개의 쉘들을 탭으로 띄워놀 수 있다는 것이지요!!

보면 저렇게 하나하나 쉘들을 선택할 수 있지요 ㅎㅎ 쉘도 참 많네유. 저는 아나콘다도 깔았어서 그것도 있구요.


4. cmd.exe

자~~~! 그래서 위에 보면 Windows Terminal로 띄울 수 있는 쉘들이 참 많죠?? 그 중에 명령 프롬프트(cmd.exe)도 보일 겁니다.

cmd는 윈도우의 가장 기본적이고 전통적인 CLI이자 쉘입니다. 

앞서 말했듯 윈도우 11부터는 Windows Terminal가 터미널로 cmd를 작동(run)시키고요.

 

여기서 '전통적'이라는 건 좀 부정적인 의미인데...

리눅스의 bash에 비해 기능이 너무나 초라해서, 윈도우 환경에서 개발하던 개발자들은 cmd만으로는 한계가 있다고 생각했고, 따라서 마이크로소프트한테 계속 새로운 쉘을 만들어달라는 요구가 있었습니다.


5. Windows Powershell

그래서 cmd에서 확장하여 더 많은 기능을 가진 CLI(내지 쉘)을 개발하였으니!!

그게 바로 Windows Powershell이었습니다.

 

Windows Powershell은 cmd에 비해 더 많은 기능을 가지고 있는 윈도우의 CLI이자 쉘이자 인터프리터입니다.

기본적으로 cmd에서 되는 건 powershell에서도 가능하구요.

게다가 인터프리터 역할까지 하면서 스크립팅 언어의 특성도 띠고 있어서, powershell에서 자체적으로 스크립팅도 가능합니다. 그리고 자세히 설명하진 않겠지만 객체지향적인 특징도 가지고 있구요.

 

이 powershell의 출시 이후로 cmd는 사실상의 레거시가 되었죠. 뭐 아직도 대부분 간단한 작업들은 cmd로 충분히 되지만, powershell을 안 쓸 이유가 없잖아요? 아직까지도 cmd를 쓰는 대부분은 그냥 '익숙해서' 내지 'cmd로도 충분한 것들만 해서'의 이유가 클 겁니다.

cf.) cmd는 인터프리터일까??

또한, 이건 진짜진짜 여담이지만... 

powershell은 인터프리터라고 확실하게 부르지만, cmd는 보통 인터프리터라고 부르기엔 또 애매하거든여?? 그렇다고 인터프리터가 아니라고 하기도 어렵구여.

이건 왜 그러냐면, 인터프리터라는 용어 자체가 프로그래밍 언어에 주로 쓰는 말이라서 그렇습니다.

그러나, 굳이 'cmd는 인터프리터냐??'고 묻는다면, 대답은 YES라고 생각해요.

 

일단 아래처럼 Shell은 인터프리터라고 보는 의견이 많구요.

https://www.quora.com/Why-is-the-shell-called-command-interpreter

또한, 아래처럼 GNU에 bash의 경우는 Shell이자 인터프리터라고 확실하게 명시되어 있구요.

https://stackoverflow.com/a/30156564

앞서 설명했듯 cmd.exe또한 Shell이고, 그 동작 방식이 bash처럼 인터프리터로서 동작한다고 생각할 수 있기 때문에, 굳이 따지자면 인터프리터는 맞다고 봅니다.

정확히는 이 자체로는 인터프리터 언어는 아니고, (임의의) 인터프리터 언어로 적힌 코드를 해석하는 인터프리터이죠.

 

근데 powershell은 인터프리터라고 확실하게 말하고 다니는데, 이건 스크립트를 동적으로 해석하는 능력이 cmd에 비해 더 확실하게 powershell에 많이 들어가서, powershell은 좀 확실하게 인터프리터라고 하는 느낌이에요.

https://www.quora.com/Is-there-an-interpreter-running-behind-the-Command-Line-Interface


cf. Windows Powershell에서 Linux 명령어인 'pwd'가 작동하는 이유??

이건 좀 여담인데,,, Windows Powershell은 윈도우에서 돌아가는 쉘이고, 따라서 리눅스랑은 다른 명령어(commands)를 쓴단 말이죠??

근데, 리눅스의 명령어인 pwd가 Windows Powershell에서 아주 잘 작동하는데, 어떻게 된 일일까요??

참고로 powershell에는 엄격하게는 pwd 명령어가 없습니다!!!

 

그 이유는, 우리 리눅스 공부할 때 alias(별칭) 짓던 거 생각나세용??

그것처럼, 마이크로소프트가 자체적으로 powershell내에 'get-location'이라는, 리눅스의 pwd와 같은 기능을 하는 명령어를 가지고 'pwd'라는 별칭을 지어줘서 그렇습니다!!

 

따라서 유저는 그냥 pwd라는 별칭만 입력해도, 내부적으론 get-location 명령이 실행되는 거죠. ㅎㅎ

저도 그냥 파워쉘에서 pwd 입력하고 그러는데, 많은 사람들이 그랬을 거니까 적절한 조치였다고 볼 수 있겠네요 ㅎㅎ

PS C:\Users\Yeonwoo Lee> Get-Alias

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           ac -> Add-Content

...

Alias           nsn -> New-PSSession
Alias           nv -> New-Variable
Alias           ogv -> Out-GridView
Alias           oh -> Out-Host
Alias           popd -> Pop-Location
Alias           ps -> Get-Process
Alias           pushd -> Push-Location
Alias           pwd -> Get-Location
Alias           r -> Invoke-History
Alias           rbp -> Remove-PSBreakpoint
Alias           rcjb -> Receive-Job
Alias           rcsn -> Receive-PSSession
Alias           rd -> Remove-Item
Alias           rdr -> Remove-PSDrive
Alias           ren -> Rename-Item
Alias           ri -> Remove-Item
Alias           rjb -> Remove-Job

그래서, powershell에서 Get-Alias 명령어로 현재 설정되어 있는 aliases(basic aliases)들을 볼 수 있숩니당.

보면 Get-Location에 pwd라는 alias이 등록되어있는 거 보이시죵??

alias similar to bash들을 제공해 리눅스 쉘 스크립팅 쓰던 사람들도 잘 쓸 수 있게 해준 것이죠 ㅎ