/var/www/tistory/Yongbaldae
yongmin@kali: ~/blog$ ls posts

powershell은 Linux와 무슨 관련이 있을까?

예전부터 궁금했던 것중 하나가 있습니다.

 

왜 powershell에서는 Linux 명령어가 사용되는데 cmd에서는 불가능한 것일까?

 

사실 반대가 좀 더 맞는 표현이겠군요.

 

cmd에서는 Linux 명령어가 사용불가한데 어째서 powershell에서는 가능한 것일까?

한국에서 태어나고 자랐다면 어쩔수 없이 OS로는 window로 처음 접할 수 밖에는 없을것이고 GUI에 익숙한 것이

당연할겁니다.

 

하지만 컴공을 비롯한 공대생이라면 linux를 대학교 전공수업에서 배울 것이고 CLI에 대해 조금씩 눈을 뜨게 되겠죠.

 

그리고 몇몇 작업들이나 패키지는 다운받을 때 CLI로 하는 것이 편하다는 것을 깨닫게 되는데,,,,

 

블로그나 공식홈페이지에 나와있는 것은 mac에만 해당되는 경우도 꽤 많습니다.

 

그래서 매번 윈도우에 맞는 명령어로 바꿔서 해결하려던 와중에 powershell이라는 것이 리눅스 명령어를 별칭으로 사용할 수 있다는 것을 알고 나서 계속 사용하고 있습니다.

 

하여튼, "도대체 powershell은 cmd와 무슨 차이가 있고, 왜 리눅스 명령어를 사용할 수 있게된 것일까요?" 

 

라고 GPT선생에게 여쭈어 봤습니다.


 

PowerShell과 CMD는 둘 다 Windows 운영 체제에서 제공하는 명령줄 인터페이스이지만, 두 프로그램의 설계 철학과 기능이 상당히 다릅니다. 이 차이 때문에 PowerShell에서는 Linux 명령어와 유사한 명령어를 사용할 수 있는 반면, CMD에서는 그렇지 않습니다. 그 이유를 다음과 같이 설명할 수 있습니다:

1. CMD (명령 프롬프트)의 특징

  • 역사와 목적: CMD는 Windows의 오래된 명령줄 인터페이스로, MS-DOS 시절부터 이어져 온 전통적인 명령줄 환경입니다. 주로 파일 및 디렉토리 관리, 시스템 명령 실행 등의 기본적인 작업을 위해 설계되었습니다.
  • 명령어 셋: CMD는 MS-DOS 명령어 집합을 기본으로 하며, 주로 dir, copy, del, cd 등 Windows와 DOS 명령어를 사용합니다. Linux 또는 Unix 기반의 명령어는 인식하지 않습니다.
  • 스크립트 언어: CMD는 배치 파일(.bat 또는 .cmd)을 사용한 간단한 스크립팅을 지원하지만, 복잡한 스크립팅이나 고급 기능은 제한적입니다.

2. PowerShell의 특징

  • 역사와 목적: PowerShell은 Windows 환경에서 시스템 관리 및 자동화를 보다 쉽게 하기 위해 2006년에 처음 도입되었습니다. 기존의 CMD나 Unix 셸의 기능을 넘어서 Windows 환경의 관리를 효율적으로 할 수 있도록 설계되었습니다.
  • 객체 지향: 가장 큰 차이점 중 하나는 PowerShell이 객체 지향적이라는 점입니다. PowerShell은 명령의 출력을 텍스트가 아닌 .NET 객체로 반환합니다. 이를 통해 출력 데이터를 쉽게 조작하고 필터링할 수 있습니다.
  • 확장된 명령어 셋: PowerShell은 자체 명령어(‘cmdlet’이라 불리는)를 가지고 있으며, 이는 Linux의 많은 명령어와 비슷한 이름과 기능을 가집니다. 예를 들어, Get-ChildItem은 Linux의 ls 명령과 비슷한 역할을 합니다. 또한 PowerShell은 ls, cat, grep 등과 같은 일부 Linux 명령어의 별칭을 포함하고 있어 Linux 명령어처럼 보이게 합니다.
  • 호환성: PowerShell은 최신 버전에서 Linux와의 호환성을 강화하여, WSL(Windows Subsystem for Linux)을 통해 Linux 명령어와 스크립트를 직접 실행할 수 있습니다. 이는 개발자와 시스템 관리자들이 Windows 환경에서도 Linux 명령어와 스크립트를 활용할 수 있게 합니다.

3. PowerShell에서 Linux 명령어가 작동하는 이유

PowerShell은 명령어 별칭과 호환성 모드를 제공하여 Linux의 일부 명령어를 지원하고, WSL을 통해 직접 Linux 환경을 사용할 수 있게 합니다. 또한, PowerShell은 더 강력한 스크립팅 기능과 다양한 시스템 관리 작업을 자동화할 수 있는 기능을 제공합니다.

이러한 차이점 때문에 PowerShell에서는 일부 Linux 명령어와 유사한 명령어가 작동하는 반면, CMD에서는 그러한 명령어가 지원되지 않습니다.


