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

명령어 실행의 성공과 실패에 대한 이야기

이전 과정에서 파일이 현재 폴더에 존재하는지 여부를 판단하기 위해 입력한 커맨드가 있습니다
bHMgYHB3ZGAvbXljb2RlLmpzO2VjaG8gJD8=
ls `pwd`/mycode.js;echo $?

이 커맨드인데요
여기서 echo 커맨드는 echo 다음에 오는것을 화면에 출력해주는 커맨드입니다

echo message
라고 하면 message 가 출력됩니다

명령어를 ; 를 기준으로 두 명령어를 한줄에 이어붙여서 실행할 수 있습니다
echo message;echo message

message
message

가 출력됩니다

echo message && echo message
&& 로도 두 명령어를 한줄에 이어붙여서 실행할 수 있습니다.

그러면
echo message;echo message
echo message && echo message

두개의 차이가 없을지에 대해 생각해보고자 합니다.
결론부터 말하면 차이가 있습니다.

차이를 말하기 전에 먼저 알아야 할 것이 있습니다.

명령어를 수행하면 명령어를 처리한 결과라는것이 있기 마련이고
그 수행은 성공하기도 실패하기도 할것입니다
이전 과정에서 npm install -g 하는 과정에서 권한이 부족해서 수행 실패했던 경험이 있습니다

npm install -g; echo message
npm install -g && echo message

이렇게 두 명령어를 이어붙여서 실행할때 
전자의 경우는 설치의 성공실패 결과와 관계없이 echo 명령어로 message 를 출력합니다
후자의 경우는 설치 실패하면 echo 명령어를 실행하지 않아 message 를 출력하지 않습니다

npm install -g; echo $?
이렇게 message 대신 $? 라는것을 출력하는것으로 바꿔서 ; 를 기준으로 두 명령어를 실행하면
설치의 성공실패 여부관계없이 echo $? 를 실행하게 되는데요
이때 처리 실패시 243, 성공시 0을 출력하게됩니다
즉 $? 에는 최근 실행한 명령어의 성공실패여부가 숫자코드로 담기게 되며
0은 성공을 의미하며 0이 아닌 다른 숫자는 실패를 의미하며 각 숫자는 실패의 종류에 따라 달라집니다.

즉 우리가 만든 앱도 처리결과에 따라 성공인지 실패인지의 여부를 알려주도록 만들어야합니다

hello; echo $?
우리의 앱은 이 결과코드에 대한 처리를 안해줬는데 결과코드로 뭐가 나올지 해보죠
성공의 의미인 0 나옵니다
이 상태에서 
hello && echo message
실행하면 echo 가 실행됩니다

IyEvdXNyL2Jpbi9lbnYgbm9kZQpjb25zb2xlLmxvZygnaGVsbG8nKQpwcm9jZXNzLmV4aXQoMTAwKQ==
#!/usr/bin/env node console.log('hello') process.exit(100)

우리 앱의 코드를 이렇게 수정하고 다시 실행해봅시다
echo $? 에 의해 100이 출력되는 것을 볼 수 있습니다
이 상태에서 
hello && echo message
실행하면 echo 가 실행되지 않습니다

IyEvdXNyL2Jpbi9lbnYgbm9kZQpjb25zb2xlLmxvZygnaGVsbG8nKQpwcm9jZXNzLmV4aXQoMCk=
#!/usr/bin/env node console.log('hello') process.exit(0)

우리 앱의 코드를 이렇게 수정하고 다시 실행해봅시다
echo $? 에 의해 0이 출력되는 것을 볼 수 있습니다
이 상태에서 
hello && echo message
실행하면 echo 가 실행됩니다

IyEvdXNyL2Jpbi9lbnYgbm9kZQpjb25zb2xlLmxvZygnaGVsbG8nKQpwcm9jZXNzLmV4aXQoMCkKY29uc29sZS5sb2coJ3dvcmxkJyk=
#!/usr/bin/env node console.log('hello') process.exit(0) console.log('world')

이렇게 수정하고 실행해봅시다.
이러면 process.exit 가 수행된 다음 코드는 수행되지 않습니다


아래의 내용은 필수적이지는 않습니다. 더 자세히 알기를 원한다면 참고해주세요.

IyEvdXNyL2Jpbi9lbnYgbm9kZQpzZXRUaW1lb3V0KCgpID0+IHsKICAgIGNvbnNvbGUubG9nKCdoZWxsbycpCiAgICBwcm9jZXNzLmV4aXQoMCkKfSwgMTAwMCkKc2V0VGltZW91dCgoKSA9PiB7CiAgICBjb25zb2xlLmxvZygnd29ybGQnKQogICAgcHJvY2Vzcy5leGl0KDApCn0sIDUwMCk=
#!/usr/bin/env node setTimeout(() => { console.log('hello') process.exit(0) }, 1000) setTimeout(() => { console.log('world') process.exit(0) }, 500)

이렇게 해보면 어떨까요?
마찬가지로 process.exit 가 수행된 다음코드는 수행되지 않습니다
console.log('hello') 를 찍는것은 이미 500ms 시점에 실행된 process.exit(0) 다음시점이 되는것입니다.

IyEvdXNyL2Jpbi9lbnYgbm9kZQp1bmRlZmluZWQucHJvcDsKY29uc29sZS5sb2coJ2hlbGxvJyk7
#!/usr/bin/env node undefined.prop; console.log('hello');

이런식으로 코드를 바꿔서 실행해봅시다
의도적으로 에러를 낸 코드입니다
undefined 에는 .prop 과같은 식으로 속성에 접근하려는 시도를 하면 TypeError 에러가 나죠
에러가 난 다음의 코드인 console.log('hello') 는 실행되지 못합니다.

hello; echo $?
에러코드는 무엇이 나올지 확인해봅시다.
1 이 나옵니다
1 이 나온다면 실패를 의미하니까
hello && echo message 라고 했을때 echo 는 실행될 수 없겠지요

IyEvdXNyL2Jpbi9lbnYgbm9kZQpzZXRUaW1lb3V0KCgpID0+IHsKICAgIGNvbnNvbGUubG9nKCdoZWxsbycpCiAgICB1bmRlZmluZWQucHJvcDsKfSwgMTAwMCkKc2V0VGltZW91dCgoKSA9PiB7CiAgICBjb25zb2xlLmxvZygnd29ybGQnKQogICAgdW5kZWZpbmVkLnByb3A7Cn0sIDUwMCk=
#!/usr/bin/env node setTimeout(() => { console.log('hello') undefined.prop; }, 1000) setTimeout(() => { console.log('world') undefined.prop; }, 500)

이렇게 코드를 작성해서 실행해봅시다.
이 코드는 위의 코드에서 process.exit(0) 를 undefined.prop; 로만 바꾼 코드이며 500ms 시점에 에러에 의해 코드가 종료되어 마찬가지로 hello 는 찍히지 않습니다
hello; echo $? 로 확인해보면 1 나옵니다
그런데 이 코드는 웹브라우저에서 실행하게되면 world, hello 둘다 출력됩니다.