1 Javascript로 CLI기반의 앱을 만들어보기
2 명령어 실행의 성공과 실패에 대한 이야기
3 매개변수에 대해서
4 앱을 좀더 그럴듯 하게 만들기

매개변수에 대해서

CLI 기반의 앱들은 사용할때 매개변수를 넘겨줍니다
예를들어 파일을 묶어주는 앱인 tar 의 경우는
tar cvfpz file.tgz data 와 같은식으로 띄어쓰기를 구분해서 매개변수를 넘겨줍니다
그러면 tar 앱은 전달받은 매개변수를 토대로 일을 처리하죠
코드로 표현해보자면 tar(cvfpz, file.tgz, data) 를 한것과 비슷한 느낌입니다

이제부터 hello 10 5 라고 실행했을때 두 숫자를 곱해주는 앱을 만들어봅시다

IyEvdXNyL2Jpbi9lbnYgbm9kZQpjb25zb2xlLmxvZyhwcm9jZXNzLmFyZ3Yp
#!/usr/bin/env node console.log(process.argv)
먼저 소스코드에 다음과같에 입력하고 hello 10 5 라고 실행해봅시다
process.argv 는 [ '/usr/local/bin/node', '/usr/local/bin/hello', '10', '5' ] 와 같은 모습인 배열임을 알 수 있습니다
배열의 각 요소는 항상 문자열이라는 것도 알아둡시다.
여기까지 보고 이제부터 어떻게 해야할지 아이디어가 떠올랐을수도, 아닐수도 있을것이라 생각합니다.
아니라면 다음을 계속 봅시다

IyEvdXNyL2Jpbi9lbnYgbm9kZQpjb25zb2xlLmxvZyhOdW1iZXIocHJvY2Vzcy5hcmd2WzJdKSAqIE51bWJlcihwcm9jZXNzLmFyZ3ZbM10pKQ==
#!/usr/bin/env node console.log(Number(process.argv[2]) * Number(process.argv[3]))

이렇게 하면 완성입니다
hello 10 5
실행하면 50이 잘 나옵니다
echo $?
해보면 성공을 의미하는 0이 출력되지요

hello 10 
이렇게 숫자를 하나만 입력하면 곱하기를 못하겠지요?
이러면 에러코드를 내어주도록 해봅시다

IyEvdXNyL2Jpbi9lbnYgbm9kZQppZiAocHJvY2Vzcy5hcmd2WzNdID09PSB1bmRlZmluZWQpIHsKICAgIGNvbnNvbGUubG9nKCdUd28gbnVtYmVycyByZXF1aXJlZCcpOwogICAgcHJvY2Vzcy5leGl0KDEpOwp9CmNvbnNvbGUubG9nKE51bWJlcihwcm9jZXNzLmFyZ3ZbMl0pICogTnVtYmVyKHByb2Nlc3MuYXJndlszXSkp
#!/usr/bin/env node if (process.argv[3] === undefined) { console.log('Two numbers required'); process.exit(1); } console.log(Number(process.argv[2]) * Number(process.argv[3]))

이렇게하고 hello 10 실행해봅시다.
echo $?
해보면 1 출력하지요

Two numbers required 라는 메세지에 색을 입혀서 출력해봅시다
package.json 파일이 있는 폴더 안에서 npm install chalk 실행해서 모듈 설치 후 코드에 포함시켜줍니다 (ansi-colors 란것도 있습니다)
nodejs 에서 보통 require('chalk') 해서 불러올 수 있는데 chalk 는 ESM인 이유로 require를 사용할 수 없습니다.
따라서 아래와 같이 package.json 에 "type": "module", 를 지정해줍니다.
ewogICJ0eXBlIjogIm1vZHVsZSIsCiAgIm5hbWUiOiAibWNhcHAiLAogICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBteSBmaXJzdCBDTEkgYXBwIiwKICAibWFpbiI6ICJpbmRleC5qcyIsCiAgInNjcmlwdHMiOiB7CiAgICAidGVzdCI6ICJlY2hvIFwiRXJyb3I6IG5vIHRlc3Qgc3BlY2lmaWVkXCIgJiYgZXhpdCAxIgogIH0sCiAgImF1dGhvciI6ICIiLAogICJsaWNlbnNlIjogIklTQyIsCiAgImJpbiI6eyAiaGVsbG8iOiIuL215Y29kZS5qcyIgIH0KfQ==
{ "type": "module", "name": "mcapp", "version": "1.0.0", "description": "This is my first CLI app", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "bin":{ "hello":"./mycode.js" } }

