ฉันจะใส่ฟังก์ชั่นเชลล์ที่ผู้ใช้กำหนดได้ที่ไหน


14

ฉันวางแผนที่จะสร้างฟังก์ชั่นที่จะทำให้สิ่งต่าง ๆ สำหรับฉันง่ายขึ้น ฟังก์ชั่นจะเป็นอย่างไร

function lazymode()
{
echo "Hello World!";
}

เพื่อที่ว่าเมื่อผมใช้คำสั่งlazymodeในเปลือกHello World!ก็จะเอาท์พุท

ไฟล์ใดที่ฉันควรใส่ฟังก์ชั่นที่ผู้ใช้กำหนด?

คำตอบ:


14

ขึ้นอยู่กับฟังก์ชั่น หากเป็นเพียงซับเรียบง่ายอย่างหนึ่งที่คุณสามารถสร้างนามแฝงหรือติดฟังก์ชั่นใน~/.bashrc(ไฟล์ที่ทุบตีโหลดเมื่อมันเริ่ม)

หากคุณกำลังสร้างบางสิ่งที่มีเนื้อมากกว่านิดหน่อยมันอาจจะเหมาะสมกว่าที่จะสร้างสคริปต์ที่เป็นของตัวเอง~/bin/ซึ่งจะไม่มีอยู่ตามค่าเริ่มต้น (เป็นเพียงไดเรกทอรี) แต่ควรอยู่ในเส้นทางของคุณ จำไว้ว่าไฟล์นี้จะต้องสามารถเรียกใช้งานได้ ( chmod +x filename) และเริ่มต้นด้วย#!/bin/bashบทที่เหมาะสม

เส้นทางที่สองมีประโยชน์ชัดเจน:

  • มันง่ายกว่าที่จะเห็นสิ่งที่มีอยู่
  • ข้อผิดพลาดทางไวยากรณ์จะไม่เก็บข้อมูลโปรไฟล์ของคุณ
  • คุณไม่จำเป็นต้องทำการกำหนดค่า bash ของคุณอีกครั้งหากคุณเปลี่ยนสคริปต์
  • มันสามารถใช้ได้กับเชลล์ใด ๆ ตราบใดที่ใช้พา ธ แบบเต็มหรือ~/bin/อยู่ในพา ธ สำหรับเชลล์นั้นด้วย (ซึ่งควรเป็นในกรณีส่วนใหญ่ AFAIK)

ฉันใช้ตัวเลือกในภายหลัง ฟังก์ชั่นของฉันมีคำสั่งที่ลบไฟล์ทำอะไรบางอย่างดำเนินการคำสั่ง javac และ java และเมื่อฉันลองใช้กับ gnome-terminal มันไม่ทำงาน คุณคิดว่ามีปัญหาหรือไม่?
Abel Melquiades Callejo

มันทำอะไรแทน
Oli

มันได้รับการแก้ไขแล้ว แก้ไขผ่านคำตอบนี้
Abel Melquiades Callejo

อืมม ... สคริปต์ของผู้ใช้ไม่ควร/usr/local/binยุ่งกับ$PATHหรือไม่
Braiam

สำหรับฉันแล้วดูเหมือนว่าข้อดีเล็กน้อย แต่น่าสนใจในการใส่ฟังก์ชั่นใน~/.bashrc(เหมือนsourced) คือ Bash ค้นหาฟังก์ชั่นก่อนที่จะทำการค้นหา PATH
Zanna

4

ตัวเลือกที่ดีที่สุดคือ~/.bashrcไฟล์

คุณสามารถเขียนคำจำกัดความของฟังก์ชั่นเปลือกของคุณโดยตรงในของคุณ~/.bashrcไฟล์หรือหากคุณมีจำนวนมากของพวกเขาและไม่ต้องการที่จะถ่วงของ~/.bashrcไฟล์ที่คุณสามารถนำพวกเขาทั้งหมดในแฟ้มที่คุณเลือกอื่น - เพียงให้แน่ใจว่าแหล่งที่มาว่าไฟล์ของคุณใน~/.bashrcไฟล์ ตัวอย่างเช่นหากไฟล์ที่มีฟังก์ชั่นของคุณตั้งชื่อbash_functionsให้เพิ่ม~/.bashrcบรรทัดลงในไฟล์ของคุณ:

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

