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
is이기 때문에 이것은 작동하지 않습니다 (그리고 에 전달된 리터럴 인용 문자에도 문제가 있습니다 ). 분할+글로브 연산자를 사용할 수 있습니다.\;
;
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]}
유사 문자 :
나 개행 문자 에 나타날 가능성이 낮은 문자로 바꿀 수 있습니다 .