Bir işlevde yerel olarak Bash Scripting yankısı


14

Bash komut dosyalarında değişkenlerimi yapabildiğim her yerde işlevlere yerel tutmaya ve sonra ihtiyacım olanı feryat gibi işlevlerden geçirmeye çalışıyorum

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"   # return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

Ancak, fonksiyonun kendi echos'unu dahil ederken bunu yapmak mümkün mü, böylece fonksiyonun çıktısı için kendi mesajları varsa, bunları bir değişkente yakalamak zorunda kalmam

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now"   # do not return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"                         # should only echo 'value'

1
Hey neden hepiniz eski POSIX olmayan function foo()sözdizimini kullanıyorsunuz? 9 daha az tuşla daha iyi POSIX uyumluluğu elde edebilirsiniz.
Arthur2e5

2
Bu sözdizimi bana daha tanıdık geliyor
TheLovelySausage

1
@ Arthur2e5 öncelikle kodda arama yaparken "[a-zA-Z0-9] + \ (\) \ {" yerine "fonksiyon" yazmanın daha kolay olması nedeniyle
Alex Jansen

Yanıtlar:


18

Doğru çıkış akışını yakalarsanız işlev tarafından yazdırılan her şey yakalanabilir. Bu nedenle, bir şeyi yazdırmanın ve diğer çıktıları kaydetmenin en kolay yolu, gereksiz çıktıyı standart hataya yönlendirmektir:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"
    echo "This function is done now" >&2
}

Başka bir olasılık, günlük mesajlarını doğrudan yazdırmak yerine bir dosyaya oturum açmaktır, örneğin, böyle bir şey kullanarak:

log() {
    printf '%s\n' "$@" > my.log
}

Bununla birlikte, Bash fonksiyonları değişken döndüremez . Tek gerçek "dönüş" değeri çıkış kodudur. Bu nedenle ( ve daha birçokları ), güvenilir günlük kaydı, dönüş değerleri, istisna işleme ve daha fazlasını istiyorsanız, Python, Ruby veya Java gibi farklı bir dil kullanmak istersiniz.


6

Standart hata hakkında bilgi mesajları sunabilirsiniz:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now" > /dev/stderr  # goes to the screen
}

Diğer bazı öneriler bu Linux Journal makalesinde bulunmaktadır : global değişkenleri kullanın (tercih etmediğinizi belirttiğiniz) veya sonucu döndürmek için değişkenin adını iletin.


/dev/stderrfd 2'yi gösterir ve yine de &>blahveya ile yönlendirilebilir 2>blah. /dev/ttybelki daha iyi.
Arthur2e5
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.