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

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 была вызвана с помощью подстановки команд

Есть ли способ сделать это?

4
24.06.2020, 16:50
1 ответ

Я считаю, что один тест, который вы могли бы использовать, это

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увеличивается с нуля для каждого дополнительного уровня вложенных подоболочек.

7
18.03.2021, 23:24

Теги

Похожие вопросы