При записи сценария удара, как я получаю полный путь местоположения текущего файла?

Предположим, что мне назвали файл удара myBash.bash. Это находится в:

/myDirect/myFolder/myBash.bash

Теперь я хочу использовать строку /myDirect/myFolder (местоположение myBash.bash) в сценарии. Существует ли команда, которую я могу использовать для нахождения этого местоположения?

Править: Идея состоит в том, что я хочу установить папку zip с кодом, который может быть запущен сценарием удара в том zip-файле. Я знаю относительные пути к файлам кода в том zip-файле, но не полные пути, и мне нужны они. Один путь был бы к твердому коду в пути или потребовал бы, чтобы путь файла был дан как переменная. Однако я нашел бы это легче, если бы для файла удара было возможно выяснить, где это самостоятельно, и затем создайте соответствующие тракты в другой файл от его знания структуры zip-файла.

11
задан 17 March 2017 в 02:44

4 ответа

Можно получить полный путь как:

realpath "$0"

И, как указано Serg можно использовать dirname разделять имя файла как это

dirname "$(realpath $0)"

или еще лучше предотвратить неловкое заключение в кавычки и разделение слова с трудными именами файлов:

temp=$( realpath "$0"  ) && dirname "$temp"

Намного лучше, чем моя более ранняя идея, которая должна была проанализировать его (я знал, будет лучший путь!)

realpath "$0" | sed 's|\(.*\)/.*|\1|'

Примечания

  • realpath возвращает фактический путь файла
  • $0 этот файл (сценарий)
  • s|old|new| замена old с new
  • \(.*\)/ сохраните любые символы прежде / на потом
  • \1 сохраненная часть
17
ответ дан 23 November 2019 в 03:53

если сценарий находится в Вашем пути, можно использовать что-то как

$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.sh

Править: после чтения комментариев от Serg это могло бы быть универсальным решением, которое работает, является ли сценарий в Вашем пути или нет.

myloc==$(dirname "$(realpath $0)")
dirname "$myloc"
5
ответ дан 23 November 2019 в 03:53

Принятый ответ кажется прекрасным. Вот другой способ сделать это:

cd "$(dirname "$0")"
/bin/pwd

/bin/pwd печатает реальный путь каталога, в противоположность pwd встроенная команда.

4
ответ дан 23 November 2019 в 03:53
wdir="$PWD"; [ "$PWD" = "/" ] && wdir=""
case "$0" in
  /*) scriptdir="${0}";;
  *) scriptdir="$wdir/${0#./}";;
esac
scriptdir="${scriptdir%/*}"
echo "$scriptdir"

Это взято в качестве ссылки от kenorb и andro
Никакой dirname, readlink, realpath, BASH_SOURCE
Все - builtins

0
ответ дан 23 November 2019 в 03:53

Другие вопросы по тегам:

Похожие вопросы: