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}"
.