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 에서도 없다. 이 변환은 계속 하게 될 것 같다.