У меня есть следующие функции.
hello () {
echo "Hello"
}
func () {
hello
echo "world"
}
Если я не хочу, чтобы вывод функции hello выводился на печать, но хочу что-то с этим сделать, я хочу зафиксировать вывод в какой-либо переменной. Единственный возможный способ - это форкнуть подоболочку, как показано ниже? Разве это не ненужное создание нового дочернего процесса? Можно ли это оптимизировать?
func () {
local Var=$(hello)
echo "${Var/e/E} world"
}
У Вас есть опция изменения эти 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}"
}
Это буквально не отвечает на вопрос, но это - жизнеспособный альтернативный подход для некоторых вариантов использования...
Это - вид ответвления от @Andrew Vickers, в котором можно облокотиться eval
.
, А не определяют функцию, определяют то, что я назову "макросом" (эквивалент C):
MACRO="local \$var=\"\$val world\""
func()
{
local var="result"; local val="hello"; eval $MACRO;
echo $result;
}