Посилання на файл щодо виконання сценарію


94

У сценарії bash, який я пишу, я використовую sourceдля включення змінної, визначеної у файлі конфігурації. Сценарій, який потрібно виконати, є act.sh, тоді як сценарій, який буде sourced, є act.conf.sh, так що у act.shмене є:

source act.conf.sh

Однак це працює лише під час запуску act.shв каталозі, що його містить, оскільки act.conf.shтам посилається на файл, розміщений під робочим каталогом. Чи є рішення зробити так, щоб він посилався на файл щодо виконуваного сценарію без виклику cd? Дякую.

Відповіді:


116

Дивіться: Запис поширених запитань BASH №28: "Як мені визначити місце розташування мого сценарію? Я хочу прочитати деякі конфігураційні файли з того самого місця."

Будь-яке рішення не буде працювати у 100% випадків:

Важливо усвідомлювати, що в загальному випадку ця проблема не має рішення. Будь-який підхід, про який ви могли чути, і будь-який підхід, який буде детально описаний нижче, має недоліки і спрацює лише у конкретних випадках. Перш за все, спробуйте повністю уникнути проблеми, не залежачи від розташування вашого сценарію!

Якщо вам потрібно написати дуже багаторазовий інструмент, тоді правильний шлях як параметр до вашого сценарію буде найбільш надійним методом .

Якщо припустити, що ваш сценарій буде запускатися лише з певних оболонок, і лише з невеликою гнучкістю, ви, ймовірно, зможете розслабити частину цієї параної. Все ще добре подивитися на ваші варіанти. Існують загальноприйняті моделі, які люди використовують особливо проблематично.

Зокрема, FAQ рекомендує уникати дуже часто використовуваної $0змінної:

Ніщо, що читається, $0ніколи не буде захищеним від кулі, оскільки $0саме по собі ненадійне.

Як альтернативу ви можете використовувати $BASH_SOURCEзамість цього. Щось на зразок цього:

source "${BASH_SOURCE%/*}/act.conf.sh"

Є також деякі застереження щодо цього рішення. Перегляньте сторінку поширених запитань, щоб побачити компроміси між різними рішеннями. Вони, здається, рекомендують cdу поєднанні з $BASH_SOURCEтими випадками, коли це буде працювати для вас, оскільки ви отримуєте зручний стан помилки, коли він не може розширитися належним чином.


1
Дякую, я б використав readlink. Не вдалося визначити ключові слова для пошуку, тому опублікував запитання тут ...
Райан Лі

9
Чи можете ви ввести відповідну інформацію у відповідь на випадок, якщо запитання про bash не працює?
Мерлін Морган-Грем

3
Link рекомендує:, cd "${BASH_SOURCE%/*}" || exitабо read somevar < "${BASH_SOURCE%/*}/etc/somefile", Link категорично не рекомендує $0 "Нічого, що читає 0 доларів, ніколи не буде захищеним від кулі, оскільки саме $ 0 є ненадійним".
ThorSummoner

10
Що і як робить% / * після BASH_SOURCE?
Silicomancer


34

Дивіться це: Bash: Як _найкраще_ включити інші сценарії?

Пропоную скористатися:

source $(dirname $0)/act.conf.sh

8
Це не відповідь, яку ви шукаєте. $0за своєю суттю глючить. Дивіться найкращу та прийняту відповідь чому, або просто прочитайте mywiki.wooledge.org/BashFAQ/028 - короткий обхідний шлях до поставленого запитання приблизно такийsource "${BASH_SOURCE%/*}/act.conf.sh"
Мерлін Морган-Грем

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.