วิธีการเรียกฟังก์ชั่นทุบตี


28

บางทีฉันอาจจะมองผิดวิธีนี้ .. แต่ที่นี่ฉันกำลังทำอะไรอยู่ ทำงานส่วนใหญ่ของฉันกับ Java แต่เพิ่งเปลี่ยนเป็นสภาพแวดล้อม unix (ทุบตี) ฉันกำลังทำสิ่งนี้:

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

แต่ฉันมีสองฟังก์ชั่นในไฟล์ของฉันและฉันต้องการที่จะสามารถเรียกพวกเขาแยกต่างหากจากบรรทัดคำสั่ง เช่น: หรือแม้เพียงแค่myFunc.ls2() ls2ฉันรู้ว่าฉันสามารถเพิ่มฟังก์ชั่นลงใน.bashrcไฟล์ของฉันแต่มีวิธีอื่นที่ฉันสามารถใช้งานฟังก์ชั่นเหล่านี้ได้โดยไม่ต้องเพิ่มเข้าไปในของฉัน.bashrc?

คำตอบ:


25

วิธีหนึ่งในการทำเช่นนี้ซึ่งเกี่ยวข้องกับการพิมพ์อีกเล็กน้อยคือผ่านsourceคำสั่ง เพื่อเรียกใช้ฟังก์ชั่นจาก myFunc คุณสามารถใช้source myFunc; ls2และมันจะออก Hello World

ตัวอย่างเช่นฉันมีไฟล์ชื่อsay.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

ตอนนี้ฉันต้องการเรียกมันเป็นtalk()ฟังก์ชั่นจากบรรทัดคำสั่ง:

[john @ awesome ~] $ source say.sh; พูดคุย
Hi!

เพื่อเรียกมันจากสคริปต์ทุบตีอื่น:

#!/bin/bash
source say.sh
talk

นอกจากนี้คุณยังสามารถใส่สคริปต์แยกต่างหากและเพิ่มไว้ในไดเรกทอรีซึ่งอยู่ในตัวแปร PATH ของคุณ

ตัวอย่างเช่นในหนึ่งสคริปต์เรียกว่าhelloคุณมี:

#!/bin/bash
echo "Hello World"

ตอนนี้วางไว้ในหนึ่งในไดเรกทอรีใน PATH ของคุณซึ่งคุณสามารถดูecho $PATHได้ คุณสามารถเพิ่มไดเรกทอรีอื่นใน PATH ของคุณหากคุณต้องการหรือใช้ไดเรกทอรีที่มีอยู่ เมื่อคุณคัดลอกไฟล์ไว้ที่นั่นแล้วให้ใช้งานchmod +x filenameได้


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

5

อีกวิธีคือการสร้างสคริปต์ที่เรียกว่าfunctions.sh(ใน~/binไดเรกทอรีตัวอย่าง)

ในสคริปต์นี้คุณเพิ่มนิยามฟังก์ชันส่วนบุคคลทั้งหมดของคุณ (สมมติว่าทุกครั้งที่คุณเพิ่มฟังก์ชั่นที่คุณเพิ่มเข้าไปในไฟล์นี้ ... )

ในที่สุดคุณก็ต้องเพิ่มsource ~/bin/functions.shบรรทัดลงใน.bashrcไฟล์ของคุณ วิธีนี้คุณจะสามารถโทรหาพวกเขาจากบรรทัดคำสั่งคุณ.bashrcจะยังคงสะอาดและคุณจะมีสถานที่เฉพาะสำหรับการทำงานส่วนตัวของคุณ


5

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

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$

ฉันชอบสิ่งนี้มากกว่ามากsourceเพราะมันสามารถจัดการกับการมีสองฟังก์ชั่นของชื่อเดียวกันในไฟล์ sh ที่แตกต่างกันสองไฟล์ ฉันกลั่นมันเพื่อจัดการกับจำนวนพารามิเตอร์โดยพลการโดยแทนที่$1 $2 $3 $4 $5ด้วยFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur

@ChuckWilbur: ทำไมต้องผ่านห่วง? "$@"เพียงแค่เปลี่ยนเส้นสุดท้ายที่จะ PS แนวทางของคุณผิดจริง ๆ ; ส่วนสุดท้ายควรเป็น"$FUNC_CALL" "$@"  (เช่น  $FUNC_CALLควรอยู่ในเครื่องหมายคำพูด)
สกอตต์

คือ"$FUNC_CALL"อะไร
ctrl-alt-delor

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