Encontre funções, comandos e builtins [duplicados]

4

Suponha que eu tenha o seguinte código bash:

!#/bin/bash
function  print_echo (){
    echo "This is print_echo Function" $1;
}
find ./ -iname "*" -exec print_echo {} \;

Para cada comando -exec , recebo o seguinte erro:

find: 'print_echo': No such file or directory

NOTA: Antes disso, testei-o para um programa crítico e resolvi meu programa com outro algoritmo, mas é uma pergunta: Por que o comando find não aceita o comando bash e o nome da função como argumento de -exec ?

    
por PersianGulf 23.01.2013 / 03:51

3 respostas

1

O find não aceita sua função como um comando porque seu predicado -exec chama literalmente a função exec da biblioteca C para iniciar o programa. Sua função está disponível apenas para o próprio intérprete bash. Mesmo que você defina sua função dentro do seu arquivo .bashrc , ela ficará "visível" apenas para o bash .

Então, se você realmente precisa de duas execuções com -exec de alguma seqüência personalizada de comandos, coloque-a em um arquivo de script separado ou use outras soluções alternativas.

    
por 23.01.2013 / 04:56
2

Eu não sei porque find não gosta de função. O trabalho é o seguinte:

#!/bin/bash
function  print_echo (){
    echo "This is print_echo Function" $1;
}

for f in $(find . -iname "*")
do
    print_echo $f
done

Atualizar

O script acima não funciona com arquivos que possuem espaços incorporados. A seguinte atualização faz:

#!/bin/bash
function  print_echo (){
    echo "This is print_echo Function" $1;
}

find . -iname "*.sh" | \
while read f
do
    print_echo "$f"
done
    
por 23.01.2013 / 04:36
1

Você pode iniciar um intérprete bash no argumento -exec de find. Isso não é eficiente se sua função aceitar apenas um nome de arquivo por vez, já que terá que redeclarar a função a cada vez. Você pode projetá-lo para que ele aceite uma lista de arquivos e use o + terminator para localizar, de forma que o shell seja apenas um spanwed. Aqui está um exemplo.

find -exec bash -c '
    print_echo() { 
        printf "This is print_echo Function: %s\n" "$@" 
    }
    print_echo "$@"
    ' find-bash {} +

Neste momento, não há razão para declarar a função. Apenas execute o que a função teria feito dentro do bash -c .

    
por 23.01.2013 / 05:17