Как получить вывод функции оболочки без разветвления вспомогательной оболочки?

У меня есть следующие функции.

hello () {
        echo "Hello"
}
func () {
        hello
        echo "world"
}

Если я не хочу, чтобы вывод функции hello выводился на печать, но хочу что-то с этим сделать, я хочу зафиксировать вывод в какой-либо переменной. Единственный возможный способ - это форкнуть подоболочку, как показано ниже? Разве это не ненужное создание нового дочернего процесса? Можно ли это оптимизировать?

func () {
        local Var=$(hello)
        echo "${Var/e/E} world"
}
11
задан codeforester 4 March 2018 в 22:56
поделиться

2 ответа

У Вас есть опция изменения эти hello() функция? Если так, затем дайте ему опцию сохранить результат в переменной:

#!/bin/bash

hello() {
  local text="hello"

  if [ ${#1} -ne 0 ]; then
    eval "${1}='${text}'"
  else
    echo "${text}"
  fi
}

func () {
  local var     # Scope extends to called functions.
  hello var
  echo "${var} world"
}

И более компактная версия hello():

hello() {
  local text="hello"
  [ ${#1} -ne 0 ]  && eval "${1}='${text}'" || echo "${text}"
}
1
ответ дан 3 December 2019 в 09:58
поделиться

Это буквально не отвечает на вопрос, но это - жизнеспособный альтернативный подход для некоторых вариантов использования...

Это - вид ответвления от @Andrew Vickers, в котором можно облокотиться eval.

, А не определяют функцию, определяют то, что я назову "макросом" (эквивалент C):

MACRO="local \$var=\"\$val world\""

func()
{ 
    local var="result"; local val="hello"; eval $MACRO; 
    echo $result; 
}
0
ответ дан 3 December 2019 в 09:58
поделиться