find
일부 소스 파일을 복사하는 명령을 작성했습니다 .
find ./lib ./tools -type f -regex '.*\.\(cpp\|c\|h\)$' -exec cp --parents \{\} /tmp/potato \; -print
이것은 잘 작동하지만 선택적으로 후행도 추가하고 싶으 -print
므로 다음과 같이 합니다.
function deploy_source_code {
exec_cmd="find ./lib ./tools -type f -regex '.*\.\(cpp\|c\|h\)$' -exec cp --parents \{\} ${args[destdir]} \;"
if [ "${args[verbose]}" = "true" ]; then
exec_cmd="${exec_cmd} -print"
fi
${exec_cmd}
}
하지만 오류로 인해 실패합니다.
find: missing argument to `-exec'
왜 실패했는지 모르겠으며 조언을 주시면 감사하겠습니다. 미리 감사드립니다!
답변1
배열을 사용하고 이를 간단한 명령에 대한 인수로 실행하십시오.
deploy_source_code() {
exec_cmd=(find ./lib ./tools -type f -regex '.*\.\(cpp\|c\|h\)$'
-exec cp --parents {} "${args[destdir]}" \;)
if [ "${args[verbose]}" = "true" ]; then
exec_cmd+=(-print)
fi
"${exec_cmd[@]}"
}
또는 문자열을 사용하여 이를 쉘 코드로 평가합니다.
deploy_source_code() {
exec_cmd="find ./lib ./tools -type f -regex '.*\.\(cpp\|c\|h\)$' \
-exec cp --parents {} \"\${args[destdir]}\" \;"
if [ "${args[verbose]}" = "true" ]; then
exec_cmd+=" -print"
fi
eval "$exec_cmd"
}
위의 코드에서는 ${args[destdir]}
할당 시 확장되지 않도록 하는 것이 중요합니다. 그렇지 않으면 해당 내용이 eval
쉘 코드로 평가되기 위해 전달될 것이기 때문입니다! 안전하게 사용하기 어려울 수 있습니다 eval
. 특히 연관 배열을 이미 사용하고 있다는 점을 고려하면 배열 접근 방식을 사용하겠습니다.
귀하의 접근 방식에서는 문자열에 Split+glob 연산자를 사용하여 간단한 명령의 인수를 만들었습니다. 의 마지막 인수가 just가 아니기 find
때문에 작동하지 않았습니다 (그리고 에 전달된 리터럴 인용 문자에도 문제가 있을 수 있습니다 ). Split+glob 연산자를 다음과 같이 사용할 수 있습니다.\;
;
find
deploy_source_code() {
exec_cmd="find ./lib ./tools -type f -regex .*\.\(cpp\|c\|h\)$ \
-exec cp --parents {} ${args[destdir]} ;"
if [ "${args[verbose]}" = "true" ]; then
exec_cmd+=" -print"
fi
IFS=" " # split on space
set -f # disable glob
$exec_cmd # invoke the split+glob operator
}
${args[destdir]}
하지만 이는 공백 문자가 포함되어 있으면 작동하지 않음을 의미합니다 . 언제든지 해당 공백을 ${args[destdir]}
like :
또는 newline 에서 발생할 가능성이 적은 문자로 바꿀 수 있습니다 .