중복 가능성:
find -exec 호출에서 사용자 정의 함수 실행
다음과 같은 bash 코드가 있다고 가정해 보겠습니다.
!#/bin/bash
function print_echo (){
echo "This is print_echo Function" $1;
}
find ./ -iname "*" -exec print_echo {} \;
모든 -exec
명령에 대해 다음 오류가 발생합니다.
find: `print_echo': No such file or directory
참고: 이 전에 주요 프로그램을 테스트하고 다른 알고리즘으로 프로그램을 해결했지만 여기에 문제가 있습니다.find 명령이 내장 bash 명령 및 함수 이름을 인수로 허용하지 않는 이유는 무엇입니까 -exec
?
답변1
find
왜 기능이 마음에 들지 않는지 모르겠습니다 . 해결책은 다음과 같습니다.
#!/bin/bash
function print_echo (){
echo "This is print_echo Function" $1;
}
for f in $(find . -iname "*")
do
print_echo $f
done
고쳐 쓰다
위 스크립트는 공백이 포함된 파일에서는 작동하지 않습니다. 다음 업데이트의 기능은 다음과 같습니다.
#!/bin/bash
function print_echo (){
echo "This is print_echo Function" $1;
}
find . -iname "*.sh" | \
while read f
do
print_echo "$f"
done
답변2
find
귀하의 함수는 -exec
해당 술어가 문자 그대로 C 라이브러리 exec
함수를 호출하여 프로그램을 시작하므로 명령으로 허용되지 않습니다 . 귀하의 기능은 bash 인터프리터 자체 내에서만 작동합니다. .bashrc
파일에 함수를 정의 하더라도 bash
.
따라서 find 두 번 실행하는 -exec
사용자 정의 명령 시퀀스가 정말로 필요한 경우 이를 별도의 스크립트 파일에 넣거나 다른 해결 방법을 사용하십시오.
답변3
-exec
찾을 인수로 bash 해석기를 시작할 수 있습니다. 함수가 한 번에 하나의 파일 이름만 허용하는 경우 함수를 매번 다시 선언해야 하므로 이 접근 방식은 효율적이지 않습니다. 파일 목록을 허용하고 +
조회에 종결자를 사용하여 셸이 한 번만 생성되도록 설계할 수 있습니다. 여기에 예가 있습니다.
find -exec bash -c '
print_echo() {
printf "This is print_echo Function: %s\n" "$@"
}
print_echo "$@"
' find-bash {} +
이 시점에서는 함수를 선언할 이유가 없습니다. 에서 함수를 실행하면 됩니다 bash -c
.