definir variável global E usar stdout da função bash

0

Este é o código:

#! /bin/bash

function foo() {
  G1=123
  echo "ReturnVal"
}

RV="$(foo)"
echo "RV=$RV, G1=$G1"  # RV=ReturnVal, G1=

foo >/dev/null
echo "G1=$G1"  # G1=123

Eu quero executar a função, definir a variável global G1 e capturar o stdout da função em uma variável.

A primeira chamada falha ao definir a variável global porque a função está sendo executada em uma subcamada. Mas essa é a maneira canônica de obter stdout em uma variável.

Eu percebo que a segunda chamada para foo () está jogando fora stdout. Escrevê-lo para o console é igualmente inútil para o meu propósito. Mas isso ilustra que a função é capaz de definir a variável global.

Observe que qualquer solução não pode usar um arquivo temporário no sistema de arquivos. A função que estou realmente tentando escrever já está lidando com arquivos temporários e sua limpeza automática; A introdução de outro arquivo temporário não é uma opção.

Existe uma maneira?

    
por MykennaC 07.08.2013 / 01:07

2 respostas

0

Você vem de Java, C ++? Isso não parece nenhum BASH que eu já vi.

#!/bin/bash

myFunction()
{
  echo eval "
  G1=\"123\";
  echo \"My function \$G1\"; "
}

myVar=$(myFunction 2>&1);
source <(myFunction) 2>&1 >/dev/null;
echo "G1: $G1";
eval echo "myVar: $(grep -v eval <($myVar))"

Muito confuso porque não é permitido exportar variáveis de um subprocesso para seu pai.

G1: 123
myVar: My function 123
    
por 07.08.2013 / 02:55
1

Eu mesmo tive esse problema recentemente, mas no meu caso não consegui separar meu código em duas funções separadas, nem poderia prever o nome da variável global que eu definiria.

O seguinte é o que eu criei. A sintaxe de chamada é diferente, mas bastante fácil. Pode requerer um pouco de mexer com escapes de barra invertida, no entanto.

Basicamente, funciona como read , mas ao mesmo tempo define um global ao mesmo tempo.

#!/usr/bin/env bash

function do_your_thing() {
    local name_of_capture_var="${1}"

    global_var="global global global global global"
    normally_sent_to_stdout="stdout stdout stdout stdout"

    eval "${name_of_capture_var}=\"${normally_sent_to_stdout}\""
}


function main() {
    local capture

    do_your_thing capture

    echo "In main():"
    echo "capture: ${capture}"
    echo "global_var: ${global_var}"
    echo
}


main

echo "Outside of main()"
echo "capture: ${capture}"
echo "global_var: ${global_var}"
    
por 13.12.2014 / 14:59