쉘 스크립트로 코딩 도장 시작하기

곽형조 (KCena)·2021년 1월 2일
2

coding dojo는 무엇인가?

매일 매일 간단한 프로그래밍 문제를 TDD로 풀어보면서 코딩 실력을 키우는 '코딩 도장'이다.

코딩 도장은 코로나가 발생하기 전까지 달랩 멘토링에서 짝 프로그래밍을 하면서 알게 되었다.

아래의 내용은 코드숨에서 트레이너로 계신 홀맨님의 코딩 테스트 훈련 가이드의 환경설정을 간단하게 쉘 스크립트로 작성한 것이다.

코딩 테스트 훈련 가이드

나는 javascript로 문제 풀이와 테스트 주도 개발 훈련을 할 것이기 때문에 javascript 환경 설정을 해야 한다.

mkdir yyyymmdd

cd yyyymmdd

npm init -y

npm i -D jest @types/jest

# .gitignore 파일 생성 후 node_modules 추가
echo "node_modules" > .gitignore

# package.json에서 test script를 jest로 변경 후 아래 명령어 실행
npm test -- --watchAll

이렇게 하면 xxx.test.js 과 같이 test가 들어간 파일에 대해서 테스트를 진행한다. --watchAll 옵션을 통해서 변경사항이 생기면 테스트가 자동으로 수행된다.

매번 코딩 도장을 할 때마다 명령어를 입력하기 귀찮기도 해서 이를 shell script로 한번 작성 해 봤다.

사실 별거 없었다. 명령어 나열하는게 끝이라 ㅎㅎ...😅

무엇을 해야 하는가?

위 명령어를 하나씩 살펴보면 아래와 같다.

  • 오늘의 날짜에 해당하는 폴더 이름을 만든다.
  • 해당 폴더로 이동한다.
  • package.json을 생성한다. -y 옵션을 붙여서 기본값으로 시작한다.
  • .gitignore 파일을 생성하고 node_modules를 추가한다.
  • jest를 설치한다. (@types/jest는 자동완성을 위해 쓴다)
  • package.jsonscripts 에서 testjest로 바꾼다.

쉘 스크립트에서 변수의 경우 공백없는 대입 연산자를 통해 만들 수 있다. 변수 이름은 오늘의 날짜에 해당하는 yyyymmdd 형식으로 만들기 위해 timestamp 값을 사용했다.

FOLDER_NAME=`date "+%Y%m%d"`
# 변수를 사용할 땐 ${FOLDER_NAME} 과 같이 사용

그리고 package.json 파일 내의 문자열을 바꾸기 위해서는 sed 명령어를 사용해야 한다. 역할은 원본 파일에 변형을 주지 않고 단지 출력되는 결과를 변화시켜 보여주는 역할을 하는데, 다양한 옵션을 통해서 명령어를 치환하기도 하고 원본 파일을 변형시킬수도 있다.

만약 파일 내의 어떤 문자열을 치환하고 싶다면 s 옵션을 사용한다.

sed 's/기존 문자열/바꿀 문자열/' test.txt

이렇게 하면 기존 파일의 내용은 변하지 않은 채 쉘에 출력만 된다. 그래서 -i 옵션을 사용해서 실제 변경사항을 파일에 반영할 수 있다.

sed -i 's/기존 문자열/바꿀 문자열/` test.txt

그런데 macOS 에서는 -i 옵션을 달고 명령을 수행하면 undefined label 에러가 발생하는 걸 볼 수 있다. 이는 macOS에서 사용하는 sed가 다른 리눅스에서 사용중인 sed와 다르기 때문이라고 한다.

BSD계열의 소프트웨어를 사용하는 macOS의 sed는 안되고, GNU계열의 sed 명령어는 -i 옵션이 가능하다고 한다.

그래서 GNU 계열의 sed 명령어를 사용하기 위해서는 brew 를 이용해 gnu-sed를 설치해야 한다.

brew install gnu-sed`

이제 gsed 명령을 통해서 사용할 수 있다.

gsed -i 's/기존 문자열/바꿀 문자열/' test.txt

shell script

이를 작성해보면 다음과 같다.

#!/bin/bash

FOLDER_NAME=`date "+%Y%m%d"`

mkdir ${FOLDER_NAME} \
  && cd ${FOLDER_NAME} \
  && npm init -y \
  && echo "node_modules" > .gitignore \
  && npm i -D jest @types/jest \
  && gsed -i 's/echo \\"Error: no test specified\\" && exit 1/jest/' package.json

이를 실행하려면 실행 권한을 부여해야 한다.

# 실행권한 부여
$ sudo chmod +x 쉘 스크립트 이름.sh
# 실행
$ ./쉘 스크립트 이름.sh

sources

0개의 댓글