2010-04-14 42 views
9

Hôm nay tôi đã làm theo một số hướng dẫn để cài đặt một phần mềm trong Linux. Có một kịch bản cần phải được chạy trước. Nó đặt một số biến môi trường.Sự khác nhau giữa "./somescript.sh" và ". ./somescript.sh"

Hướng dẫn đã yêu cầu tôi thực thi . ./setup.sh, nhưng tôi đã nhầm lẫn bằng cách thực hiện ./setup.sh. Vì vậy, env đã không được thiết lập. Cuối cùng tôi nhận thấy điều này và tiến hành.

Tôi muốn biết sự khác biệt giữa hai phương pháp này để gọi một tập lệnh. Tôi hoàn toàn mới với Linux, vì vậy hãy càng phức tạp càng tốt.

+0

FYI - những người viết các hướng dẫn này có thể đã yêu cầu bạn viết 'source./Setup.sh' thay vì'. ./setup.sh' để làm cho nó ít mơ hồ hơn; sai lầm bạn tạo ra là một lỗi rất phổ biến. –

+0

@Charles Duffy Cảm ơn bạn đã chỉ ra điều này.Có các hướng dẫn dành cho sử dụng nội bộ, vì vậy tôi đoán chúng được dành cho rất kinh nghiệm. – zihaoyu

+0

'nguồn' là Bash chỉ, trong khi' .' là di động để Bourne shell. Nếu các hướng dẫn không phải là đặc thù của Bash, bạn không thể sử dụng 'nguồn' mặc dù nó sẽ dễ đọc hơn. – tripleee

Trả lời

19

./setup.sh chạy tập lệnh, một trình bao mới sẽ được bắt đầu chạy tập lệnh. Lớp shell mới không thể ảnh hưởng đến shell cha đã bắt đầu script.

. ./setup.sh là viết tắt của source ./setup.sh và nó sẽ chạy tập lệnh trong trình bao hiện tại, thay vì bắt đầu trình bao mới để chạy nó. Điều này có nghĩa là tập lệnh có thể thay đổi hành vi của trình bao hiện tại, ví dụ: thiết lập các biến môi trường mới.

0

. đề cập đến thư mục hiện tại. Vì vậy, ./script.sh có nghĩa là chạy tập lệnh trong thư mục hiện tại.

../script.sh sẽ chạy script.sh trong thư mục chính.

. ./script.sh (có khoảng trống giữa các dấu chấm) sẽ khiếu nại trong một số vỏ như csh nhưng trong bash . foo là viết tắt của source foo.

+0

'.' là một trình bao được tích hợp sẵn. Xem câu trả lời của leeeroy. – dave4420

+0

Chỉ cần tìm ra điều đó. Tôi đã thử nó trong csh và nó nói "lệnh không tìm thấy". Tôi thấy bây giờ trong bash đó là một phím tắt cho "nguồn". – dreeves

+0

'.' là lệnh bash hợp lệ - tương đương với' source' –

3

Chỉnh sửa: Tôi vừa nhận ra rằng tôi đã không trả lời phần khác của câu hỏi của bạn .. nhưng câu trả lời của leeroy là vậy. Tôi đã trả lời điều gì khác, nhưng tôi hy vọng điều này sẽ giúp :-)

Chạy chức năng sh bash trên tập lệnh bạn trình bày. Xem the man page để biết thêm, nhưng bạn có thể thấy sh về cơ bản là từ đồng nghĩa với bash

Khi bạn chạy một kịch bản ala ./setup.sh nó xác định kịch bản dựa trên những gì ở phía trên cùng của tập tin, thường được gọi là "Shebang"

Một kịch bản bash sẽ phải

#!/bin/sh 

Hoặc tương tự ở phía trên cùng của tập tin, cho phép bạn sử dụng dấu chấm phương pháp. Bạn cũng có thể sử dụng những thứ khác, như tập lệnh Python có thể có

#!/usr/bin/env/python 

Và nếu đường dẫn của bạn đúng, nó sẽ chạy tập lệnh dưới dạng chữ viết Python thay vì chữ chạy bằng ký hiệu chấm.

Hy vọng giải thích nó một cách đơn giản!

+0

Đó là tất cả sự thật, nhưng nó không trả lời câu hỏi. Điểm mấu chốt là '. ./setup.sh' có thể thay đổi shell hiện tại, và './setup.sh' không thể. –

0

Chỉ cần chạy "source /path/to/setup.sh"

này sẽ thiết lập các biến môi trường trong vỏ hiện hành.

Các vấn đề liên quan