공백이 포함된 여러 파일을 컴파일하기 위해 bash 스크립트를 작성하는 방법은 무엇입니까?

공백이 포함된 여러 파일을 컴파일하기 위해 bash 스크립트를 작성하는 방법은 무엇입니까?

이것은 내 코드입니다.

#!/bin/bash
FILES=~/Desktop/cpp/$1/*
mkdir ~/Desktop/cpp/$1o 
for f in $FILES
do
    echo $(basename $f) >>  ~/Desktop/cpp/$1err.log
    g++ '"'$f'"' -std=c++11 -o '"'~/Desktop/cpp/$1o/$(basename "$f").out'"' 2>>  ~/Desktop/cpp/$1err.log
done

"" 부분을 사용하지 않으면 공백 없이 파일에 대해 스크립트가 제대로 작동합니다. 그것들을 사용하면 다음과 같이 말할 것입니다:

usr/bin/ld: cannot open output file /dirname/-
x.out: No such file or directory

공백을 지원하기 위해 파일 이름 주위에 따옴표를 어떻게 추가합니까?

답변1

'"'리터럴 큰따옴표 문자열이 아닌 일반 큰따옴표만 사용하여 변수를 큰따옴표로 인용해야 합니다 "$f". 바라보다bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험모든 피투성이의 세부 사항에 대해.

중복을 줄이기 위해 더 많은 변수를 사용하겠습니다.

이 시도:

#!/usr/bin/env bash
cppdir="$HOME/Desktop/cpp/$1"
if [[ ! -d "$cppdir" ]]; then
    echo "No such directory" >&2
    exit 1
fi

outdir="${cppdir}o"
mkdir -p "$outdir"

errlog="${cppdir}err.log"

for f in "$cppdir"/*; do
    b=$(basename "$f")
    printf '%s\n' "$b" >> "$errlog"
    g++ "$f" -std=c++11 -o "$outdir/$b.out" 2>> "$errlog"
done

답변2

표준 방법은 - 문자를 구분 기호로 사용 하는 find것 입니다.xargsNUL

outdir="$1"o
mkdir "$outdir"
errlog="$1"err.log
touch "$errlog"

find ~/Desktop/cpp/"$1"/ -type f -name '*.cpp' -print0 |
  xargs -0 -I source bash -c "echo source >> $errlog &&
    g++ source -std=c++11 -o source.out 2>> $errlog"

관련 정보