Search code examples
bashsubshell

Why does recursive function go though only one sub directory


I have found the answer to get my code to work but I want to know why it works and my code doesn't

rFunc() {
  for d in *; do
    if [ -d "$d" ]; then
      cd "$d"
      rFunc
    fi
    #Do Something
  done
}

This code will go though only one sub directory but if I use the code from this answer it goes though all sub directories. Why?

(cd -- "$d" && rFunc)

Also, what is the purpose of the --? My code works without it.


Solution

  • (cd -- "$d" && rFunc) performs the cd in subshell and the parent call's current directory is unchanged, whereas your version cd's into $d but doesn't back out of it after rFunc returns.

    To fix yours you should put the subshell back in, or go back up to the parent directory explicitly, e.g. with:

    cd "$d"
    rFunc
    cd ..
    

    or:

    pushd "$d"
    rFunc
    popd