Score:0

ฟังก์ชัน Bash ที่กำหนดไว้ใน .bashrc ไม่สามารถใช้ได้กับสคริปต์อื่น

ธง vn

ฉันรันคำสั่งนี้บ่อยๆ

load_module อัจฉริยะ

มันทำงานได้ดีในเทอร์มินัล

ดังนั้นฉันจึงใส่ไว้ในสคริปต์ทุบตีชื่อ load.shซึ่งปฏิบัติการได้

    #!/bin/bash
    ก้อง "สวัสดี"
    load_module อัจฉริยะ

แต่เมื่อฉันพยายามดำเนินการโดยใช้ ./load.shมันให้ข้อผิดพลาดนี้

./load.sh: บรรทัดที่ 3: load_module: ไม่พบคำสั่ง

ฉันพยายามแก้ไขข้อบกพร่องโดยใส่ ก้อง "สวัสดี" ในไฟล์ 'load.sh' มันพิมพ์ สวัสดี บนหน้าจอเมื่อฉันเรียกใช้งานไฟล์ ดังนั้นสคริปต์จึงทำงานได้ดี ฉันเดาว่า ฉันไม่คิดว่าจะลองทำอะไรอีก ขอบคุณ

นี่คือบทสรุป

een212023@hertz:~/iec_lab1$ ls -la load.sh
-rwxr-xr-x 1 een212023 nogroup 46 ส.ค. 62 17:59 น. load.sh
een212023@hertz:~/iec_lab1$ cat load.sh
#!/bin/bash
ก้อง "สวัสดี"
load_module อัจฉริยะ
een212023@hertz:~/iec_lab1$ load_module อัจฉริยะ
een212023@hertz:~/iec_lab1$ ./load.sh
สวัสดี
./load.sh: บรรทัดที่ 3: load_module: ไม่พบคำสั่ง
een212023@hertz:~/iec_lab1$



een212023@hertz:~/iec_lab1$ พิมพ์ -a load_module
load_module เป็นฟังก์ชัน
load_module ()
{
    ถ้าโหลดแล้ว $1; แล้ว
        กลับ 0;
    ไฟ;
    load_vars_of_module $1;
    ประกาศ -a required_here=("${additional_required[@]}");
    ประกาศ -a ข้อขัดแย้ง_here=("${additional_conflicts[@]}");
    load_required_modules ${required_here[*]};
    unload_conflicting_modules ${conflicts_here[*]};
    load_vars_of_module $1;
    init_all_paths;
    add_paths ${additional_path[*]};
    add_ldpaths ${additional_ldpath[*]};
    add_manpaths ${additional_manpath[*]};
    add_lmpaths ${additional_lmpath[*]};
    exportvars ${additional_exports[*]};
    นามแฝงใหม่ "${additional_aliases[@]}";
    ยกเลิกการตั้งค่า ${!additional*};
    ส่งออก MODULES=${MODULES}:$1
}
Byte Commander avatar
nf flag
`load_module` คืออะไร คุณสามารถเพิ่มผลลัพธ์ของ `type -a load_module` ในคำถามของคุณได้ไหม หากเป็นเช่น นามแฝงจะไม่สามารถใช้ได้ในสคริปต์
Rahul avatar
vn flag
@ByteCommander ฉันได้เพิ่มผลลัพธ์ของ "type -a load_module"
Byte Commander avatar
nf flag
ดูที่https://unix.stackexchange.com/q/63665/103151 - หากคุณกำหนดฟังก์ชันเชลล์เช่น ในไฟล์ .bashrc ของคุณ สิ่งนี้จะไม่สามารถใช้ได้กับสคริปต์ เฉพาะกับเชลล์โต้ตอบของคุณเท่านั้น คุณอาจแปลงฟังก์ชันเป็นสคริปต์แยกต่างหากแทน หรือคัดลอกลงในสคริปต์ใหม่ เป็นต้น
sourav c. avatar
cn flag
นี่คือเหตุผลที่ `ส่งออก' มีอยู่
Rahul avatar
vn flag
@souravc. ฉันได้เพิ่ม `export -f load_module` ในไฟล์ `load.sh` ของฉันแล้ว แต่เมื่อดำเนินการ มันบอกว่า `load_module : not a function'
Byte Commander avatar
nf flag
คุณต้องส่งออกฟังก์ชันตามที่กำหนดไว้ ไม่ใช่ตำแหน่งที่คุณต้องการโหลด แต่ถ้าฉันเข้าใจโพสต์ที่ฉันเชื่อมโยงอย่างถูกต้อง ขึ้นอยู่กับตำแหน่งที่คุณกำหนดไว้ ไฟล์นั้นอาจไม่สามารถโหลดสำหรับสคริปต์ได้อยู่ดี
Score:1
ธง vn

ตามที่คนอื่นๆ ระบุไว้ คุณต้องกำหนดฟังก์ชันของคุณเมื่อโหลดสคริปต์

ฉันทำสิ่งนี้โดยมีไฟล์สคริปต์ที่มีฟังก์ชัน "ทั่วไป" ที่ฉันใช้ในสคริปต์โดยทั่วไป เรียกไฟล์นี้ว่า /path/to/bash-common.sh - และในกรณีของคุณ สคริปต์นี้จะมีฟังก์ชัน load_module.

สิ่งที่ฉันทำคือการอ้างอิงสคริปต์ทั่วไปนี้ในสคริปต์อื่นๆ ทั้งหมด ดังนั้นสคริปต์ทั้งหมดของฉันจึงเริ่มต้นดังนี้:

#!/bin/bash
ที่มา /path/to/bash-common.sh

ในกรณีของคุณ load.sh จากนั้นจะเป็น:

#!/bin/bash
ที่มา /path/to/bash-common.sh

ก้อง "สวัสดี"
load_module อัจฉริยะ

คุณยังสามารถ ที่มา /path/to/bash-common.sh ในของคุณ .bashrc ถ้าคุณต้องการ.

ด้วยวิธีนี้ คุณจะต้องรักษาฟังก์ชันแบบกำหนดเองทั้งหมดของคุณไว้ในที่เดียว และสามารถเข้าถึงได้จากทุกที่ที่คุณสร้างไฟล์นี้ (รวมถึงในเชลล์แบบโต้ตอบของคุณด้วย .bashrc).

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา