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 둘다 출력됩니다.