Bash Scripting สะท้อนอยู่ภายในฟังก์ชัน


13

ในสคริปต์ทุบตีฉันพยายามทำให้ตัวแปรของฉันอยู่ในตัวเครื่องให้สามารถทำงานได้ทุกที่และจากนั้นส่งผ่านสิ่งที่ฉันต้องการจากการทำงานเช่นการร้อง

#!/bin/bash

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

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

แต่มันเป็นไปได้ที่จะทำเช่นนี้ในขณะที่รวมถึง echos ของฟังก์ชั่นเพื่อที่ว่าถ้าฟังก์ชั่นนั้นมีข้อความของตัวเองเพื่อส่งออกฉันไม่ต้องจับมันในตัวแปร

#!/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
เฮ้ทำไมพวกคุณทุกคนใช้function foo()ไวยากรณ์เก่าที่ไม่ใช่ POSIX ? คุณสามารถรับความเข้ากันได้กับ POSIX ที่ดีขึ้นด้วยการกดปุ่มกดน้อยลง 9 ครั้ง
Arthur2e5

2
ฉันคุ้นเคยกับไวยากรณ์นี้มากขึ้น
TheLovelySausage

1
@ Arthur2e5 เป็นหลักเพราะการพิมพ์ "ฟังก์ชั่น" ง่ายกว่า "[a-zA-Z0-9] + \ (\) \ {" เมื่อค้นหารหัส
Alex Jansen

คำตอบ:


17

สิ่งใดก็ตามที่พิมพ์โดยฟังก์ชั่นสามารถบันทึกได้หากคุณจับกระแสข้อมูลขาออกที่ถูกต้อง ดังนั้นวิธีที่ง่ายที่สุดในการพิมพ์และบันทึกเอาต์พุตอื่น ๆ คือเปลี่ยนเส้นทางเอาต์พุตฟุ่มเฟือยไปยังข้อผิดพลาดมาตรฐาน:

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

ความเป็นไปได้อีกอย่างหนึ่งคือการเข้าสู่ไฟล์แทนที่จะพิมพ์ข้อความบันทึกโดยตรงตัวอย่างเช่นใช้สิ่งนี้:

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

ที่กล่าวถึงฟังก์ชั่น Bash ไม่สามารถคืนค่าตัวแปรได้ ค่า "คืน" จริงเท่านั้นคือรหัสทางออก ด้วยเหตุผลนี้ ( และอื่น ๆ อีกมากมาย ) หากคุณต้องการการบันทึกที่เชื่อถือได้ค่าส่งคืนการจัดการข้อยกเว้นและอีกมากมายคุณจะต้องใช้ภาษาอื่นเช่น Python, Ruby หรือ Java


6

คุณสามารถนำเสนอข้อความข้อมูลเกี่ยวกับข้อผิดพลาดมาตรฐาน:

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

คำแนะนำอื่น ๆ อยู่ในบทความ Linux Journal นี้ : ใช้ตัวแปรทั่วโลก (ซึ่งคุณพูดถึงว่าคุณไม่ต้องการ) หรือส่งชื่อของตัวแปรเพื่อส่งกลับผลลัพธ์


/dev/stderrจุดที่จะต้อง fd ที่ 2 และยังสามารถเปลี่ยนเส้นทางหรือ&>blah อาจจะดีกว่า 2>blah/dev/tty
Arthur2e5
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.