เรียกใช้ฟังก์ชันของไฟล์ที่มาในสคริปต์ทุบตี


2

ฉันมีไฟล์ bash src-useful.bashซึ่งมีฟังก์ชั่นที่มีประโยชน์เช่นsay_hello()ตั้งอยู่ใน / path / to / มีประโยชน์

ในฉัน~/.bash_profileฉันเพิ่มบรรทัดต่อไปนี้:

export BASH_USEFUL=/path/to/useful
source $BASH_USEFUL/src-useful.bash

การเปิดเทอร์มินัลใหม่ฉันสามารถตรวจสอบสิ่งต่อไปนี้:

$ echo $BASH_USEFUL
/path/to/useful

$ cat $BASH_USEFUL/src-useful.bash
function hello() {
    echo "hello!"
}

$ hello
hello!

ฉันสร้างสคริปต์say_hello.sh:

$ cat say_hello.sh
echo "BASH_USEFUL: $BASH_USEFUL"
hello

$ ./say_hello.sh
BASH_USEFUL: /path/to/useful  # Recognizsed
say_hello.sh: line 2: say_hello: command not found  # Not recognized?

หากฉันแหล่งที่มา$BASH_USEFUL/src-useful.bashในsay_hello.shมันจะทำงานอย่างไร:

$ cat say_hello.sh
echo "BASH_USEFUL: $BASH_USEFUL"
source $BASH_USEFUL/src-useful
say_hello

$ ./say_hello.sh
BASH_USEFUL: /path/to/useful  # Recognized
hello!  # Function say_hello is now recognized

ฉันต้องการทราบว่าทำไมBASH_USEFULสคริปต์ยังคงรับรู้ถึงตัวแปรในขณะที่สคริปต์ที่ทำงานของฉันไม่สามารถมองเห็นฟังก์ชั่นจากไฟล์ที่มาของฉันในสภาพแวดล้อมได้ มีวิธีแก้ปัญหานอกเหนือจากการหาsrc-useful.bashสคริปต์ของฉันหรือไม่? ฉันต้องการsrc-useful.bashโหลดฟังก์ชั่นในสภาพแวดล้อมของสคริปต์ที่ฉันเปิดตัว


ดูเหมือนว่าคุณเปลี่ยนการเรียกร้องให้ฟังก์ชั่นที่มาhello()การsay_hello()ในขั้นตอนข้างต้น ...
venzen

อ่าใช่ขอบคุณฉันแก้ไขมันแล้ว ปัญหายังคงอยู่ที่นี่
kaligne

นั่นเป็น ... วิธีเขียนโปรแกรมที่น่ากลัว มันจะกัดคุณไม่ช้าก็เร็ว
grawity

ขอบคุณ grawity ฉันจะหาฟังก์ชั่นทั่วไปของฉันได้อย่างไร
kaligne

คำตอบ:


3

เฉพาะรายการสภาพแวดล้อมที่ส่งออกจะถูกคัดลอกไปยังสภาพแวดล้อมลูกใหม่ คุณส่งออกBASH_USEFULดังนั้น env-var นี้จะถูกคัดลอกไปยัง./say_hello.shกระบวนการย่อยของคุณตามที่คาดไว้ แต่คุณไม่ได้ทำสิ่งเดียวกันกับฟังก์ชั่นของคุณhello()ซึ่งเป็นสัญลักษณ์โลคัลอย่างง่ายที่จะไม่คัดลอกในสภาพแวดล้อมลูกใหม่

ไวยากรณ์เพื่อส่งออกฟังก์ชั่นการใช้ bash ใช้-fอาร์กิวเมนต์ของexport:

export -f hello

นั่นหมายความว่าฉันจะส่งออกฟังก์ชั่นทั้งหมด (yuk) ด้วยตนเองหรือแหล่งที่มาของไฟล์ในสคริปต์ของฉันทั้งหมดหรือไม่
kaligne

ใช่. แต่การส่งออกฟังก์ชั่นทั้งหมดนั้นค่อนข้างง่ายหากคุณคิดถึงเรื่องนั้นเมื่อคุณเขียนสคริปต์ คุณสามารถ: 1) เพิ่ม a export -fafter after แต่ละฟังก์ชั่น body หรือ 2) เพิ่ม a MYSCRIPT_FUNCS="${MYSCRIPT_FUNCS} foo"after แต่ละฟังก์ชั่น body ด้วยฟังก์ชั่นตัวช่วยพิเศษmyscript_export_all()ที่เรียกexport -fใช้โทเค็นทั้งหมดของตัวแปรนี้เช่น source myscript.sh && myscript_export_allและนำสคริปต์นี้ใช้ไวยากรณ์เช่น
A. Loiseau
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.