minishell을 만들면서 정말 1000번은 넘게 make를 치다보니..
이제 make에서 나오는 명령어들도 질려서 보기 싫어졌다..
뭔가 이쁘게 만들 방법이 없을까 고민하다가 progress bar 혹은 spinner를 사용하면 깔끔하고 이쁘게 만들 수 있을 것 같았다.
Makefile에서 Script 실행하기
우선 Makefile에서 Script를 실행하는 방법을 알아보자! 대략 아래와 같은 Makefile이 있다고 생각하자.
NAME = sunashell
...
$(NAME): $(OBJ)
@$(CC) $(CFLAGS) $(INCLUDE) $(SRCS) -o $(NAME)
Makefile
복사
여기서 어떤 문장을 출력하려면 echo 와 같이 shell 구문을 그대로 사용하면 된다.
NAME = sunashell
...
$(NAME): $(OBJ)
@echo "hello world!"
@$(CC) $(CFLAGS) $(INCLUDE) $(SRCS) -o $(NAME)
Makefile
복사
그런데 조금 더 복잡한 출력과 반복문, 조건문 등을 사용하려면 따로 Script파일을 만드는게 좋은데 그렇다면 이렇게 만든 Script 실행파일을 어떻게 Makefile에서 실행시킬 수 있을까?
아래는 스피너 Script파일이다.
i=1
j=0
max=15000
sp="/-\|"
echo -n "SUNASHELL is Ready "
echo -n ' '
while [ $j -lt $max ]
do
printf "\b${sp:i++%${#sp}:1}"
j=$(($j+1))
done
printf "\b✅"
Shell
복사
방법은 아주 간단하다!! 그냥 우리가 bash에서 하는 것처럼 ./a.sh와 같이 해주면 된다!
NAME = sunashell
...
$(NAME): $(OBJ)
@./a.sh
@$(CC) $(CFLAGS) $(INCLUDE) $(SRCS) -o $(NAME)
Makefile
복사
그런데 기대했던 결과가 나오지 않는다 ㅜㅜ echo의 -n 옵션이 정상적으로 작동하지 않았다.
그 이유를 stackoverflow에서 찾을 수 있었다.
Stackoverflow의 답변
어느정도 pc마다 차이가 있을 수 있는 것 같지만 내 경우에는 맥에서 /bin/sh 의 echo를 사용하는데 이 echo는 -n옵션을 지원하지 않아서 일어난 결과인 것 같았다.
그래서 Script를 실행할 default Shell을 지정해 주기로 하였다.
NAME = sunashell
SHELL = bash
...
$(NAME): $(OBJ)
@./a.sh
@$(CC) $(CFLAGS) $(INCLUDE) $(SRCS) -o $(NAME)
Makefile
복사
그러면 이제 정상적으로 실행되는 것을 볼 수 있다!
여러 명령어들을 조합하면 이런 것도 가능하다.