---
name: "redo-whichdo"
section: "1"
platform: "linux"
package: "redo-python"
version: "0.42.d-6"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/redo-whichdo"
---

# redo-whichdo(1)

show redo's search path for a .do file

## NAME

redo-whichdo - show redo's search path for a .do file

## SYNOPSIS

redo-whichdo \<target\>

## DESCRIPTION

[**redo**(1)](/redo/1.md) and [**redo-ifchange**(1)](/redo-ifchange/1.md) build their targets by executing a ".do file" script with appropriate arguments.  .do files are searched starting from the directory containing the target, and if not found there, up the directory tree until a match is found.

To help debugging your scripts when redo is using an unexpected .do file, or to write advanced scripts that "proxy" from one .do file to another, you can use **redo-whichdo** to see the exact search path that **redo** uses.

The output format lists potential .do files, one per line, in order of preference, separated by newline characters, and stopping once a matching .do file has been found.  If the return code is zero, the last line is a .do file that actually exists; otherwise the entire search path has been exhausted (and printed).

## EXAMPLE

Here's a typical search path for a source file (**x/y/a.b.o**).  Because the filename contains two dots (.), at each level of the hierarchy, **redo** needs to search **default.b.o.do**, **default.o.do**, and **default.do**. \`\`\`sh $ redo-whichdo x/y/a.b.o; echo $?

```

```

    x/y/a.b.o.do\
     x/y/default.b.o.do\
     x/y/default.o.do\
     x/y/default.do\
     x/default.b.o.do\
     x/default.o.do\
     x/default.do\
     default.b.o.do\
     default.o.do\
     0

**\`\`** **You might use**redo-whichdo**to delegate from one .do script to another,**  **using code like the following.  This gets a little tricky because not only** **are you finding a new .do file, but you have**cd**to the .do file** **directory and adjust**$1**and**$2\` appropriately.

```

```

    ofile=$PWD/$3\
     x1=$1\
     cd "$SRCDIR"\
     redo-whichdo "$x1" \| {\
         ifcreate=\
         while read dopath; do\
             if \[ ! -e "$dopath" \]; then\
                 ifcreate="$ifcreate $dopath"\
             else\
                 redo-ifcreate $ifcreate\
                 redo-ifchange "$dopath"

                dofile=${dopath##\*/}\
                 dodir=${dopath%$dofile}

                \# Create updated $1 and $2 for the new .do file\
                 x1\_rel=${x1#$dodir}\
                 ext=${dofile##\*default}\
                 if \[ "$ext" != "$dofile" \]; then\
                     ext=${ext%.do}\
                 else\
                     ext=''\
                 fi\
                 x2\_rel=${x1#$dodir}\
                 x2\_rel=${x2\_rel%$ext}

                cd "$dodir"

                set -- "$x1\_rel" "$x2\_rel" "$ofile"\
                 . "./$dofile"\
                 exit\
             fi\
         done\
         exit 3\
     }

## REDO

Part of the [**redo**(1)](/redo/1.md) suite.

## CREDITS

The original concept for **redo** was created by D. J. Bernstein and documented on his web site (http://cr.yp.to/redo.html).  This independent implementation was created by Avery Pennarun and you can find its source code at http://github.com/apenwarr/redo.

## SEE ALSO

[**redo**(1)](/redo/1.md), [**redo-ifchange**(1)](/redo-ifchange/1.md), [**redo-ifcreate**(1)](/redo-ifcreate/1.md)

## AUTHOR

Avery Pennarun \<apenwarr@gmail.com\>
