
저는 디렉토리의 모든 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
. (일부 출처:남자 이름)