2012-05-24 24 views
16

Trong tập lệnh Bash, có một câu lệnh thay thế duy nhất cho điều này không?Bao gồm/Tập lệnh nguồn nếu nó tồn tại trong Bash

if [ -f /path/to/some/file ]; then 
    source /path/to/some/file 
fi 

Điều quan trọng nhất là tên tập tin là chỉ có một lần, mà không làm cho nó một biến (trong đó cho biết thêm, ngay cả nhiều dòng).

Ví dụ, trong PHP bạn có thể làm điều đó như thế này

@include("/path/to/some/file"); // @ makes it ignore errors 

Trả lời

2

Bạn có thể thử

test -f $FILE && source $FILE 

Nếu test lợi nhuận sai, phần thứ hai của && là không được đánh giá

+1

Tốt hơn một chút, nhưng tôi muốn chỉ có $ FILE một lần (cập nhật Đã đặt câu hỏi) –

+0

Vì đó là một biến, giá trị của nó sẽ nhất quán, tôi không nghĩ rằng bạn nên tự quan tâm đến nó – Attila

+0

Mặc dù vậy, nó không nhất thiết phải là một biến số –

4

Nếu bạn lo ngại về cảnh báo (và thiếu sự tồn tại của tệp có nguồn gốc không quan trọng đối với tập lệnh của bạn) chỉ cần loại bỏ cảnh báo:

source FILE 2> /dev/null 
+0

Tập tin là tùy chọn vì vậy thiếu nó được mong đợi, nhưng điều này cũng không loại bỏ bất kỳ đầu ra kịch bản kèm theo tạo ra? –

+0

@BartvanHeukelom: Có, nhưng nó sẽ chỉ loại bỏ bất kỳ đầu ra nào được gửi tới lỗi * chuẩn * bởi tập lệnh. Bất kỳ đầu ra nào được gửi đến đầu ra tiêu chuẩn bởi tập lệnh sẽ bị phạt. – ayaz

0

Nếu bạn không quan tâm đến đầu ra của kịch bản, bạn chỉ có thể chuyển hướng sai số chuẩn để /dev/null với một cái gì đó như thế này:

$ source FILE 2> /dev/null

9

Nếu bạn lo ngại về một one- lót mà không lặp lại tên tệp, có lẽ:

FILE=/path/to/some/file && test -f $FILE && source $FILE 
23

Đang xác định phiên bản của riêng bạn là @include một tùy chọn?

include() { 
    [[ -f "$1" ]] && source "$1" 
} 

include FILE 
+0

Hiện tại không, nhưng vâng, có thể hoạt động trong một số trường hợp. –

2

Đây là ngắn nhất tôi có thể nhận được (tên tập tin cộng với 20 ký tự):

F=/path/to/some/file;[ -f $F ] && . $F 

Đó là tương đương với:

F=/path/to/some/file 
test -f $F && source $F 

Để cải thiện khả năng đọc, tôi thích hình thức này:

FILE=/path/to/some/file ; [ -f $FILE ] && . $FILE 
Các vấn đề liên quan