변수를 사용하여 find 명령을 실행하는 중 오류가 발생했습니다.

변수를 사용하여 find 명령을 실행하는 중 오류가 발생했습니다.

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

관련 정보