PowerShell에서 VAR=값 명령이 "용어가 인식되지 않습니다"로 죽는 이유

블로그에 있는 명령을 그대로 붙여넣었다.

NOTION_DB=1db27661-1676-45f6-95fd-bda8366a9898 node scripts/push-notion.mjs --check

PowerShell 이 이렇게 답했다.

NOTION_DB=1db27661-1676-45f6-95fd-bda8366a9898 : 'NOTION_DB=1db27661-1676-45f6-
95fd-bda8366a9898' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로
그램 이름으로 인식되지 않습니다.
    + FullyQualifiedErrorId : CommandNotFoundException

여기서 대개 의심하는 것

오류 메시지가 긴 문자열을 통째로 인용하니 오타부터 본다. 나도 DB id 를 다시 세어봤다. node 가 설치 안 됐나 싶어 node -v 도 찍어봤다. 잘 나왔다.

실제 원인

문법 자체가 없다.

VAR=값 명령 은 POSIX 셸(bash, zsh)의 문법이다. 그 명령이 도는 동안에만 환경변수를 붙여준다.

PowerShell 은 이걸 모른다. 첫 토큰인 NOTION_DB=1db2... 를 실행할 프로그램 이름으로 읽는다. 그런 이름의 프로그램은 없다. CommandNotFoundException 은 그 결과다.

오류 메시지가 “이 문자열을 실행하려고 했는데 없다” 고 정확히 말하는데, 등호가 있으면 대입문처럼 보여서 잘 안 읽힌다.

처방

두 줄로 나눈다.

$env:NOTION_DB = "1db27661-1676-45f6-95fd-bda8366a9898"
node scripts/push-notion.mjs --check

한 줄로 붙이려면 세미콜론이다.

$env:NOTION_DB = "1db27661-1676-45f6-95fd-bda8366a9898"; node scripts/push-notion.mjs --check

$env: 로 넣은 값은 그 창이 살아 있는 동안 유지된다. 명령을 여러 번 돌릴 거면 한 번만 넣으면 된다. 창을 닫으면 사라진다.

그 자리에서 같이 만나는 것들

같은 명령을 옮기다가 이어서 밟은 것 둘을 적어둔다.

작업 디렉터리. 다음은 이 오류였다.

Error: Cannot find module 'C:\Users\joshu\scripts\push-notion.mjs'

scripts/push-notion.mjs 는 상대경로다. 셸이 홈 디렉터리에 있으면 거기서 찾는다. 오류에 찍힌 경로가 어디서 찾았는지를 그대로 보여준다.

cd W:\Devvvv\Monetization\Gongsu

&& 도 없다. Windows PowerShell 5.1 에는 &&|| 자체가 없다. 붙여 쓰면 파서 오류다.

명령A; if ($?) { 명령B }

무조건 이어서 돌릴 거면 세미콜론으로 충분하다.

왜 헷갈리나

세 문법이 다 비슷하게 생겼는데 셋 다 다르다.

bash        VAR=x cmd      명령 앞에 붙임. 그 명령에만 적용
bash        export VAR=x   이후 세션 전체에 적용
PowerShell  $env:VAR = "x" 이후 세션 전체에 적용. 명령 앞 문법은 없음

PowerShell 에는 bash 의 VAR=x cmd 에 정확히 대응하는 게 없다. 한 명령에만 적용하고 싶으면 넣었다가 지운다. 아니면 그냥 세션 변수로 둔다.

그리고 대부분의 문서와 README 는 bash 예제로 쓰여 있다. Windows 에서 개발하면 이 변환을 계속 하게 된다.

자주 쓰는 변환

옮겨 적을 일이 많아서 정리해뒀다.

bash                    PowerShell
VAR=x cmd               $env:VAR = "x"; cmd
export VAR=x            $env:VAR = "x"
echo $VAR               $env:VAR
cmd1 && cmd2            cmd1; if ($?) { cmd2 }
cat file                Get-Content file
which node              (Get-Command node).Source
2>/dev/null             2>$null

남은 것

PowerShell 7 부터는 &&|| 가 생겼다. 그런데 VAR=x cmd 는 7 에서도 없다. 이 변환은 계속 하게 될 것 같다.

← 블로그 목록