Sử dụng được không? để chạy các tệp thay vì nguồn - trong .bashrc trong Ubuntu và OS X?


11

OK, vì vậy, sourcechạy tập lệnh trong trình bao hiện tại và .riêng biệt, như chi tiết trong việc chạy tập lệnh với "." Và với "nguồn" chẳng hạn, nhưng, cụ thể, trong .bashrctệp của tôi , tôi có:

[ -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

Tôi có thể thay thế điều này bằng:

[ -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

Điều đó có hoạt động trên OS X - đó có phải là vấn đề "POSIX" không?

Tôi đã thử nó và những thứ trên dường như vẫn hoạt động trên Ubuntu (vì vậy chúng thực sự hoạt động với cả hai source., nghĩa là, chúng cho tôi chức năng mong muốn trong vỏ). Tôi nên chọn cái này hơn cái kia, hay tôi đang thiếu thứ gì?

FWIW, trên OS X, tôi lấy nguồn .bashrctừ của tôi .bash_profile.


1
Nếu đó là 'sh' shell shell tôi sẽ sử dụng '.' để tương thích toàn cầu và nếu bạn đang sử dụng các vỏ dựa trên 'csh' tôi sẽ sử dụng nguồn.
mdpc

2
Trường hợp trong bài đăng được liên kết mà bạn thấy rằng " sourcechạy tập lệnh trong trình bao hiện tại và .riêng biệt"? Cả hai đều chạy nó trong shell hiện tại; nếu không thì sẽ không có điểm nào
Michael Mrozek

Câu trả lời:


11

Đây là định nghĩa của POSIX về .dot:

Shell sẽ thực thi các lệnh từ tệp trong môi trường hiện tại.

Nếu tệp không chứa a /<slash>, shell sẽ sử dụng đường dẫn tìm kiếm được chỉ định bởi $PATHđể tìm thư mục chứa tệp. Tuy nhiên, không giống như tìm kiếm lệnh thông thường, tệp được tìm kiếm bởi .dot tiện ích không cần phải được thực thi. Nếu không tìm thấy tệp có thể đọc được, trình bao không tương tác sẽ hủy bỏ; một vỏ tương tác sẽ viết một thông báo chẩn đoán cho lỗi tiêu chuẩn, nhưng điều kiện này sẽ không được coi là một lỗi cú pháp.

Xét trên, bạn cũng có thể chỉ cần thay thế của bạn [ -f ./file ] && source ./filevới . ./filehoàn toàn. Nếu tập tin không ở đó điều tồi tệ nhất sẽ xảy ra là bạn sẽ nhận được thông báo khi đăng nhập - đó có lẽ là thông tin bạn muốn có, tôi nghĩ vậy.

Tất nhiên, nếu bạn muốn giữ bài kiểm tra, bạn có thể làm:

test -f ./file && . $_

2
Ồ, mọi người biết $_, tôi thích điều đó. :)
Andreas Wiese

@AndreasWiese - mọi người nên - đó là một trong 7 thông số đặc biệt được xác định bởi POSIX.
mikeerv

+1 Tôi đã kết thúc bằng cách sử dụng test -f /.file && . $_phương pháp hiển thị ở đây
Michael Durrant

6
@mikeerv Không, $_không được chuẩn hóa bởi POSIX. Các 8 thông số đặc biệt$@, $*, $#, $$, $!, $?, $-$0. $_được bỏ qua rõ ràng . Nhận xét không chính xác của bạn gây ra một câu hỏi .
Gilles 'SO- ngừng trở thành ác quỷ'

19

Trong bash, .sourcelà từ đồng nghĩa. Nhìn vào bashmã nguồn, tệp builtin/source.def, bạn có thể thấy .sourcesử dụng cùng chức năng nội bộ 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.

Nhưng sourcekhông tương thích POSIX, vì vậy nếu tập lệnh của bạn được gọi bằng POSIX /bin/sh, bạn nên sử dụng .thay vì source. Vì POSIX không giới hạn trình bao, tất cả tập lệnh trên của bạn sẽ hoạt động.

Cá nhân, tôi luôn luôn sử dụng .thay vì source. (Rất nhiều kịch bản mà tôi đã viết chạy theo cron).


Tất cả mọi thứ đều bằng nhau, sử dụng "nguồn" thay vì "." vì một lý do: cố gắng tìm kiếm / grep cho "." biểu thức trong một kịch bản lớn. Nó là một cơn ác mộng.
abonet

Mặc dù câu trả lời này giải thích tại sao sử dụng .thường "tốt hơn" so với sử dụng source, như @abonet nói, sourcedễ tìm kiếm hơn rất nhiều. Vì các dấu chấm là dấu chấm câu trong nhiều ngôn ngữ, nên mắt bạn dễ dàng bỏ qua chúng. Đó là lý do tại sao tôi thích sử dụng source.
Joe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.