2016-09-02 6 views
2

Недавно я обнаружил, что некоторые скрипты, ссылающиеся на BASH_SOURCE, терпят неудачу, потому что они не определены в моей zshell. Примечание. Мой bash исходит из доморощенного, поэтому, возможно, bash bash изменяет значение по умолчанию BASH_SOURCE.Должно ли bash всегда предоставлять определение BASH_SOURCE, а если нет, то каково наилучшее обходное решение?

  • Проблема: после запуска/bin/bash я обнаружил, что он также не определен в оболочке bash, которую я начал.

У меня есть два вопроса относительно этого вопроса:

  • Вопрос 1: $BASH_SOURCE всегда определяется как поддерживается в любой Баш оболочки? Если это так, я предполагаю, что запущен /bin/bash и не видит BASH_SOURCE, подразумевает ошибку в bash?

  • Вопрос 2: Является ли разумным по умолчанию я должен экспортировать по всему миру для BASH_SOURCE, который не сломает ничего?

+2

Обратите внимание, что ['$ BASH_SOURCE'] (https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html) является массивом, поэтому, чтобы увидеть его содержимое, вы должны проверьте 'printf '% s \ n" "$ {BASH_SOURCE [@]}" '. – fedorqui

+2

Почему вы запускаете скрипт 'bash' с' zsh'? – chepner

ответ

1

BASH_SOURCE - это массив, содержащий исходные имена файлов, в которых определены соответствующие имена функций оболочки в FUNCNAME. FUNCNAME содержит имена всех функций оболочки, которые в настоящее время находятся в стеке вызовов выполнения. Это означает, что BASH_SOURCE специфичен для текущего сеанса.

В общем, вы имеете в вид переменные специфичный для BASH, другие оболочки имеют различную реализацию обработки стеки вызовов и, таким образом, не будут обрабатывать его правильно

При запуске скрипта первой строки #!/bin/bash задает интерпретатор для данного скрипта. Если вы используете bash, вы должны предоставить ванну для установки BASH.

Альтернативно переключитесь на bash и запустите там скрипт. Или запустите его, передав скрипт как аргумент/bin/bash из zsh. Какой бы вы ни предпочитали

+0

Похоже, что вы подразумеваете, что действительно, $ {BASH_SOURCE} всегда должен работать. – jayunit100