Задать вопрос

Как сделать путь в bash-скрипте относительным места запуска?

Есть следующая иерархия директорий:

~/AAA
~/ААА/bash
~/AAA/site

~/BBB
~/BBB/bash
~/BBB/site

--//--

~/NNN
~/NNN/bash
~/NNN/site


Внутри директории bash/ всегда лежат файлы с расширением .sh.

Чаще всего я нахожусь в директории site/.

Я хочу запускать скрипты алиасом. Сделал ~/.bash_aliases. Прописал так:
alias get1="bash ../bash/111.sh"
alias get2="bash ../bash/222.sh"
alias getN="bash ../bash/NNN.sh"


Первая проблема. Внутри каждого скрипта есть файл с переменными.
Я подключаю его так:
. ./variables.sh

Но при запуске алиаса, например get1, я получаю сообщение об ошибке: variables.sh: No such file or directory. Я конечно могу выставить абсолютный путь. Но можно ли сделать в таком случае код универсальным, чтобы в каждом отдельном файле не прописывать абсолютный путь?

Второй вопрос. А нельзя ли сделать путь внутри алиаса таким, чтобы находясь в любой поддириктории корневой директории, например в ~/BBB, или в ~/BBB/bash, алиас срабатывал верно?

То есть если я нахожусь внутри ~/BBB, не важно на какой глубине, скрипт из ~/BBB/bash/ отзывался на команду?

Далее, если бы я копировал bash/ в новую директорию ~/CCC/, скрипты бы работали автоматом.

Если можно такое организовать, куда копать? Что искать?
  • Вопрос задан
  • 118 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
hint000
@hint000
у админа три руки
Внутри каждого скрипта есть файл с переменными.
Я подключаю его так:
. ./variables.sh

Но при запуске алиаса, например get1, я получаю сообщение об ошибке: variables.sh: No such file or directory.
Сменяйте рабочий каталог на тот, из которого запускается скрипт.
cd $(dirname $(realpath $0))
./variables.sh


А нельзя ли сделать путь внутри алиаса таким, чтобы находясь в любой поддириктории корневой директории, например в ~/BBB, или в ~/BBB/bash, алиас срабатывал верно?
В алиасе пропишите абсолютный путь. Скрипты будут универсальные, алиасы не универсальные.
Либо напишите один скрипт, который будет запускать любые по параметру:
вместо get1 будете вызывать get 1
а внутри
[ -d ~/$1/bash ] || (echo "нет каталога"; exit 1)
[ -f ~/$1/bash/$1.sh ] || (echo "нет скрипта"; exit 2)
echo "запускаю"
~/$1/bash/$1.sh
т.е. по get 123 будет запущено ~/123/bash/123.sh
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
пользуйся dirname относительно $0, чтобы определить где находится скрипт
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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