Lệnh 'dot space filename' đang làm gì trong bash?


30

Khi sử dụng bash shell, đôi khi tôi giữ các biến môi trường trong một tệp văn bản mà tôi sao chép / dán nội dung của, ví dụ export.txt:

export FOO=bar
export FIZZ=buzz

Ai đó chỉ cho tôi thay vì sao chép / dán, tôi có thể nhập vào thiết bị đầu cuối

. exports.txt

mà sẽ có tác dụng tương tự như sao chép / dán.

Cơ chế mà lệnh 'dot space filename' này hoạt động là gì? Thật khó để nghĩ về các thuật ngữ tìm kiếm cho nó.

Tôi muốn hiểu những gì đang xảy ra và các chi tiết tổng quát hơn về những gì một lớp lót này đang làm.


23
Chạy help . Điều này quá ngắn, công cụ Stack Exchange nghĩ rằng nó quá ngắn để có thể nhận xét.
tự đại diện

5
Tôi tự hỏi tại sao tất cả những câu hỏi này cũng xảy ra trong trang web này. Chúng đã được trả lời nhiều lần trong Stack Overflow , Hỏi UbuntuUnix & Linux .
fedorqui

Để chạy dấu cách, bạn cần nhập '. ' args, với dấu ngoặc đơn hoặc dấu ngoặc kép. Mặt khác, không gian không trích dẫn bị ăn hết bởi bash khi phân tích cú pháp dòng thành mã thông báo (xem "chia tách từ" trong hướng dẫn sử dụng bash).
Peter Cordes

1
Trong bash, tên thay thế cho .source, có nghĩa đen có nghĩa là "nguồn lệnh từ tập tin này," ít nhất đối với tôi.
jpaugh

Câu trả lời:


40

Lệnh .("dot") là một từ đồng nghĩa / phím tắt cho lệnh tích hợp của shell source.

Nó làm cho tập lệnh shell được đặt tên được đọc và thực thi trong bối cảnh shell hiện tại (chứ không phải là một subshell). Điều này cho phép tập lệnh có nguồn gốc sửa đổi môi trường của shell gọi, chẳng hạn như thiết lập các biến và xác định các hàm và bí danh của shell.


49
Trên thực tế, sourcelà một từ đồng nghĩa / phím tắt không chuẩn và không di động cho lệnh "dot" ( ) do POSIX định nghĩa. , không phải theo cách khác.
terdon

8
bash cung cấp một tiêu chuẩn không chuẩn sourcevà không chuẩn .trong chế độ không POSIX, cả hai đều tìm kiếm thư mục hiện tại ngay cả khi nó không phải là một phần của $PATH. Trong chế độ POSIX, nó cung cấp một tiêu chuẩn .không tìm kiếm thư mục hiện tại và không source. Trong cả hai chế độ không sourceđồng nghĩa với .lệnh của POSIX .
hvd

26

Mặc dù hai câu trả lời hiện có đã rất xuất sắc, tôi cảm thấy ví dụ mà hiệu ứng là "đáng chú ý" nhất có thể nói là bị thiếu.

Nói rằng tôi có một tập tin script.shvới các nội dung sau:

cd dir

Nếu tôi chạy tập lệnh này một cách bình thường ( sh script.sh), tôi sẽ thấy điều này:

olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$

Nhưng nếu tôi tìm nguồn script ( . script.sh), tôi sẽ kết thúc bằng thứ này:

olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$

Lưu ý rằng trong trường hợp thứ hai, thư mục làm việc của shell chính của chúng ta đã thay đổi!

Điều này là do (như ra nhọn trong câu trả lời khác) ví dụ chạy đầu tiên trong subshell riêng của mình (các shquá trình chúng ta bắt đầu với sh-Command, đây có thể là cơ bản bất kỳ vỏ, bash, dash, bạn đặt tên cho nó), nó thay đổi thư mục ở đó, không làm gì và đóng cửa. Trong khi ví dụ thứ hai chạy trong shell chính của chúng ta, và do đó thay đổi thư mục ở đó!


4

Đây là một ví dụ.

Tập tin tập lệnh: mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

nếu bạn cố in bất kỳ biến nào ở trên, bạn sẽ không nhận được gì

echo $myvar

nhưng nếu bạn làm

. mytest.sh

hoặc là

source mytest.sh

và sau đó

echo $myvar

nó sẽ in 1

Chỉ là một câu trả lời trực quan về những gì Spiff đã viết


Vì vậy, diễn giải ví dụ của bạn, chỉ sử dụng exportnếu các biến đó được sử dụng trong các lớp con. Tôi có thể bỏ qua exporttrong tệp nếu các biến chỉ được sử dụng trong trình bao hiện tại. Có đúng không?
iancoleman

1
Hoàn toàn đúng và tôi có thể nói có. Tuy nhiên, việc sử dụng lệnh xuất sẽ hữu ích hơn hoặc dễ hiểu hơn nếu bạn nghĩ về các biến môi trường shell. Ví dụ: $ HOME hoặc $ HIỂN THỊ. Có, bạn có thể sử dụng lệnh xuất để xuất một biến trên phiên shell của bạn hoặc bất kỳ lớp con nào nhưng nó sẽ biến mất ngay khi bạn kết thúc phiên đó.
raism
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.