ความหมายของจุดก่อนคำสั่งในเชลล์คืออะไร?


74

ขณะที่ติดตามการดีบัก android eclipse ฉันพบคำสั่งต่อไปนี้

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

ปัญหาของฉันคือสิ่งที่จุดก่อนbuild/envsetup.shหมายถึงอะไร

คำตอบ:


78

จุดในบริบทนั้นหมายถึง "แหล่ง" เนื้อหาของไฟล์นั้นลงในเชลล์ปัจจุบัน ด้วย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

70

วิธีเพิ่มคำตอบของ 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

เราออกจากระบบ


6
คำตอบของคุณดีกว่าคำตอบที่ยอมรับฉันเข้าใจว่าคุณอธิบายได้อย่างไรขอบคุณ!
อาเหม็ด

5

จุด (dot) นั้นสั้นมากสำหรับการทุบตีในsourceตัว มันจะอ่านและดำเนินการคำสั่งจากไฟล์ในสภาพแวดล้อมปัจจุบันและกลับสถานะทางออกของคำสั่งสุดท้ายที่ดำเนินการ PATHไฟล์ที่สามารถอยู่ในไดเรกทอรีปัจจุบันหรือที่ใดก็ได้ใน มันไม่จำเป็นต้องสามารถเรียกใช้งานได้


1

วิธีการหา

# 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.

ฉันคิดว่ามีจุลภาคหายไปในคู่มือ มันควรจะพูดว่า“ สั่งคำสั่งจากไฟล์ในเชลล์ปัจจุบัน”
ctrl-alt-delor

1

. (โอเปอเรเตอร์หรือตัวดำเนินการ dot)
อ่านและดำเนินการคำสั่งจากอาร์กิวเมนต์ชื่อไฟล์ในบริบทเชลล์ปัจจุบัน

Syntax
      . filename [arguments]

      source filename [arguments]

แหล่งที่มาเป็นคำพ้องสำหรับจุด / ระยะเวลา '.' ใน bash แต่ไม่ใช่ใน POSIX sh ดังนั้นเพื่อความเข้ากันได้สูงสุดให้ใช้ช่วงเวลา

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

มีความแตกต่างเล็กน้อยระหว่างการเรียกใช้งานสคริปต์โดยการเรียกใช้. ss64script (dot ss64script) และ ss64script (dot space ss64script)

ตัวแรกกำลังเรียกใช้ไฟล์ที่ถูกซ่อนจากคำสั่ง 'ls' (แม้ว่า ls -a จะแสดงไฟล์ที่ซ่อนอยู่) ตัวเลือกที่สองจะดำเนินการ ss64script แม้ว่ามันจะไม่ได้ถูกตั้งเป็นปฏิบัติการด้วย chmod ก็ตาม

แหล่ง


0

TL; DR

จุดเหมือนกันกับคำสั่งต้นทาง

source คือคำสั่ง Unix ที่ประเมินไฟล์ตามคำสั่งในรายการของคำสั่งที่ดำเนินการในบริบทปัจจุบัน

สกัดจาก https://en.wikipedia.org/wiki/Source_(command)


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