Эта dirname
команда является самой базовой, она просто разбирает путь до имени файла из $0
переменной (имя скрипта):
dirname "$0"
Но, как указал matt b , возвращаемый путь отличается в зависимости от того, как вызывается скрипт. pwd
не выполняет работу, потому что это говорит только о том, что текущий каталог, а не каталог, в котором находится скрипт. Кроме того, если выполняется символическая ссылка на скрипт, вы получите (возможно, относительный) путь к где находится ссылка, а не фактический скрипт.
Некоторые другие упоминали readlink
команду, но в простейшем случае вы можете использовать:
dirname "$(readlink -f "$0")"
readlink
разрешит путь сценария к абсолютному пути от корня файловой системы. Таким образом, любые пути, содержащие одинарные или двойные точки, тильды и / или символические ссылки, будут преобразованы в полный путь.
Вот скрипт, демонстрирующий каждый из них whatdir.sh
:
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename $0`"
echo "dirname: `dirname $0`"
echo "dirname/readlink: $(dirname $(readlink -f $0))"
Запуск этого скрипта в моем домашнем каталоге, используя относительный путь:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
Опять же, но с использованием полного пути к сценарию:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Теперь меняем каталоги:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
И наконец, используя символическую ссылку для выполнения скрипта:
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- и удалить ее без подстановки команды -DIR="${DIR%x}"
.