Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

นำเข้า Functions และ Variables เข้า Bash ได้ง่ายด้วยคำสั่ง source

บทนำ

เมื่อคุณล็อกอินเข้าสู่ Linux shell คุณสืบทอดสภาพแวดล้อมการทำงานเฉพาะ Environment ในบริบทของ shell หมายถึงมีตัวแปรบางตัวตั้งค่าไว้ให้แล้ว ซึ่งรับรองว่าคำสั่งของคุณทำงานตามที่ตั้งใจ ตัวอย่าง ตัวแปรสภาพแวดล้อม PATH กำหนดว่า shell ค้นหาคำสั่งที่ไหน โดยไม่มีมัน เกือบทุกอย่างที่คุณพยายามทำใน Bash จะล้มเหลวพร้อมข้อผิดพลาด command not found สภาพแวดล้อมของคุณ แม้จะส่วนใหญ่เป็นอะไรที่มองไม่เห็นขณะที่คุณทำงานประจำวัน แต่มันสำคัญมาก

มีหลายวิธีที่จะส่งผลต่อสภาพแวดล้อม shell ของคุณ คุณสามารถแก้ไขในไฟล์การตั้งค่า เช่น ~/.bashrc และ ~/.profile รัน services ตอน startup และสร้างคำสั่งกำหนดเองหรือเขียน Bash functions ของตัวเอง

เพิ่มเข้าไปในสภาพแวดล้อมด้วย source

Bash (รวมถึง shells บางตัว) มีคำสั่ง built-in ชื่อ source และนี่คือจุดที่อาจสับสน: source ทำหน้าที่เดียวกับคำสั่ง . (ใช่ แค่จุดเดียว) และมัน ไม่ใช่ source เดียวกับคำสั่ง Tcl (ซึ่งอาจขึ้นบนหน้าจอหากคุณพิมพ์ man source) Built-in source command ไม่อยู่ใน PATH ของคุณเลย จริงๆ แล้ว มันเป็นคำสั่งที่มาพร้อมกับ Bash และเพื่อข้อมูลเพิ่มเติม คุณพิมพ์ help source

คำสั่ง . เป็น POSIX-compliant คำสั่ง source ไม่ได้ถูกกำหนดโดย POSIX แต่สามารถสลับใช้กับคำสั่ง . ได้

ตาม Bash help คำสั่ง source รันไฟล์ใน current shell ของคุณ คลอส "in your current shell" สำคัญ เพราะมันหมายถึงมันไม่ launch sub-shell ดังนั้น ทุกสิ่งที่คุณรันด้วย source เกิดขึ้นภายในและส่งผลต่อ current environment ของคุณ

ก่อนสำรวจว่า source ส่งผลต่อสภาพแวดล้อมอย่างไร ลอง source บนไฟล์ทดสอบเพื่อให้แน่ใจว่ามันรันโค้ดได้ตามคาด สร้าง Bash script เรียบง่ายและบันทึกเป็นไฟล์ชื่อ hello.sh:

#!/usr/bin/env bash
echo "hello world"

ใช้ source คุณสามารถรันสคริปต์นี้ได้แม้ไม่ได้ตั้ง executable bit:

$ source hello.sh
hello world

คุณยังสามารถใช้ built-in . คำสั่งเพื่อผลลัพธ์เดียวกัน:

$ . hello.sh
hello world

คำสั่ง source และ . รันเนื้อหาไฟล์ทดสอบสำเร็จ

ตั้งค่าตัวแปรและนำเข้า Functions

คุณสามารถใช้ source เพื่อ "นำเข้า" ไฟล์เข้าสู่สภาพแวดล้อม shell ของคุณ เหมือนกับที่คุณอาจใช้คีย์เวิร์ด include ใน C หรือ C++ เพื่ออ้างอิง library หรือคีย์เวิร์ด import ใน Python เพื่อนำ module เข้า นี่เป็นการใช้งานที่พบบ่อยที่สุดสำหรับ source และเป็นการรวม default ในไฟล์ .bashrc เพื่อ source ไฟล์ชื่อ .bash_aliases เพื่อให้ custom aliases ที่คุณกำหนดถูกนำเข้าเข้าสู่สภาพแวดล้อมเมื่อคุณล็อกอิน

นี่คือตัวอย่างการนำเข้า Bash function สร้าง function ในไฟล์ชื่อ myfunctions มันพิมพ์ public IP address และ local IP address ของคุณ:

function myip() {
curl https://icanhazip.com

ip addr | grep inet$IP | \
cut -d"/" -f 1 | \
grep -v 127\.0 | \
grep -v \:\:1 | \
awk '{$1=$1};1'
}

นำเข้า function เข้า shell:

$ source myfunctions

ทดสอบ function ใหม่ของคุณ:

$ myip
93.184.216.34
inet 192.168.0.23
inet6 fbd4:e85f:49c:2121:ce12:ef79:0e77:59d1
inet 10.8.42.38

ค้นหา source

เมื่อคุณใช้ source ใน Bash มันค้นหาไฟล์ที่คุณอ้างอิงใน current directory นี่ไม่เกิดขึ้นในทุก shells ดังนั้นตรวจสอบเอกสารหากคุณไม่ได้ใช้ Bash

หาก Bash หาไฟล์ที่จะรันไม่เจอ มันจะค้นหาใน PATH แทน อีกครั้ง นี่ไม่ใช่ค่าเริ่มต้นสำหรับทุก shells ดังนั้นตรวจสอบเอกสารหากคุณไม่ได้ใช้ Bash

ทั้งสองอย่างเป็นฟีเจอร์สะดวกใน Bash พฤติกรรมนี้มีพลังน่าประทับใจ เพราะช่วยให้คุณเก็บฟังก์ชันร่วมในตำแหน่งศูนย์กลางบนไดรฟ์ และจัดการสภาพแวดล้อมเหมือน integrated development environment (IDE) คุณไม่ต้องกังวลว่าฟังก์ชันของคุณเก็บไว้ที่ไหน เพราะคุณรู้ว่ามันอยู่ใน local equivalent ของ /usr/include ดังนั้น无论你在哪里 source พวกมัน Bash จะหาเจอ

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

for i in $HOME/.local/include/*;
do source $i
done

สิ่งนี้ "นำเข้า" ไฟล์ใดๆ ที่มี custom functions ใน ~/.local/include เข้าสู่สภาพแวดล้อม shell ของคุณ

Bash เป็น shell เดียวที่ค้นหาทั้ง current directory และ PATH ของคุณ เมื่อคุณใช้ source หรือคำสั่ง .

การใช้ source สำหรับ open source

การใช้ source หรือ . เพื่อรันไฟล์อาจเป็นวิธีสะดวกในการส่งผลต่อสภาพแวดล้อมของคุณ ขณะที่เก็บการเปลี่ยนแปลงของคุณแบบ modular ครั้งหน้าที่คุณคิดจะ copy และ paste บล็อกโค้ดใหญ่ๆ ลงใน .bashrc ของคุณ พิจารณาวาง functions ที่เกี่ยวข้องหรือกลุ่ม aliases ลงในไฟล์เฉพาะ แล้วใช้ source เพื่อนำเข้า