[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: bash - executing function in "find" command



On Tue, 2005-07-05 at 18:53 -0400, Paul Smith wrote:
> %% Dexter <dexter2@nextra.sk> writes:
> 
>   d> But I want to use bash function instead of command.
> 
> You can't.
> 
>   d> Problem is not, that command "find" runs in different environment, and
>   d> doesn't know variables and functions from parent shell.
> 
> Yes it is.
> 
>   d> Because i tried:
>   d> A="XXX"
>   d> $find . -exec echo $A \;
>   d> XXX
> 
> That example is not testing the right thing, because $A is expanded by
> your shell before find is invoked.  In order to see if it's really
> working you'd have to escape it so that $A itself is passed to find,
> like this:
> 
>     find . -exec echo '$A' \;
>     $A
>     $A
>     $A
> 
> etc.
> 
>   d> And I also tried:
>   d> export -f functionname(){
>   d> .....
>   d> }
> 
>   d> Somebody has a idea how to run function there?
> 
> You can't.
> 
> The problem is find -exec isn't running a shell at all; it's running
> that command directly by using fork/exec.  Shell operations don't work
> there.
> 
> Your only possibility of using a shell script is to run a shell as the
> exec command, something like:
> 
>     find . -exec /bin/bash -c "your script here" \;
> 
> You'll need to check the bash man page to make sure that the function
> definition is put into the right file so that it's read when the shell
> starts this way (this is a non-interactive, non-login shell).
> 
> 
> Far simpler is to just write a shell script instead of using a function,
> or even use a different method of scripting; maybe something like:
> 
>     find . | while read file; do <do something with $file>; done

This line do, what i need. 

> 
> -- 
> -------------------------------------------------------------------------------
>  Paul D. Smith <psmith@nortel.com>           HASMAT--HA Software Mthds & Tools
>  "Please remain calm...I may be mad, but I am a professional." --Mad Scientist
> -------------------------------------------------------------------------------
>    These are my opinions---Nortel Networks takes no responsibility for them.
> 
> 


I tried before something like: 

F=$(find .);for I in $F;do <do something with $I>; done

But, if there were spaces in files names, it broke file name on parts.
That is why I tried to call function from "find" command.
Thanks for help
    Dexter




Reply to: