Today_I_Learned

Shell로 BOJ VSCode Java 설정 자동화하기 (Mac 기준)

CONCAT 2024. 1. 17. 17:45
728x90

요새 특강 때문에 PS를 반복으로 하고 있다. PS용으로는 Eclipse와 IntelliJ는 좀 무거운 느낌이라서 VScode로 진행 중이다.

근데 이게 계속 하다보니 번거롭고 귀찮다. 그런데 또 나는 개발자다. 그러하니 자동화하자.

VScode는 .vscode/launch.json 에서 실행/디버깅 설정을 관리한다. 문제를 풀기 위한 기본 폴더 + input.txt를 만들어주면서 동시에 해당 경로로 실행 설정을 가장 top으로 잡아주는 걸로 구현

Repository (폴더 구조)

 

GitHub - TomAlgorismus/snippet: 코드 조각

코드 조각. Contribute to TomAlgorismus/snippet development by creating an account on GitHub.

github.com

shell 메시지
바로 이렇게 나오진 않고 shift + alt + f 로 포맷팅 한 번은 해줘야 함
얘도 이렇게 서식이 깔끔하게 나오진 않음. 역시나 포맷팅 필요

sample.txt

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        sc.close();
    }
}

boj.sh

# 문제 번호 INPUT
echo "백준 문제 번호: "
read problem_number
echo "백준 문제 번호 확인: $problem_number"
problem_name="boj$problem_number"
# 폴더 생성
full_path="$problem_name/src/$problem_name"
echo "폴더 생성 : $full_path"
mkdir -p -v $full_path
# 메인 파일 생성
echo "메인 파일 생성 : $full_path/Main.java"
echo "package $problem_name;" > $full_path/Main.java
echo "// https://www.acmicpc.net/problem/$problem_number" >> $full_path/Main.java
i=1
while read line || [ -n "$line" ] ; do
  echo $line >> $full_path/Main.java
  ((i+=1))
done < sample.txt
# 입력 파일 생성
echo "입력 파일 생성 : $full_path/input.txt"
touch $full_path/input.txt
# vscode 설정
echo "vscode launch.json 설정"
sed -i '' "3a\\
{\"type\": \"java\",\\
\"name\": \"$problem_name\",\\
\"request\": \"launch\",\\
\"mainClass\": \"$problem_name.Main\",\\
\"args\": [\"<\",\"$full_path/input.txt\"]},"\
 .vscode/launch.json
# 완료
echo "생성 완료"
  1. 문제 번호 입력 및 출력
    • echo "백준 문제 번호: ": 사용자에게 백준 문제 번호를 입력하라는 메시지를 출력
    • read problem_number: 사용자로부터 입력받은 값을 problem_number 변수에 저장
    • echo "백준 문제 번호 확인: $problem_number": 입력받은 문제 번호를 화면에 출력하여 확인
  2. 폴더 생성
    • problem_name="boj$problem_number": problem_number에 입력받은 문제 번호를 이용해 problem_name 변수를 설정
    • full_path="$problem_name/src/$problem_name": Java 소스 코드를 저장할 경로를 full_path 변수에 설정
    • mkdir -p -v $full_path: -p 옵션은 중간에 없는 디렉토리도 함께 생성하고, -v 옵션은 생성 과정을 화면에 보여줌
  3. 메인 파일 생성 : Main.java 파일에 패키지 선언과 문제 링크 주석을 추가
    • echo "package $problem_name;" > $full_path/Main.java: Main.java 파일을 생성하고, 파일의 첫 줄에 패키지 선언을 추가.
    • echo "// https://www.acmicpc.net/problem/$problem_number" >> $full_path/Main.java: 기존에 존재하던 내용 다음 줄에 백준 문제 링크를 주석으로 추가.
    • while read line || [ -n "$line" ]; do ... done < sample.txt: sample.txt 파일에서 한 줄씩 읽어 Main.java에 추가합니다. 빈 줄이 있어도 무시하지 않음.
  4. 입력 파일 생성
    • touch $full_path/input.txt: 테스트 입력을 위한 input.txt 파일을 생성
  5. VSCode 설정 : VSCode의 디버깅 구성에 Java 프로그램 실행을 위한 설정을 추가
    • sed -i '' "3a\\... .vscode/launch.json: sed 명령어를 사용해 .vscode/launch.json 파일을 수정
    • sed 명령어는 스트림 편집기로, 텍스트 파일의 내용을 편집하는 데. 사용.
      • sed 명령어의 기본 구조는 sed [옵션] '명령어' 파일명
      • -i 옵션
        • 'in-place'의 약어로, 파일을 직접 수정하도록 지시합니다. 즉, sed가 표준 출력으로 결과를 보내는 대신 파일 내용을 직접 변경합니다.
        • macOS나 BSD 계열의 UNIX에서는 -i 옵션 뒤에 백업 확장자를 지정해야 할 수도 있습니다. 예를 들어, -i '' (빈 문자열)은 백업 파일을 생성하지 않고 파일을 직접 수정합니다.
      • 명령어 부분
        • sed의 명령어 부분은 다양한 편집 작업을 수행할 수 있는 스크립트. 여기에서는 3a\ 명령어를 사용.
        • 3a\는 '3번째 줄 뒤에 추가(append)'하는 명령입니다. 즉, 파일의 세 번째 줄 다음에 새로운 내용을 추가하라는 의미입니다.
        • 이어지는 내용({\"type\": \"java\", ... \"<\",\"$full_path/input.txt\"]},)은 추가할 텍스트.
      • 파일명
        • .vscode/launch.json은 편집할 파일의 이름. 여기서는 VSCode의 디버깅 설정 파일.
      • 요약하자면, sed -i '' "3a\\... .vscode/launch.json 명령어는 .vscode/launch.json 파일을 직접 수정하여, 파일의 세 번째 줄 다음에 새로운 내용을 추가하는 것을 의미
  6. 완료 메시지 출력
    • echo "생성 완료": 스크립트의 모든 과정이 완료되었음을 알리는 메시지를 출력