NAME¶
chase - chase symbolic links
SYNOPSIS¶
chase [
--verbose |
--from-file |
-f |
--null
|
-0 |
--loop-warn-threshold COUNT |
-w COUNT |
--loop-fail-threshold COUNT |
-l COUNT |
--disable-loop-detection |
-D ]
[
file...]
chase -v |
--version
chase -h |
--help
DESCRIPTION¶
Chase is a small utility that tracks down the name of the actual file
that is truly accessed, when one hits a symbolic link. It chases the link, so
to speak.
In normal operation, you give
chase a name of an existing file. The
program will then show you (or, more accurately, print to the standard output
stream) the name of the real file that the original file referred to. It does
not matter if you give the program the name of a regular file;
chase
will just give you the same name back. You can give the utility the option
--verbose, in order to have it be more verbose in its operation. You
can also give the program a list of files from which it will read the file
names to be chased (see the option
--from-file).
I'll give you a good example of a case where
chase is useful. In a Debian
GNU/Linux system, software installation is handled by the program
dpkg(8). There is a way to query
dpkg(8), which package a file
belongs to. Unfortunately, this does not not grok all symlinks. This is a
problem, since the Debian system uses symbolic links extensively for handling
several flavours of a program (say, XEmacs and GNU Emacs and the versions 19
and 20 of both). Now with
chase, one can determine the real file easily
and then using this result as an argument to
dpkg(8). Observe:
ajk@ugh:~$ dpkg -S `which xemacs20`
dpkg: /usr/bin/xemacs20 not found.
ajk@ugh:~$ dpkg -S `which xemacs20 | xargs chase`
xemacs20-nomule: /usr/bin/xemacs-20.4-nomule
ajk@ugh:~$
When given multiple file names as arguments,
chase will chase every one
of them in order.
OPTIONS¶
The following options are recognized by
chase:
- --verbose
- Chat about what is being done.
- -f, --from-file
- Treat the file names on the command line as sources for
names to be chased. If this option is present, chase will read in
each of the files given on the command line (both a sole dash
"-" and the absence of file names will be taken as meaning the
standard input stream). Each line in the files is taken as a verbatim file
name that will be chased like it had been given on the command line of a
run without this option. There is no means for quoting the newline
character; therefore only file names that do not contain newlines can be
specified via the files. This restriction is lifted by the -0 option,
though. However, literal spaces are preserved and are not interpreted as
special.
- -0, --null
- This option implies the option -f, which reads file names
from a file. The -0 option modifies the behavior -f so that instead of
treating lines in the file as file names, the file names are expected to
be separated by null characters. This allows for specifying file names
with newlines in them with -f.
- -w WCOUNT, --loop-warn-threshold=WCOUNT
- -l LCOUNT, --loop-fail-threshold=LCOUNT
- Set the threshold for warning about a possible symlink loop
(WCOUNT) and for failing because of one (LCOUNT). There are default
values, which you can find out by invoking chase with the argument
--help. Using zero as WCOUNT or LCOUNT disables the check.
- -D, --disable-loop-detection
- Normally chase keeps a record of all symlinks it has
visited when chasing the current file. It uses this record to reliably
detect symlink loops. However, checking the record slows the process a
little (more for long chains of symlinks) and the record requires a small
amount of memory (more for long chains of symlinks), so it may be
desirable in some cases to inhibit this check. This option disables this
loop detection and the associated recording of visited symlinks. When this
option is in effect (assuming no bugs in the related code) chase
runs in constant space and linear time relative to the length of the
symlink chains encountered.
- -h, --help
- Output a usage summary and exit successfully.
- -v, --version
- Show version information and exit successfully.
DIAGNOSTICS¶
The exit status is 0 if and only if all files given in the command lines exist
and none of them are dangling symlinks.
The following messages are emitted by
chase when it suspects or detects a
symlink loop:
- quite many symlink hops, hope we're not looping...
- This means that the chain of symlinks is longer than a
given threshold. This may mean that the chain is infinite (and thus
contains a loop somewhere). The threshold can be specified by using the
--loop-warn-threshold command line option.
- too many symlink hops, giving up...
- This means that the chain of symlinks is longer than a
given threshold. This usually means that the chain is infinite (and thus
contains a loop somewhere). The threshold can be specified by using the
--loop-fail-threshold command line option. If you see this message, it
means that chase has given up on that file.
- symlink loop detected, giving up...
- The symlink chain is looping and therefore there is no
result for the chase. Chase has given up on that file.
Additionally,
Chase emits several error messages under problematic
conditions. They all come from the system libraries, so the program has no
control over the actual wording of the messages. They all follow the format
"program name: file name: error message", where file name is the
name of the offending file or directory.
BUGS¶
Chase may have bugs. If you find them, please report them to
<rotty@debian.org> or preferably via the Debian bugtracking system.
AUTHOR¶
Chase has been written by Antti-Juhani Kaijanaho <gaia@iki.fi> and
is currently maintained by Andreas Rottmann <rotty@debian.org>.
SEE ALSO¶
find(1),
ln(1),
namei(1),
readlink(1),
readlink(2),
symlinks(1)