변수를 사용하여 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가 아니기 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 에서 발생할 가능성이 적은 문자로 바꿀 수 있습니다 .

관련 정보