Ответ 1

Для относительного пути (т.е. прямого эквивалента Windows '%~dp0):

MY_PATH="`dirname \"$0\"`"
echo "$MY_PATH"

Для абсолютного, нормализованного пути:

MY_PATH="`dirname \"$0\"`"              # relative
MY_PATH="`( cd \"$MY_PATH\" && pwd )`"  # absolutized and normalized
if [ -z "$MY_PATH" ] ; then
  # error; for some reason, the path is not accessible
  # to the script (e.g. permissions re-evaled after suid)
  exit 1  # fail
fi
echo "$MY_PATH"

Ответ 2

Предполагая, что вы вводите полный путь к bash script, используйте $0 и dirname, например:

#!/bin/bash
echo "$0"
dirname "$0"

Пример вывода:

$ /a/b/c/myScript.bash
/a/b/c/myScript.bash
/a/b/c

При необходимости добавьте результаты переменной $PWD в относительный путь.

EDIT: добавлены кавычки для обработки символов пробела.

Ответ 3

Добавил Стефан ЧАЗЕЛАС на c.u.s. Предполагая оболочку POSIX:

prg=$0
if [ ! -e "$prg" ]; then
  case $prg in
    (*/*) exit 1;;
    (*) prg=$(command -v -- "$prg") || exit;;
  esac
fi
dir=$(
  cd -P -- "$(dirname -- "$prg")" && pwd -P
) || exit
prg=$dir/$(basename -- "$prg") || exit 

printf '%s\n' "$prg"

Ответ 4

echo Running from `dirname $0`

Ответ 5

Код Влада перевыполнен. Должно быть:

MY_PATH=`dirname "$0"`
MY_PATH=`( cd "$MY_PATH" && pwd )`