global değişkeni ayarlayın VE bash işlevinden stdout kullanın


0

İşte kod:

#! /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

Fonksiyonu çalıştırmak, global G1 değişkenini ayarlamak, VE fonksiyonun stdout'unu bir değişkende yakalamak istiyorum.

İlk çağrı global değişkeni ayarlayamaz çünkü işlev bir alt kabukta çalıştırılır. Ama stdout'u bir değişkene sokmanın kurallı yolu budur.

Foo () 'nin 2. çağrısının stdout'u attığını anlıyorum. Konsola yazmak, benim amacım için eşit derecede anlamsız. Ancak, fonksiyonun global değişkeni ayarlayabildiğini gösterir.

Herhangi bir çözümün dosya sistemindeki geçici bir dosyayı kullanamayacağını unutmayın. Aslında yazmaya çalıştığım işlev zaten geçici dosyalar ve bunların otomatik temizliği ile ilgileniyor; başka bir geçici dosya tanıtımı bir seçenek değildir.

Bir yolu var mı?

Yanıtlar:


0

Java'dan mı geliyorsun, C ++? Bu şimdiye kadar gördüğüm herhangi bir BASH'e benzemiyor.

#!/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))"

Çok dağınık çünkü değişkenleri bir alt işlemden üst öğesine aktarmaya izin verilmiyor.

G1: 123
myVar: My function 123

Cevabınız için teşekkürler. Ne yazık ki, bu çözümü aşıracağım fonksiyon G1 değişkenindeki argümanlarını biriktirir. Böylece, işlevi her seferinde iki kez çağırmak, bunun etrafında çalışmak için istenmeyen bir karmaşıklık katacaktır. Ayrıca, işlev, basit, basit olmayan kullanıcılarımın yararına karmaşıklığı kapsamaya yöneliktir ve arama sözdiziminizi bunlara eklemem. İşe yarayan bir çözümün var, benim için değil. BTW, onlarca yıldır kabuk senaryoları yazıyorum, ne gördüğünüzden emin değilim.
MykennaC

Kullandığım çözüm iki ayrı fonksiyon kullanmaktı. "Satır içi" işlevi genel değişkeni ayarlar ve "subshell" işlevi stdout'ta veri döndürür. Gerçek kullanım durumum, iki şey yapmaya çalışan bir işlevdi: oluşturulan tüm dosya adlarının global bir değişkenini korurken geçici bir dosya adı oluşturun ve döndürün. Her ne kadar yukarıdaki cevabı kullanmasam da, işe yarayan bir şey bulma çabasını takdir ediyorum (ve sorunun zorluğunu onaylıyorum).
MykennaC

1

Son zamanlarda bu sorunu kendi kendime koştum, ancak benim durumumda kodumu iki ayrı işleve ayıramadım, ya da koyacağım global değişkenin adını da tahmin edemedim.

Benim geldiğim şey şu. Çağıran sözdizimi farklı, ama yeterince kolay. Bununla birlikte, ters eğik çizgi kaçışlarıyla biraz karışıklık gerektirebilir.

Temel olarak, readaynı şekilde bir küresel kurarken gibi çalışır .

#!/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}"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.