ขณะที่ติดตามการดีบัก android eclipse ฉันพบคำสั่งต่อไปนี้
cd /path/to/android/root
. build/envsetup.sh
lunch 1
make
emulator
ปัญหาของฉันคือสิ่งที่จุดก่อนbuild/envsetup.sh
หมายถึงอะไร
ขณะที่ติดตามการดีบัก android eclipse ฉันพบคำสั่งต่อไปนี้
cd /path/to/android/root
. build/envsetup.sh
lunch 1
make
emulator
ปัญหาของฉันคือสิ่งที่จุดก่อนbuild/envsetup.sh
หมายถึงอะไร
คำตอบ:
จุดในบริบทนั้นหมายถึง "แหล่ง" เนื้อหาของไฟล์นั้นลงในเชลล์ปัจจุบัน ด้วยsource
ตัวเองเป็นคำสั่งเชลล์ builtin และ source
และผู้ประกอบการจุดเป็นคำพ้องความหมาย
ว่าฉันมีเนื้อหาต่อไปนี้ในsample.sh
ไฟล์
$ cat sample.sh
echo "hi"
echo "bye?"
ตอนนี้เมื่อฉันมามัน:
$ . sample.sh
hi
bye?
$
ไฟล์เช่นนี้มักใช้เพื่อรวมคำสั่งการตั้งค่าเช่นการเพิ่มสิ่งต่าง ๆ ลงในตัวแปรสภาพแวดล้อม
ว่าฉันมีคำสั่งเหล่านี้ในไฟล์อื่น, addvars.sh
.
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
โปรดสังเกตว่าฉันไม่มีตัวแปรใด ๆ ในสภาพแวดล้อมของเชลล์ปัจจุบัน
$ env | grep VAR
$
ตอนนี้เมื่อฉันมาไฟล์นี้:
$ . addvars.sh
$
ตกลงดูเหมือนจะไม่ได้ทำอะไร แต่เมื่อเราตรวจสอบenv
ตัวแปรอีกครั้ง:
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
วิธีเพิ่มคำตอบของ slm:
มีสองวิธีในการรันเชลล์สคริปต์ หนึ่งคือการเรียกใช้สคริปต์ในกระบวนการแยกต่างหากซึ่งหมายความว่าอะไรเกี่ยวกับสภาพแวดล้อมของเชลล์ (สถานะหน่วยความจำ) จะเปลี่ยนกลับไปเป็นสถานะของเชลล์ "พาเรนต์" ก่อนที่จะรันกระบวนการเชลล์ "child"
ตัวอย่างเช่นไดเร็กทอรีการทำงานปัจจุบัน (ตำแหน่งในระบบไฟล์หนึ่งอยู่) ถูกกำหนดบนพื้นฐานต่อกระบวนการ ดังนั้นเรามามีสคริปต์ที่มีลักษณะเช่นนี้:
#!/bin/bash
cd ~
cd ..
pwd
foo
ดังนั้นขอเรียกสคริปต์นี้โอ้ และเรียกใช้สคริปต์นี้ดังนี้./foo
เราจะเห็นสิ่งต่อไปนี้:
/home
(ข้อจำกัดความรับผิดชอบมาตรฐานว่ามีลินุกซ์จำนวนมากและการแจกแจงโคลนอื่น ๆ ของ UNIX ซึ่งบางอันไม่ได้ใส่ไดเรกทอรีของผู้ใช้/home
หรืออย่างที่เราเคยพูดว่า "ระยะทางของคุณอาจแตกต่าง")
ตอนนี้หลังจากเรียกใช้สคริปต์นี้ให้พิมพ์คำสั่งนี้
pwd
หากต้องการดูว่าเราอยู่ในไดเรกทอรีใดเราจะเห็นสิ่งนี้:
/home/username
เหตุผลก็คือเชลล์สคริปต์ที่เรารันมีสภาพแวดล้อมของตัวเอง (รวมถึงไดเรกทอรีของตัวเองที่คำสั่งถูกเรียกใช้) และสภาพแวดล้อมนั้นหายไปเมื่อสคริปต์ทำงานเสร็จ
ตอนนี้เรามาเรียกใช้foo
สคริปต์เช่นนี้
. ./foo
หรือเทียบเท่า:
source ./foo
หากเราทำpwd
หลังจากนั้นเราจะเห็นสิ่งนี้:
/home
เหตุผล: การจัดหาสคริปต์ไม่ได้เรียกกระบวนการแยกต่างหาก มันเหมือนกับการพิมพ์คำสั่งทั้งหมดในกระบวนการหลักด้วยมือ สภาพแวดล้อมจะถูกเก็บรักษาไว้หลังจากสคริปต์สิ้นสุดลง
ขอยกตัวอย่างง่ายๆขึ้นมา มามีสคริปต์ที่มีลักษณะดังนี้:
#!/bin/bash
exit
Let 's foo
ชื่อมัน chmod 755 foo
ขอให้แน่ใจว่าเราสามารถเรียกใช้งาน: จากนั้นลองเรียกใช้ดังนี้:
./foo
ไม่มีอะไรเกิดขึ้น. อย่างไรก็ตามในทางกลับกันถ้าเราทำสิ่งนี้:
. ./foo
หรือสิ่งนี้:
source ./foo
เราออกจากระบบ
จุด (dot) นั้นสั้นมากสำหรับการทุบตีในsource
ตัว มันจะอ่านและดำเนินการคำสั่งจากไฟล์ในสภาพแวดล้อมปัจจุบันและกลับสถานะทางออกของคำสั่งสุดท้ายที่ดำเนินการ PATH
ไฟล์ที่สามารถอยู่ในไดเรกทอรีปัจจุบันหรือที่ใดก็ได้ใน มันไม่จำเป็นต้องสามารถเรียกใช้งานได้
# type .
. is a shell builtin
# help .
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
. (โอเปอเรเตอร์หรือตัวดำเนินการ dot)
อ่านและดำเนินการคำสั่งจากอาร์กิวเมนต์ชื่อไฟล์ในบริบทเชลล์ปัจจุบัน
Syntax
. filename [arguments]
source filename [arguments]
แหล่งที่มาเป็นคำพ้องสำหรับจุด / ระยะเวลา '.' ใน bash แต่ไม่ใช่ใน POSIX sh ดังนั้นเพื่อความเข้ากันได้สูงสุดให้ใช้ช่วงเวลา
เมื่อสคริปต์รันโดยใช้ซอร์สสคริปต์จะรันภายในเชลล์ที่มีอยู่ตัวแปรใด ๆ ที่สร้างหรือแก้ไขโดยสคริปต์จะยังคงพร้อมใช้งานหลังจากสคริปต์เสร็จสิ้น ในทางตรงกันข้ามถ้าสคริปต์ถูกเรียกใช้ในชื่อไฟล์ดังนั้นเชลล์ย่อยที่แยกจากกัน (ที่มีชุดของตัวแปรที่แยกจากกันอย่างสมบูรณ์) จะถูกเรียกกลับมาทำงาน
มีความแตกต่างเล็กน้อยระหว่างการเรียกใช้งานสคริปต์โดยการเรียกใช้. ss64script (dot ss64script) และ ss64script (dot space ss64script)
ตัวแรกกำลังเรียกใช้ไฟล์ที่ถูกซ่อนจากคำสั่ง 'ls' (แม้ว่า ls -a จะแสดงไฟล์ที่ซ่อนอยู่) ตัวเลือกที่สองจะดำเนินการ ss64script แม้ว่ามันจะไม่ได้ถูกตั้งเป็นปฏิบัติการด้วย chmod ก็ตาม
TL; DR
จุดเหมือนกันกับคำสั่งต้นทาง
source คือคำสั่ง Unix ที่ประเมินไฟล์ตามคำสั่งในรายการของคำสั่งที่ดำเนินการในบริบทปัจจุบัน