เมื่อคุณเข้าสู่ระบบเปลือก Linux คุณจะสืบทอดสภาพแวดล้อมการทำงานเฉพาะ สิ่งแวดล้อม ในบริบทของเชลล์ หมายความว่ามีตัวแปรบางตัวที่ตั้งค่าไว้แล้วสำหรับคุณ ซึ่งช่วยให้มั่นใจว่าคำสั่งของคุณทำงานตามที่ตั้งใจไว้ ตัวอย่างเช่น ตัวแปรสภาพแวดล้อม PATH กำหนดตำแหน่งที่เชลล์ค้นหาคำสั่ง หากไม่มีสิ่งนี้ เกือบทุกอย่างที่คุณพยายามทำใน Bash จะล้มเหลวด้วย ไม่พบคำสั่ง ข้อผิดพลาด. สภาพแวดล้อมของคุณ แม้ว่าคุณส่วนใหญ่จะมองไม่เห็นในขณะที่คุณทำงานประจำวัน แต่มีความสำคัญอย่างยิ่ง
มีหลายวิธีที่จะส่งผลต่อสภาพแวดล้อมของเชลล์ของคุณ คุณสามารถแก้ไขไฟล์การกำหนดค่าได้ เช่น ~/.bashrc และ ~/.profile คุณสามารถเรียกใช้บริการต่างๆ เมื่อเริ่มต้น และคุณสามารถสร้างคำสั่งที่กำหนดเองหรือสคริปต์ฟังก์ชัน Bash ของคุณเองได้
เพิ่มในสภาพแวดล้อมของคุณด้วยแหล่งที่มา
Bash (พร้อมกับเชลล์อื่นๆ) มีคำสั่งในตัวที่เรียกว่า source . และอาจทำให้เกิดความสับสนได้:source ทำหน้าที่เดียวกับคำสั่ง . (ใช่ นั่นเป็นเพียงจุดเดียว) และมันคือ ไม่ใช่ source sameเดียวกัน เป็น Tcl คำสั่ง (ซึ่งอาจปรากฏขึ้นบนหน้าจอของคุณหากคุณพิมพ์ man source ). ในตัว source คำสั่งไม่อยู่ใน PATH . ของคุณ ที่จริงแล้ว เป็นคำสั่งที่รวมอยู่ใน Bash และหากต้องการข้อมูลเพิ่มเติม คุณสามารถพิมพ์ help source .
. คำสั่งเป็นไปตาม POSIX source คำสั่งไม่ได้ถูกกำหนดโดย POSIX แต่สามารถใช้แทนกันได้กับ . คำสั่ง
ตาม Bash help , source คำสั่งรันไฟล์ในเชลล์ปัจจุบันของคุณ ประโยค "ในเชลล์ปัจจุบันของคุณ" มีความสำคัญ เพราะมันหมายความว่ามันไม่เปิด sub-shell; ดังนั้น สิ่งที่คุณดำเนินการด้วย source เกิดขึ้นภายในและส่งผลต่อปัจจุบัน .ของคุณ สิ่งแวดล้อม
ก่อนจะสำรวจว่า source สามารถส่งผลกระทบต่อสภาพแวดล้อมของคุณ ลองใช้ source ในไฟล์ทดสอบเพื่อให้แน่ใจว่ารันโค้ดตามที่คาดไว้ ขั้นแรก สร้างสคริปต์ทุบตีอย่างง่ายแล้วบันทึกเป็นไฟล์ชื่อ hello.sh :
#!/usr/bin/env bash
echo "สวัสดีชาวโลก"
การใช้ source คุณสามารถเรียกใช้สคริปต์นี้ได้โดยไม่ต้องตั้งค่าบิตปฏิบัติการ:
$ แหล่งที่มา hello.sh
สวัสดีชาวโลก
คุณยังสามารถใช้. .ในตัว คำสั่งสำหรับผลลัพธ์เดียวกัน:
$ . hello.sh
สวัสดีชาวโลก
source และ . คำสั่งดำเนินการเนื้อหาของไฟล์ทดสอบได้สำเร็จ
ตั้งค่าตัวแปรและนำเข้าฟังก์ชัน
คุณสามารถใช้ source เพื่อ "นำเข้า" ไฟล์ไปยังสภาพแวดล้อมเชลล์ของคุณ เช่นเดียวกับที่คุณอาจใช้ include คีย์เวิร์ดในภาษา C หรือ C++ เพื่ออ้างอิงไลบรารีหรือ import คีย์เวิร์ดใน Python เพื่อนำเข้าโมดูล นี่เป็นหนึ่งในการใช้งานทั่วไปที่สุดสำหรับ source และเป็นการรวมเริ่มต้นทั่วไปใน .bashrc ไฟล์ไปยัง source ไฟล์ชื่อ .bash_aliases เพื่อให้ชื่อแทนที่กำหนดเองใดๆ ที่คุณกำหนดนำเข้ามาในสภาพแวดล้อมของคุณเมื่อคุณเข้าสู่ระบบ
นี่คือตัวอย่างการนำเข้าฟังก์ชัน Bash ขั้นแรก สร้างฟังก์ชันในไฟล์ชื่อ myfunctions . ซึ่งจะพิมพ์ที่อยู่ IP สาธารณะและที่อยู่ IP ในพื้นที่ของคุณ:
ฟังก์ชัน myip() {
curl http://icanhazip.com
ip addr | grep inet$IP | \
cut -d"/" -f 1 | \
grep -v 127\.0 | \
grep -v \:\:1 | \
awk '{$1=$1};1'
} นำเข้าฟังก์ชันลงในเชลล์ของคุณ:
$ source myfunctions ทดสอบฟังก์ชันใหม่ของคุณ:
$ 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ใน Bash จะค้นหาไดเรกทอรีปัจจุบันของคุณสำหรับไฟล์ที่คุณอ้างอิง สิ่งนี้ไม่ได้เกิดขึ้นในทุกเชลล์ ดังนั้นโปรดตรวจสอบเอกสารประกอบของคุณหากคุณไม่ได้ใช้ Bashหาก Bash ไม่พบไฟล์ที่จะรัน มันจะค้นหา
PATH. ของคุณ แทนที่. อีกครั้ง นี่ไม่ใช่ค่าเริ่มต้นสำหรับเชลล์ทั้งหมด ดังนั้นโปรดตรวจสอบเอกสารประกอบของคุณหากคุณไม่ได้ใช้ Bashสิ่งเหล่านี้เป็นคุณสมบัติอำนวยความสะดวกที่ดีใน Bash ลักษณะการทำงานนี้มีประสิทธิภาพอย่างน่าประหลาดใจ เพราะช่วยให้คุณสามารถจัดเก็บฟังก์ชันทั่วไปในตำแหน่งส่วนกลางบนไดรฟ์ของคุณ แล้วปฏิบัติต่อสภาพแวดล้อมของคุณเหมือนกับสภาพแวดล้อมการพัฒนาแบบบูรณาการ (IDE) คุณไม่ต้องกังวลว่าฟังก์ชันของคุณจะถูกเก็บไว้ที่ใด เพราะคุณรู้ว่าฟังก์ชันเหล่านี้เทียบเท่ากับ
/usr/includeในพื้นที่ของคุณ ดังนั้นไม่ว่าคุณจะอยู่ที่ไหนเมื่อคุณหาแหล่งที่มา Bash ก็พบมันตัวอย่างเช่น คุณสามารถสร้างไดเร็กทอรีชื่อ
~/.local/includeเป็นพื้นที่จัดเก็บสำหรับฟังก์ชันทั่วไป แล้วใส่บล็อกของโค้ดนี้ลงใน.bashrc. ของคุณ ไฟล์:for i ใน $HOME/.local/include/*;
do source $i
done"นำเข้า" ไฟล์ใดๆ ที่มีฟังก์ชันที่กำหนดเองใน
~/.local/includeในสภาพแวดล้อมเชลล์ของคุณBash เป็นเชลล์เดียวที่ค้นหาทั้งไดเร็กทอรีปัจจุบันและ
PATH. ของคุณ เมื่อคุณใช้sourceหรือ.คำสั่งการใช้ซอร์สสำหรับโอเพ่นซอร์ส
การใช้
sourceหรือ.การรันไฟล์อาจเป็นวิธีที่สะดวกในการส่งผลต่อสภาพแวดล้อมของคุณในขณะที่ยังคงรักษาการเปลี่ยนแปลงของคุณให้เป็นโมดูล ครั้งต่อไปที่คุณคิดที่จะคัดลอกและวางโค้ดขนาดใหญ่ลงใน.bashrcของคุณ ให้พิจารณาวางฟังก์ชันที่เกี่ยวข้องหรือกลุ่มของนามแฝงลงในไฟล์เฉพาะ แล้วใช้sourceที่จะกินเข้าไป