🐧 Как обнаружить внутри Bash скрипта путь, по которому он находится

by itisgood
Когда вы разрабатываете сложные скрипты Bash и начинаете помещать различные их в папку, где один скрипт взаимодействует с другим, например, запуская его,  становится необходимым убедиться, что мы знаем путь, с которого был запущен скрипт, чтобы мы могли запустить другие скрипты с полным путем.
Это важно, потому что первый скрипт мог быть запущен вне этого каталога.

Что мы узнаем из статьи

  • Что такое команда pwd и для чего она нужна
  • Как узнать изнутри Bash-скрипта, по какому пути находится тот же самый скрипт

Что такое pwd?

Команда pwd на Linux при выполнении возвращает рабочий каталог пути.
Где бы мы ни находились в настоящее время и по какому пути ранее переходили (или были помещены в него нашей операционной системой, как, например, когда мы открываем командную строку/терминал), будет текущим путем,  когда мы выполним pwd.
$ cd /
$ pwd
/
$ cd /home
$ pwd
/home

Не совсем. Представьте себе следующую ситуацию:

$ pwd 
/home/roel
$ cd ..
$ ./roel/mypath.sh 
/home
В то время как команда pwd внутри нашего скрипта mypath.sh работает правильно, здесь возникает проблема: pwd вернул путь, по которому мы сейчас находимся, а именно /home, тогда как скрипт фактически хранится в каталоге /home/roel!
Помните название статьи; ищем путь, в котором хранится скрипт! Итак, как мы можем это найти?

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

$ cd -
/home/roel
$ touch 'mypath2.sh'
$ echo '#!/bin/bash' >> mypath2.sh
$ echo 'MYPATH="$(cd "$(dirname $0)" && pwd)"' >> mypath2.sh 
$ echo 'echo "${MYPATH}"' >> mypath2.sh
$ chmod +x mypath2.sh 
Здесь мы определили вторичный скрипт с именем mypath2.sh.
В него мы помещаем небольшой специальный код ($ (cd “$ (dirname $ 0)”; && pwd)), который найдет путь, по которому находится скрипт (путем перехода в его каталог на основе переменной $0 (которая является скриптом так, как мы его назвали, т. е. используя потенциальный относительный или полностью определенный путь) и запрашивая для него имя каталога (по ссылке; обратите внимание, что он все еще может быть относительным путем, если скрипт был запущен с использованием относительного пути), а затем переходя в него (через cd), а затем запрашивая pwd (рабочий каталог пути) для этого же, давая нам полный путь.

You may also like

Leave a Comment