C 파일을 컴파일하는 쉘 스크립트

C 파일을 컴파일하는 쉘 스크립트

저는 디렉토리의 모든 FILE.c 파일을 FILE.out으로 컴파일하는 쉘 스크립트를 사용했습니다.

나는 그것을 잃어버렸고 그것을 다시 만들려고 노력하고 있는데 다음과 같은 것이 매우 유사하다는 것을 알고 있지만 내가 어디로 잘못 가고 있는지 알 수 없습니다.

#!/usr/bin/env bash

for i in 'ls *.c'
do
    gcc -g3 -o3 $i -o {$i%.}.out
done

답변1

명령을 실행할 필요가 없습니다 ls *.c. Bash는 자동으로 와일드카드 패턴을 확장합니다. 따라서 완전히 절박하고 Makefile을 만들고 싶지 않다면 다음을 수행할 수 있습니다.

#!/usr/bin/env bash

for i in *.c
do
    echo "gcc -g3 -o3 $i -o ${i%.c}.out"
    # gcc -g3 -o3 "$i" -o "${i%.c}.out"
done

다음과 같은 샘플 데이터가 있다고 가정해 보겠습니다.

$ ls -1
a.c
b.c
c.bash
c.c
d.c
e.c

내 스크립트 실행 c.bash:

$ ./c.bash 
gcc -g3 -o3 a.c -o a.out
gcc -g3 -o3 b.c -o b.out
gcc -g3 -o3 c.c -o c.out
gcc -g3 -o3 d.c -o d.out
gcc -g3 -o3 e.c -o e.out

스크립트를 실행하려면 echo위 줄을 주석 처리하고 해당 gcc줄의 주석 처리를 제거합니다.

답변2

귀하의 질문을 구체적으로 살펴보면 "어디에서 잘못되었는지"가 매개변수 확장에 있는 것으로 보입니다. 여기서 출력 파일의 이름을 지정할 때 i 값을 변경하려고 한 것 같습니다.

{$i%.} 

달러 기호를 잘못 보신 것 같아요. 다음을 의미했을 수도 있습니다.

${i%.}

정직하게 말하면 "."만 제거되었을 것입니다. 원본 파일 이름에서 . 반면 "filename.c"는 "filenamec.out"을 생성합니다. 당신은 아마도 다음을 원할 것입니다 :

${i%.*}

그러면 "filename.out"이 생성됩니다. 이 매개변수 확장 구문은 "."으로 시작하는 모든 항목을 욕심 없이 삭제하는 것으로 변환됩니다. 그리고 그 이후. 욕심 많은 삭제의 경우 구문은 다음과 같습니다.

${i%%.*}

이것이 귀하의 코드와 관련되어 귀하의 질문에 더 나은 답변이 되기를 바랍니다.

답변3

for 루프는 의도한 출력 명령이 아닌 for i in 'ls *.c'리터럴 문자열 " "을 반복하고 있습니다 . ls *.c이는 명령 대체 연산자(예: for i in $(ls *.c); do...)를 사용하여 해결할 수 있지만 slm이 지적한 것처럼그의 대답에for-loop에서 쉘 글로빙의 출력을 사용할 수 있으므로 명령이 전혀 필요하지 않습니다. :)

이 전체 문제는 간단한 makefile을 사용하여 더 적절하게 해결할 수도 있습니다.

CC = gcc
CFLAGS = -std=c99 -pedantic -D_XOPEN_SOURCE=600 -Wall -Werror -g
RM = rm -f
SRCS = $(wildcard *.c)
PROGS = $(patsubst %.c,%,$(SRCS))

.PHONY: all clean

all: $(PROGS)

%: %.c
    $(CC) $(CFLAGS) -g3 -o3 -o $@ $<

clean:
    $(RM) $(PROGS)

"Makefile"로 저장하고 make. 를 실행하여 컴파일된 프로그램을 제거(정리)합니다 make clean. (일부 출처:남자 이름)

관련 정보