GPT에서 나온 답변이 정답이 아닌 경우도 있긴 하지만, 지금까지의 경험으로는 제가 찾아본 바와 대부분 일치하더군요. 이번에도 체크해보니 거의 똑같은 정보를 얻을 수 있었습니다. 

 

위와 같은 특징이 있다는데 다른 특징들은 이해가 되도 객체 지향 이라는 특징은 잘 이해가 안됐습니다.

 

특히 .NET(닷넷) 객체는 들어보기만 했지 정확히 뭔지 몰라서 찾아봤습니다.

 

.NET프레임워크는 마이크로소프트에서 출시한 윈도우 프로그램 개발 및 실행 환경이다. 네트워크 작업, 인터페이스 등의 많은 작업을 캡슐화하였고, 공통 언어 런타임이라는 이름의 가상 머신 위에서 작동한다. (위키백과)

 

즉, 파일 입출력, 데이터베이스 연결, 네트워킹, 웹 개발 등의 기능을 쉽게 구현할 수 있도록 했다는 것이고 그 역할을 닷넷 객체가 담당하도록 한다는 것으로 이해했습니다.

 

이해한 내용이 맞는지 GPT에게 물어보니


PowerShell에서 파일 목록을 가져오는 명령어 Get-ChildItem을 실행하면 파일과 디렉토리 정보를 담고 있는 .NET 객체를 반환합니다. 이 객체들은 다양한 속성(파일 이름, 크기, 생성 날짜 등)을 포함하고 있으며, 이러한 속성은 쉽게 접근하고 조작할 수 있습니다.

PowerShell에서의 .NET 객체

PowerShell은 .NET 프레임워크 위에서 실행됩니다. PowerShell의 명령어는 cmdlet이라고 부르며, 이 cmdlet들은 .NET 객체를 반환합니다. 예를 들어, PowerShell에서 파일 목록을 가져오는 명령어 Get-ChildItem을 실행하면 파일과 디렉토리 정보를 담고 있는 .NET 객체를 반환합니다. 이 객체들은 다양한 속성(파일 이름, 크기, 생성 날짜 등)을 포함하고 있으며, 이러한 속성은 쉽게 접근하고 조작할 수 있습니다.

텍스트 출력과 객체 반환의 차이점

CMD는 명령의 출력을 일반적인 텍스트 형식으로 반환합니다. 예를 들어, dir 명령어는 텍스트 형식의 파일 목록을 출력합니다. 이 텍스트는 사람이 읽을 수 있지만, 프로그램적으로 다루기에는 제한적입니다. 특정 파일의 정보를 필터링하거나 정렬하려면 복잡한 문자열 조작을 수행해야 합니다.

반면, PowerShell에서 명령의 출력이 .NET 객체로 반환되면 다음과 같은 장점이 있습니다:

 

1 . 데이터 조작의 용이성: .NET 객체는 속성과 메서드를 가진 구조화된 데이터이기 때문에, PowerShell에서 이 데이터를 쉽게 조작할 수 있습니다. 예를 들어, 특정 파일의 크기나 확장자만을 필터링하거나 정렬하는 작업이 매우 간단합니다.

# 특정 폴더에서 .txt 파일만 가져오기
Get-ChildItem -Path C:\SomeFolder -Filter *.txt

 

2 . 일관된 데이터 형식: .NET 객체는 일관된 데이터 형식을 제공하므로, 다양한 명령어(cdmlet)가 반환하는 데이터를 서로 결합하고 활용하는 것이 훨씬 쉽습니다. 예를 들어, 디렉토리 목록을 가져오고 그 결과를 파이프라인을 통해 다른 명령어로 전달할 때, 객체로 된 데이터를 그대로 전달할 수 있어 효율적입니다.

# 파일 목록을 가져와 크기 순으로 정렬하기
Get-ChildItem | Sort-Object Length

 

3 . 풍부한 기능: .NET 객체는 많은 내장 메서드와 속성을 가지고 있어, 단순한 텍스트 조작보다 훨씬 강력한 작업을 수행할 수 있습니다. 예를 들어, 파일을 읽고 쓰거나, 프로세스를 관리하는 등의 작업을 더 직관적이고 강력하게 할 수 있습니다.

결론

PowerShell의 객체 지향적 접근 방식은 시스템 관리 작업을 더 유연하고 강력하게 만듭니다. 텍스트 출력 대신 객체를 사용함으로써 데이터를 더 쉽게 조작하고, 다양한 시스템 관리 작업을 자동화할 수 있는 능력을 제공합니다. 이는 특히 복잡한 스크립팅 작업이나 대규모 시스템 관리를 수행하는 경우에 매우 유용합니다.

 


결국에는 powershell이 2006년에 도입된 이유가 Windows 환경에서 시스템 관리 및 자동화를 보다 쉽게 하기 위해였고 , 그로인해 리눅스 명령어와 더불어 객체지향적인 요소까지 겸비하게 되었다는 것을 확인할 수 있었습니다.

 

more_posts (recent 5)