คำตอบสั้น ๆ
ในคำถามของคุณคำสั่งที่สองไม่ใช้ทั้ง.
เชลล์ในตัวและในsource
ตัว แต่คุณกำลังเรียกใช้สคริปต์ในเชลล์แยกต่างหากโดยการเรียกใช้งานด้วยชื่อเช่นเดียวกับที่คุณใช้กับไฟล์ปฏิบัติการอื่น ๆ สิ่งนี้จะให้ชุดของตัวแปรแยกต่างหาก (แม้ว่าคุณจะส่งออกตัวแปรในพาเรนต์เชลล์มันจะเป็นตัวแปรสภาพแวดล้อมสำหรับกระบวนการลูกใด ๆและดังนั้นจะรวมอยู่ในตัวแปรของเชลล์ลูก ) ถ้าคุณเปลี่ยน/
ไปยังพื้นที่แล้วที่จะทำงานด้วยในตัวซึ่งเทียบเท่ากับ.
source
คำอธิบายเพิ่มเติม
นี่คือไวยากรณ์ของsource
เชลล์ในตัวซึ่งดำเนินการเนื้อหาของสคริปต์ในเชลล์ปัจจุบัน (และด้วยตัวแปรของเชลล์ปัจจุบัน)
source testenv.sh
นี่คือไวยากรณ์ของ.
บิวด์อินซึ่งทำสิ่งเดียวกับsource
:
. testenv.sh
อย่างไรก็ตามไวยากรณ์นี้เรียกใช้สคริปต์เป็นไฟล์เรียกทำงานโดยเรียกใช้เชลล์ใหม่เพื่อเรียกใช้งาน:
./testenv.sh
ที่ไม่ได้ใช้งาน.
ในตัว ค่อนข้าง.
เป็นส่วนหนึ่งของเส้นทางไปยังไฟล์ที่คุณกำลังดำเนินการ โดยทั่วไปคุณสามารถเรียกใช้ไฟล์เรียกใช้งานใด ๆ ในเชลล์โดยเรียกใช้ไฟล์ด้วยชื่อที่มี/
อักขระอย่างน้อยหนึ่งตัว หากต้องการเรียกใช้ไฟล์ในไดเรกทอรีปัจจุบันการทำก่อนหน้าให้./
เป็นวิธีที่ง่ายที่สุด เว้นแต่ไดเรกทอรีปัจจุบันอยู่ในของคุณคุณจะไม่สามารถเรียกใช้สคริปต์ที่มีคำสั่งPATH
testenv.sh
นี่คือการป้องกันไม่ให้คนเรียกใช้ไฟล์โดยไม่ตั้งใจในไดเรกทอรีปัจจุบันเมื่อพวกเขาตั้งใจที่จะใช้คำสั่งระบบหรือไฟล์อื่น ๆ ที่มีอยู่ในบางไดเรกทอรีที่ระบุไว้ในPATH
ตัวแปรสภาพแวดล้อม
เนื่องจากการรันไฟล์ตามชื่อ (แทนที่จะใช้source
หรือ.
) รันในเชลล์ใหม่มันจะมีชุดตัวแปรเชลล์ของตัวเอง เชลล์ใหม่จะสืบทอดตัวแปรสภาพแวดล้อมจากกระบวนการเรียกใช้ (ซึ่งในกรณีนี้คือเชลล์เชิงโต้ตอบของคุณ) และตัวแปรสภาพแวดล้อมเหล่านั้นกลายเป็นตัวแปรเชลล์ในเชลล์ใหม่ อย่างไรก็ตามสำหรับตัวแปรเชลล์ที่จะส่งผ่านไปยังเชลล์ใหม่รายการใดรายการหนึ่งต่อไปนี้ต้องเป็นกรณี:
ตัวแปรเชลล์ได้ถูกส่งออกทำให้เป็นตัวแปรสภาพแวดล้อม ใช้export
เปลือกในตัวสำหรับสิ่งนี้ ในตัวอย่างของคุณคุณสามารถใช้export MY_VAR=12345
เพื่อตั้งค่าและส่งออกตัวแปรในขั้นตอนเดียวหรือถ้าตั้งค่าไว้แล้วคุณก็สามารถใช้งานexport MY_VAR
ได้
ตัวแปรเชลล์ได้รับการตั้งค่าและส่งผ่านอย่างชัดเจนสำหรับคำสั่งที่คุณกำลังเรียกใช้ซึ่งเป็นตัวแปรสภาพแวดล้อมในช่วงระยะเวลาของคำสั่งที่กำลังเรียกใช้ สิ่งนี้มักจะทำให้สำเร็จ:
MY_VAR=12345 ./testenv.sh
ถ้าMY_VAR
เป็นตัวแปรเชลล์ที่ยังไม่ได้รับการส่งออกคุณยังสามารถทำงานtestenv.sh
กับMY_VAR
ผ่านเป็นตัวแปรสภาพแวดล้อมโดยการตั้งค่าให้ตัวเอง :
MY_VAR="$MY_VAR" ./testenv.sh
./
ไวยากรณ์สำหรับสคริปต้องใช้สาย Hashbang ในการทำงาน (ถูกต้อง)
โปรดทราบว่าเมื่อคุณเรียกใช้ไฟล์ปฏิบัติการตามชื่อด้านบน (และไม่ได้ใช้กับ.
หรือsource
เชลล์ในตัว) โปรแกรมเชลล์ใดที่ใช้ในการเรียกใช้โปรแกรมนั้นมักไม่ได้รับการพิจารณาจากเชลล์ที่คุณใช้งาน . แทน:
สำหรับไฟล์ไบนารีเคอร์เนลอาจถูกกำหนดค่าให้เรียกใช้ไฟล์ประเภทนั้น ๆ มันตรวจสอบสองไบต์แรกของไฟล์สำหรับ"หมายเลขมายากล"ที่ระบุประเภทของไบนารีที่ปฏิบัติการได้ นี่คือวิธีที่ไบนารีที่สามารถเรียกใช้งานได้
แน่นอนนี่เป็นสิ่งสำคัญอย่างยิ่งเพราะสคริปต์ไม่สามารถทำงานได้หากไม่มีเชลล์หรือล่ามอื่น ๆ ซึ่งเป็นไบนารีที่สามารถเรียกทำงานได้! นอกจากนี้คำสั่งและแอปพลิเคชันจำนวนมากยังมีการรวบรวมไบนารีมากกว่าสคริปต์
( #!
คือการแทนข้อความของ "หมายเลขมายากล" ที่ระบุถึงข้อความที่สามารถเรียกใช้งานได้)
สำหรับไฟล์ที่ควรรันในเชลล์หรือภาษาที่ตีความอื่น ๆ บรรทัดแรกจะมีลักษณะดังนี้:
#!/bin/sh
/bin/sh
อาจถูกแทนที่ด้วยสิ่งอื่น ๆ เปลือกหรือล่ามมีวัตถุประสงค์เพื่อเรียกใช้โปรแกรม ตัวอย่างเช่นโปรแกรม Python อาจเริ่มต้นด้วยบรรทัด:
#!/usr/bin/python
บรรทัดเหล่านี้เรียกว่า hashbang, shebang และชื่ออื่นที่คล้ายคลึงกัน ดูรายการ FOLDOCนี้บทความ Wikipedia นี้และ#! / bin / sh อ่านโดยล่ามหรือไม่ สำหรับข้อมูลเพิ่มเติม.
หากไฟล์ข้อความถูกทำเครื่องหมายว่าสามารถเรียกใช้งานได้และคุณเรียกใช้จากเชลล์ (เช่น./filename
) แต่ไม่ได้ขึ้นต้นด้วย#!
เคอร์เนลจะไม่สามารถเรียกใช้งานได้ อย่างไรก็ตามเห็นว่านี้ได้เกิดขึ้นเปลือกของคุณจะพยายามที่จะรันโดยผ่านชื่อบางเปลือก มีความต้องการไม่กี่วางอยู่บนสิ่งที่เปลือกที่เป็น ( "เปลือกจะปฏิบัติเทียบเท่ากับคำสั่งที่จะมีเปลือกเรียก ..." ) ในทางปฏิบัติเชลล์บางตัว - รวมถึงbash
* - รันอินสแตนซ์อื่นของตัวเองขณะที่บางตัวใช้/bin/sh
. ฉันขอแนะนำให้คุณหลีกเลี่ยงปัญหานี้และใช้บรรทัด hashbang แทน (หรือเรียกใช้สคริปต์โดยส่งต่อไปยังล่ามที่ต้องการเช่นbash filename
)
* GNU Bash manual , 3.7.2 Command Search and Execution : "ถ้าการดำเนินการนี้ล้มเหลวเนื่องจากไฟล์ไม่อยู่ในรูปแบบที่สามารถใช้งานได้และไฟล์นั้นไม่ใช่ไดเรกทอรีจะถือว่าเป็นเชลล์สคริปต์และเชลล์เรียกใช้งานตามที่อธิบายไว้ ในShell Scripts "
source
คือฟังก์ชั่นพร้อมใช้งานจากการทุบตีโดยไม่จำเป็นต้องโหลดหรือเปิดอีกครั้ง#!/bin/bash function olakease {echo olakease;}
ตัวอย่าง เมื่อคุณโหลดด้วยsource file.sh
คุณสามารถโทรolakease
จากทุบตีโดยตรง ฉันชอบมันมาก ที่มาประมวลผลจะโหลดหลายสิ่งหลายอย่างจุด.
นี้เป็นเพียงการดำเนินการและเป็นสิ่งที่ต้องการใช้งานbash file.sh