$ cat foo #!/usr/bin/env bash set -e echo -n 'echo "$0": ' echo "$0" echo -n 'echo "$(dirname $(realpath $0))": ' echo "$(dirname $(realpath $0))" echo -n 'echo "$(dirname "$(realpath "$0")")": ' echo "$(dirname "$(realpath "$0")")" echo -n 'echo "$(dirname "$(realpath -- "$0")")": ' echo "$(dirname "$(realpath -- "$0")")" $ foo echo "$0": /home/sjl/bin/foo echo "$(dirname $(realpath $0))": /home/sjl/bin echo "$(dirname "$(realpath "$0")")": /home/sjl/bin echo "$(dirname "$(realpath -- "$0")")": /home/sjl/bin $ ./foo echo "$0": ./foo echo "$(dirname $(realpath $0))": /home/sjl/bin echo "$(dirname "$(realpath "$0")")": /home/sjl/bin echo "$(dirname "$(realpath -- "$0")")": /home/sjl/bin $ bash foo echo "$0": foo echo "$(dirname $(realpath $0))": /home/sjl/bin echo "$(dirname "$(realpath "$0")")": /home/sjl/bin echo "$(dirname "$(realpath -- "$0")")": /home/sjl/bin $ mv foo 'foo bar' $ 'foo bar' echo "$0": /home/sjl/bin/foo bar echo "$(dirname $(realpath $0))": /home/sjl/bin /home/sjl/bin echo "$(dirname "$(realpath "$0")")": /home/sjl/bin echo "$(dirname "$(realpath -- "$0")")": /home/sjl/bin $ ./'foo bar' echo "$0": ./foo bar echo "$(dirname $(realpath $0))": /home/sjl/bin /home/sjl/bin echo "$(dirname "$(realpath "$0")")": /home/sjl/bin echo "$(dirname "$(realpath -- "$0")")": /home/sjl/bin $ bash 'foo bar' echo "$0": foo bar echo "$(dirname $(realpath $0))": /home/sjl/bin /home/sjl/bin echo "$(dirname "$(realpath "$0")")": /home/sjl/bin echo "$(dirname "$(realpath -- "$0")")": /home/sjl/bin $ mv 'foo bar' -- --help $ --help echo "$0": /home/sjl/bin/--help echo "$(dirname $(realpath $0))": /home/sjl/bin echo "$(dirname "$(realpath "$0")")": /home/sjl/bin echo "$(dirname "$(realpath -- "$0")")": /home/sjl/bin $ ./--help echo "$0": ./--help echo "$(dirname $(realpath $0))": /home/sjl/bin echo "$(dirname "$(realpath "$0")")": /home/sjl/bin echo "$(dirname "$(realpath -- "$0")")": /home/sjl/bin $ bash -- --help echo "$0": --help echo "$(dirname $(realpath $0))": dirname: invalid option -- 'e' Try 'dirname --help' for more information. echo "$(dirname "$(realpath "$0")")": Usage: realpath [OPTION]... FILE... Print the resolved absolute file name; all but the last component must exist -e, --canonicalize-existing all components of the path must exist -m, --canonicalize-missing no path components need exist or be a directory -L, --logical resolve '..' components before symlinks -P, --physical resolve symlinks as encountered (default) -q, --quiet suppress most error messages --relative-to=DIR print the resolved path relative to DIR --relative-base=DIR print absolute paths unless paths below DIR -s, --strip, --no-symlinks don't expand symlinks -z, --zero end each output line with NUL, not newline --help display this help and exit --version output version information and exit GNU coreutils online help: Full documentation at: