이것은 내 코드입니다.
#!/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
것 입니다.xargs
NUL
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"