foo() {
if [[ something ]]; then
echo "The foo function was called directly."
else
echo "The foo function was invoked via command substitution."
fi
}
Прямой вызов foo:
foo
Функция foo была вызвана напрямую.
Вызов foo с помощью подстановки команд:
a=$(foo) || exit 1
echo "${a}"
Функция foo была вызвана с помощью подстановки команд
Есть ли способ сделать это?
Я считаю, что один тест, который вы могли бы использовать, это
if [[ $BASHPID -eq $$ ]]; then
echo was called directly
else
echo was called in a subshell
fi
Специальное значение $$
будет идентификатором процесса оболочки, выполняющей сценарий. Это не изменится в подоболочках (, одной из которых является подстановка команд ).
Специальное значение $BASHPID
будет идентификатором процесса оболочки, выполняющей текущий код. Это значение изменится внутри подоболочки.
Следовательно, если они различны, функция вызывается в подоболочке. Насколько я знаю, вы не можете знать, является ли эта подоболочка подстановкой команд или какой-то другой подоболочкой.
Вы также можете использовать
if [[ $BASH_SUBSHELL -eq 0 ]]; then
echo was called directly
else
echo was called in a subshell
fi
для того же эффекта в показанном коде.
Переменная BASH_SUBSHELL
увеличивается с нуля для каждого дополнительного уровня вложенных подоболочек.