หรือเทียบเท่า:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

ที่เป็นเพียงสัญลักษณ์แทน. sourceการifทดสอบทำให้แน่ใจว่ามีไฟล์/path/to/bash_functionsอยู่ก่อนที่จะพยายามหาแหล่งที่มา

เทคนิคนี้คล้ายกันมากกับการสร้างนามแฝง~/.bashrcด้วยการสร้างไฟล์ที่เรียก~/.bash_aliasesและใช้ไวยากรณ์ที่คล้ายกันกับที่อยู่ข้างบน~/.bashrcเพื่อทดสอบการมีอยู่ของมันและจากนั้นมา


ขอบคุณมันใช้งานได้ โดยวิธีการอะไรคือความแตกต่างกับ. profile? ใน linux บางตัวฉันไม่สามารถใส่ฟังก์ชั่นใน bashrc ได้
Abel Melquiades Callejo

2
~/.profileไฟล์ถูกเรียกใช้งานโดยตัวแปลคำสั่งสำหรับล็อกอินเชลล์ เมื่อคุณใช้ GUI และคุณเปิดเทอร์มินัลไฟล์นั้นจะไม่ถูกดำเนินการเพราะคุณจะอยู่ในเชลล์การเข้าสู่ระบบไม่ใช่
Radu Rădeanu

1

นี่คือขั้นตอนที่จำเป็นสำหรับการประกาศฟังก์ชันถาวร:

  1. เปิด~/.bashrcไฟล์ในโปรแกรมแก้ไขข้อความ ไม่สำคัญว่าจะแก้ไขข้อความใดตราบใดที่คุณรู้วิธีใช้และตราบใดที่คุณเปิด/home/<username>/.bashrc

  2. ในตอนท้ายของการ~/.bashrcประกาศฟังก์ชั่นของคุณเองเช่น:

    find_dirs(){
        find "$1" -type d
    }
  3. บันทึกและปิดไฟล์

~/.bashrcไฟล์อ่านทุกครั้งที่คุณเปิดเปลือกโต้ตอบ (นั่นคือขั้วแท็บใหม่เข้าสู่ระบบผ่านทางsshหรือเปิด tty1 หรืออื่น ๆ ที่คอนโซลเสมือน) สิ่งนี้จะไม่สามารถใช้งานได้ในไฟล์สคริปต์เนื่องจาก~/.bashrcไม่ได้อ่านสำหรับกระสุนที่ไม่มีการโต้ตอบ นอกจากนี้ยังไม่สามารถใช้ได้ถ้าคุณทำงานbashกับ--norcตัวเลือก

หากคุณต้องการให้ฟังก์ชันใช้งานได้ทันทีในแท็บที่เปิดอยู่ให้ใช้source ~/.bashrcคำสั่ง


ฟังก์ชั่นใช้อาร์กิวเมนต์เช่นเดียวกับคำสั่งปกติ ตัวอย่างเช่น$1through $9ระบุพารามิเตอร์ตำแหน่งเมื่อคุณเรียกใช้ฟังก์ชัน ในตัวอย่างข้างต้นจะใช้เวลาหนึ่งพารามิเตอร์ตำแหน่งเท่านั้นและจะถูกเรียกว่าเป็นfind_dirs find_dirs /etcคุณยังสามารถใช้$@เพื่ออ้างถึงพารามิเตอร์ตำแหน่งทั้งหมด ฟังก์ชั่นยังยอมรับการเปลี่ยนเส้นทาง คุณสามารถเรียกใช้ฟังก์ชันด้วยfind_dirs $1 > /dev/null; เราสามารถประกาศได้ดังต่อไปนี้:

find_dirs(){
    find "$1" -type d
}

หมายเหตุจากman bash: "ฟังก์ชั่นถูกดำเนินการในบริบทของเชลล์ปัจจุบันไม่มีกระบวนการใหม่ถูกสร้างขึ้นเพื่อตีความพวกเขา" นั่นหมายความว่าคุณควรตระหนักถึงฟังก์ชั่นที่มีความสามารถในการเปลี่ยนสภาพแวดล้อมการประมวลผลเชลล์ของคุณ - เปลี่ยนตัวแปรและการตั้งค่าเทอร์มินัล

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