выбор между $0 и bash SOURCE



Как выбрать между "" и "${BASH_SOURCE[0]}"



Это описание от GNU мне это не очень помогло.



    BASH_SOURCE

An array variable whose members are the source filenames where the
corresponding shell function names in the FUNCNAME array variable are
defined. The shell function ${FUNCNAME[$i]} is defined in the file
${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}
544   1  

1 ответ:

${BASH_SOURCE[0]} (или, проще говоря, $BASH_SOURCE[1] ) содержит (потенциально относительный) путь содержащего скрипта в все сценарии вызова, особенно когда сценарий источников, что не относится к .

кроме того, как Чарльз Даффи указывает можно использовать произвольные значение вызывающего абонента.
С другой стороны, $BASH_SOURCEможете будет пусто, если именованный файл не задействован; например:
echo 'echo "[$BASH_SOURCE]"' | bash

следующий пример иллюстрирует это:

скрипт foo:

#!/usr/bin/env bash
echo "[] vs. [${BASH_SOURCE[0]}]"

$ bash ./foo
[./foo] vs. [./foo]

$ . ./foo
[bash] vs. [./foo]

является частью спецификации оболочки POSIX, тогда как BASH_SOURCE, как следует из названия, является специфичным для Bash.


[1] опционное значение: ${BASH_SOURCE[0]} и $BASH_SOURCE:

Bash позволяет ссылаться на элемент 0 из массив переменная с помощью скаляр Примечание: вместо того, чтобы писать ${arr[0]} можно писать $arr; другими словами: если вы ссылаетесь на переменную как будто это скаляр, вы получаете элемент по индексу 0.

использование этой функции скрывает тот факт, что $arr - это массив, который является, почему популярны оболочки-код Линтер shellcheck.net выдает следующее предупреждение (на момент написания этой статьи):

SC2128: расширение массива без индекса дает только первый элемент.

на стороне Примечание: хотя это предупреждение полезно, оно может быть более точным, потому что вы не обязательно получите первый элемент: это конкретно элемент в индексе 0 это возвращается, так что если первый элемент имеет более высокий индекс-что возможно в Bash - вы получите пустую строку; попробуйте 'a[1]='hi'; echo "$a"'.
(Напротив, zsh, либо ренегат, действительно тут возвращает первый элемент, независимо от его индекса).

вы можете отказаться от этой функции из-за ее неясности, но она работает предсказуемо и, прагматически говоря, вам редко, если вообще когда-либо, понадобится доступ к индексам другое чем 0 массива переменной ${BASH_SOURCE[@]}.

Comments

    Ничего не найдено.