ตกลงไหมที่จะใช้“.” รันไฟล์แทนที่จะเป็น source - in .bashrc ใน Ubuntu และ OS X


11

ตกลงดังนั้นsourceรันสคริปต์ในเชลล์ปัจจุบันและ.แยกกันตามรายละเอียดในการรันสคริปต์ด้วย "." และด้วย "source"ตัวอย่างเช่น แต่โดยเฉพาะใน.bashrcไฟล์ของฉันฉันมี:

[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh

ฉันสามารถแทนที่ด้วย:

[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh

จะใช้งานได้กับ OS X - เป็นปัญหา "POSIX" หรือไม่

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

FWIW, บน OS X ฉันมาฉันจากฉัน.bashrc.bash_profile


1
ถ้ามันเป็น 'sh' เชลล์ที่ฉันจะใช้ '. เพื่อความเข้ากันได้ทั่วโลกและถ้าคุณใช้เชลล์ตาม 'csh' ฉันจะใช้ซอร์ส
mdpc

2
คุณเห็นที่ไหนในโพสต์ที่ลิงก์ว่า " sourceเรียกใช้สคริปต์ในเชลล์ปัจจุบันและ.แยกกัน"? พวกเขาทั้งคู่รันมันในเชลล์ปัจจุบัน; มิฉะนั้นจะไม่มีประเด็น
Michael Mrozek

คำตอบ:


11

นี่คือคำนิยามของ POSIXของ.dot:

เชลล์จะดำเนินการคำสั่งจากไฟล์ในสภาพแวดล้อมปัจจุบัน

หากไฟล์ไม่มีไฟล์/<slash>เชลล์จะใช้พา ธ การค้นหาที่ระบุโดย$PATHเพื่อค้นหาไดเร็กทอรีที่มีไฟล์ ไม่เหมือนกับการค้นหาคำสั่งปกติไฟล์ที่ค้นหาโดย.dot ยูทิลิตี้ไม่จำเป็นต้องเรียกใช้งาน หากไม่พบไฟล์ที่อ่านได้เชลล์ที่ไม่มีการโต้ตอบจะยกเลิก เชลล์เชิงโต้ตอบจะต้องเขียนข้อความวินิจฉัยข้อผิดพลาดมาตรฐาน แต่เงื่อนไขนี้จะไม่ถือว่าเป็นข้อผิดพลาดทางไวยากรณ์

เมื่อพิจารณาจากข้างต้นคุณก็อาจจะแทนที่[ -f ./file ] && source ./fileด้วย. ./fileทั้งหมด หากไฟล์ไม่มีที่แย่ที่สุดที่จะเกิดขึ้นคุณจะได้รับการแจ้งเตือนเมื่อเข้าสู่ระบบ - ซึ่งอาจเป็นข้อมูลที่คุณต้องการฉันคิดว่า

แน่นอนว่าถ้าคุณต้องการทำแบบทดสอบคุณสามารถทำได้:

test -f ./file && . $_

2
โอ้คนรู้ว่า$_ฉันชอบที่ :)
Andreas Wiese

@AndreasWiese - ทุกคนควร - เป็นหนึ่งใน 7 พารามิเตอร์พิเศษที่กำหนดโดย POSIX
mikeserv

+1 ฉันสิ้นสุดโดยใช้test -f /.file && . $_วิธีการที่แสดงที่นี่
Michael Durrant

6
@mikeserv ไม่$_ไม่ได้มาตรฐานโดย POSIX 8 พารามิเตอร์พิเศษมี$@, $*, $#, $$, $!, $?, และ$- ถูกมองข้ามอย่างชัดเจน แสดงความคิดเห็นที่ไม่ถูกต้องของคุณจุดประกายคำถาม $0$_
Gilles 'หยุดชั่วร้าย'

19

ในbash, .และsourceมีความหมายเหมือนกัน เมื่อมองเข้าไปในbashซอร์สโค้ดไฟล์builtin/source.defคุณสามารถดู.และsourceใช้ฟังก์ชันภายในเดียวกันได้source_builtin:

$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC source 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.
$END

$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.

แต่sourceไม่ได้ POSIX เข้ากันได้ดังนั้นหากสคริปต์ของคุณเรียกว่ามี POSIX /bin/shคุณควรใช้แทน. sourceเนื่องจาก POSIX ไม่ได้ จำกัด เชลล์สคริปต์ด้านบนทั้งหมดของคุณจึงสามารถใช้งานได้

ส่วนตัวผมมักจะใช้แทน. source(สคริปต์มากมายที่ฉันเขียนเรียกใช้cron)


ทุกสิ่งเท่าเทียมกันใช้ "แหล่งที่มา" แทนที่จะเป็น "" ด้วยเหตุผลหนึ่งข้อ: ลองค้นหา / grep เพื่อหา "." การแสดงออกในสคริปต์ที่มีขนาดใหญ่ มันเป็นฝันร้าย
abonet

แม้ว่าคำตอบนี้จะอธิบายว่าทำไมการใช้.มักจะ "ดีกว่า" มากกว่าการใช้sourceตามที่ @abonet บอกว่าsourceการค้นหาทำได้ง่ายกว่ามาก เนื่องจากจุดมีเครื่องหมายวรรคตอนในหลายภาษาจึงเป็นเรื่องง่ายที่ดวงตาจะข้ามไป sourceนั่นเป็นเหตุผลที่ฉันชอบที่จะใช้
Joe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.