함수, 명령 및 내장 기능 찾기

함수, 명령 및 내장 기능 찾기

중복 가능성:
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.

관련 정보