LINUX.ORG.RU

[bash] [source] Инклюдирование скриптов инклюдирующих скрипты

 ,


0

1

Добрый день. Баш, конечно, не настоящий язык программирования, но тем не менее писать на нём можно. Пускай не руками, но можно. Собственно говоря, хотелось бы выяснить несколько моментов касательно абстрагирования некоторых методов в отдельные, если можно так сказать, библиотеки. Как это делают здоровые и успешные баше-кодеры?

Допустим, есть такая ситуация.

./dir1/file1.sh
./dir1/file2.sh

file1.sh и file2.sh являются разными по смысловому наполнению наборами функций. При этом, file2.sh явно использует file1.sh, то есть внутри file2.sh есть строка

source "./file1.sh"

Теперь, есть совершенное иной файл file.sh, в котором необходимо использовать функции из file2.sh

./anus/file.sh

Обычный инклюд ../dir1/file2.sh не оправдывает надежд, так как второй по вложенности инклюд не находит файла ./file1.sh.

Поэтому встаёт вопрос - на какой стороне вертеть костыли? На принимающей стороне (то есть в file.sh), или же есть какие-то удобные механизмы обработки таких ситуаций в самой библиотеке (то есть в file2.sh)?

Пока я использую нечто следующее

cd "../dir1/"
source "./file2.sh"
cd - 2>&1 > /dev/null

Насколько безопасен и логичен такой способ?

С радостью выслушаю любые советы и размышления. Если вопрос показался кому-то слишком очевидным, спешу заверить - это не издевательства, вопрос вполне искренний. Спасибо.

Ответ на: комментарий от AITap

Видимо, это опечатка. И ты имел в виду строку [code]«$(dirname »$0")«/file1.sh[/code] внутри file2.sh.

Но нет, это не работает, как как $0 это имя запускаемого скрипта. То есть, если запускается ./file.sh из директории anus, то $( dirname ./file.sh ) вернёт ».". А файла ./file2.sh нет.

garmonbozia
() автор топика
Ответ на: комментарий от garmonbozia

Быть может ты ещё хочешь сказать о readlink -f для получения аобсолютного имени файла и так далее. Но это тоже не сработает по очевидным причинам.

Для file2.sh и file.sh текущие директории различаются и в этом вся проблема. Где-то придётся хардкодить понос врооде того, который у меня сейчас уже есть.

Но может быть есть какое-то волшЕбство?

garmonbozia
() автор топика
Ответ на: комментарий от garmonbozia

>Баш, конечно, не настоящий язык программирования

Но может быть есть какое-то волшЕбство?


Пиши абсолютные пути в source'ах.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Удобно, да. Портабельненько.

anonymous
()

Сделай пародию на кодогенерацию. В смысле пройдись по всем «библиотекам» и замени source на содержимое нужных файлов. Всё это — скриптом, о запуске которого напишешь в INSTALL.

Если совсем нечего делать — напиши makefile, собирающий «библиотеку», это несложно.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Может лучше заменить в сорцах относительное имя на абсолютное тогда уж. Зачем файл раздувать?

garmonbozia
() автор топика

Кстати, да. Предложенный способ не работает при запуске из директории, отличной от anus. Молодцово.

garmonbozia
() автор топика
Ответ на: комментарий от garmonbozia

1. lurk('bash source get script file name')
2. первая ссылка -> http://stackoverflow.com/questions/192319/in-the-bash-script-how-do-i-know-th...
3. Поискав в ответах, находим:


With bash >= 3 the following works:

$ ./s
$0 is: ./s
$BASH_SOURCE is: ./s
$ . ./s
$0 is: bash
$BASH_SOURCE is: ./s

$ cat s
#!/bin/bash

printf '$0 is: %s\n$BASH_SOURCE is: %s\n' «$0» «$BASH_SOURCE»

schizoid ★★★
()
Ответ на: комментарий от schizoid

А что даёт информация о том, откуда был засорцирован скрипт?

И да, ты такой молодец, расписал всё по шагам? Типа для меня как для идиота, или тебе так самому проще?

garmonbozia
() автор топика
Ответ на: комментарий от garmonbozia

спешу заверить - это не издевательства

file1.sh

INCLUDE_DIR=$(dirname "$BASH_SOURCE")
source "$INCLUDE_DIR/file2.sh"
...

file.sh

source ./dir1/file1.sh
...

P.S.

cd "../dir1/"
source "./file2.sh"
cd - 2>&1 > /dev/null

man pushd

schizoid ★★★
()
Ответ на: комментарий от schizoid

file1.sh и file2.sh наоборот. А так да, вроде работает.

garmonbozia
() автор топика
Ответ на: комментарий от garmonbozia

Сохраняет предыдущую директорию в стеке.
Командой popd её можно восстановить.
Некий аналог cd -, только вложенность может быть любой, в отличие от.

schizoid ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.