그리고 소스코드에는 다음과 같이 넣어줍니다

IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgY2hhbGsgZnJvbSAiY2hhbGsiOwppZiAocHJvY2Vzcy5hcmd2WzNdID09PSB1bmRlZmluZWQpIHsKICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQucmVkKCdUd28gbnVtYmVycyByZXF1aXJlZCcpKTsKICAgIHByb2Nlc3MuZXhpdCgxKTsKfQpjb25zb2xlLmxvZyhOdW1iZXIocHJvY2Vzcy5hcmd2WzJdKSAqIE51bWJlcihwcm9jZXNzLmFyZ3ZbM10pKQ==
#!/usr/bin/env node import chalk from "chalk"; if (process.argv[3] === undefined) { console.log(chalk.bold.red('Two numbers required')); process.exit(1); } console.log(Number(process.argv[2]) * Number(process.argv[3]))

이렇게 코드 변경 후 hello 10 실행하면 에러메세지가 붉게 나옵니다

곱하기의 계산은 순식간에 되겠지만 가상으로 프로그레스를 넣어봅시다

IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgY2hhbGsgZnJvbSAiY2hhbGsiOwppbXBvcnQgcmVhZGxpbmUgZnJvbSAicmVhZGxpbmUiOwppZiAocHJvY2Vzcy5hcmd2WzNdID09PSB1bmRlZmluZWQpIHsKICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQucmVkKCdUd28gbnVtYmVycyByZXF1aXJlZCcpKTsKICAgIHByb2Nlc3MuZXhpdCgxKTsKfQooYXN5bmMgKCkgPT4gewogICAgbGV0IHBlcmNlbnQgPSAwOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBwZXJjZW50Kys7CiAgICAgICAgcmVhZGxpbmUuY3Vyc29yVG8ocHJvY2Vzcy5zdGRvdXQsIDApOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGBQcm9ncmVzcyAke2NoYWxrLmJvbGQueWVsbG93KGAke3BlcmNlbnR9YCl9ICVgKTsKICAgICAgICBpZiAocGVyY2VudCA9PT0gMTAwKSBicmVhazsKICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMjApKTsKICAgIH0KICAgIGNvbnNvbGUubG9nKCcnKTsKICAgIGNvbnNvbGUubG9nKGBSZXN1bHQgaXMgJHtjaGFsay5ib2xkLmdyZWVuKE51bWJlcihwcm9jZXNzLmFyZ3ZbMl0pICogTnVtYmVyKHByb2Nlc3MuYXJndlszXSkpfWApOwogICAgcHJvY2Vzcy5leGl0KDApOwp9KSgpOw==
#!/usr/bin/env node import chalk from "chalk"; import readline from "readline"; if (process.argv[3] === undefined) { console.log(chalk.bold.red('Two numbers required')); process.exit(1); } (async () => { let percent = 0; while (true) { percent++; readline.cursorTo(process.stdout, 0); process.stdout.write(`Progress ${chalk.bold.yellow(`${percent}`)} %`); if (percent === 100) break; await new Promise(r => setTimeout(r, 20)); } console.log(''); console.log(`Result is ${chalk.bold.green(Number(process.argv[2]) * Number(process.argv[3]))}`); process.exit(0); })();

이렇게 하고 실행.