Câu trả lời:
Một dấu chấm trong ngữ cảnh đó có nghĩa là "nguồn" nội dung của tệp đó vào trình bao hiện tại. Với source
chính nó là một lệnh dựng sẵn shell. Và source
toán tử dấu chấm là từ đồng nghĩa.
Nói rằng tôi đã có các nội dung sau đây trong một sample.sh
tập tin.
$ cat sample.sh
echo "hi"
echo "bye?"
Bây giờ khi tôi nguồn nó:
$ . sample.sh
hi
bye?
$
Các tệp như thế này thường được sử dụng để kết hợp các lệnh thiết lập như thêm các thứ vào các biến môi trường.
Nói rằng tôi đã có các lệnh này trong một tập tin khác , addvars.sh
.
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
Lưu ý rằng tôi không có bất kỳ biến nào trong môi trường shell hiện tại của tôi.
$ env | grep VAR
$
Bây giờ khi tôi nguồn tập tin này:
$ . addvars.sh
$
OK, có vẻ như nó không làm gì cả, nhưng khi chúng tôi kiểm tra lại các env
biến:
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
Để thêm vào câu trả lời của slm:
Có hai cách để chạy một kịch bản shell. Một là chạy tập lệnh trong một quy trình riêng, có nghĩa là mọi thứ về môi trường của vỏ (trạng thái bộ nhớ) sẽ trở lại trạng thái của trình bao "cha mẹ" trước khi chạy quy trình trình bao "con".
Ví dụ: thư mục làm việc hiện tại (vị trí trong hệ thống tập tin đang ở) được xác định trên cơ sở mỗi quy trình. Vì vậy, hãy có một kịch bản trông như thế này:
#!/bin/bash
cd ~
cd ..
pwd
Vì vậy, hãy gọi kịch bản này, oh , foo
. Và hãy chạy tập lệnh này như sau:./foo
Chúng ta sẽ thấy như sau:
/home
(Từ chối trách nhiệm chuẩn rằng có một số lượng lớn của Linux và phân phối bản sao UNIX khác trên mạng, một số trong đó không đưa danh bạ của người dùng trong /home
. Hoặc, như chúng ta thường nói "mileage của bạn có thể thay đổi")
Bây giờ, sau khi chạy tập lệnh này, hãy gõ lệnh này
pwd
Để xem thư mục nào chúng tôi đang ở. Chúng tôi sẽ thấy một cái gì đó như thế này:
/home/username
Lý do là, một lần nữa, tập lệnh shell mà chúng tôi chạy có môi trường riêng (bao gồm cả thư mục riêng của nó nơi các lệnh đang được chạy) và môi trường đó biến mất sau khi tập lệnh chạy xong.
Bây giờ, hãy chạy foo
kịch bản như thế này
. ./foo
Hoặc, tương đương:
source ./foo
Nếu chúng ta làm pwd
sau đó, chúng ta sẽ thấy điều này:
/home
Lý do là: Tìm kiếm một tập lệnh không gọi một quy trình riêng biệt. Nó giống như gõ tất cả các lệnh trong tiến trình cha bằng tay; môi trường của nó được bảo tồn sau khi kịch bản kết thúc.
Hãy để tôi đưa ra một ví dụ đơn giản hơn. Chúng ta hãy có một kịch bản trông như thế này:
#!/bin/bash
exit
Hãy đặt tên cho nó foo
. Hãy chắc chắn rằng chúng ta có thể chạy nó : chmod 755 foo
. Sau đó, hãy chạy nó như thế này:
./foo
Chẳng có gì xảy ra. Tuy nhiên, mặt khác, nếu chúng ta làm điều này:
. ./foo
Hoặc này:
source ./foo
Chúng tôi đăng xuất.
Dấu chấm (dấu chấm) là bàn tay ngắn cho bash được tích hợp sẵn source
. Nó sẽ đọc và thực thi các lệnh từ một tệp trong môi trường hiện tại và trả về trạng thái thoát của lệnh cuối cùng được thực thi. Các tập tin có thể trong thư mục hiện tại hoặc bất cứ nơi nào trong PATH
. Nó không cần phải được thực thi.
# type .
. is a shell builtin
# help .
.: . 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.
. (toán tử nguồn hoặc dấu chấm)
Đọc và thực thi các lệnh từ đối số tên tệp trong ngữ cảnh shell hiện tại.
Syntax
. filename [arguments]
source filename [arguments]
nguồn là từ đồng nghĩa với dấu chấm / dấu chấm '.' trong bash, nhưng không phải trong POSIX sh, vì vậy để tương thích tối đa, hãy sử dụng dấu chấm.
Khi tập lệnh được chạy bằng nguồn, nó chạy trong trình bao hiện có, mọi biến được tạo hoặc sửa đổi bởi tập lệnh sẽ vẫn có sẵn sau khi tập lệnh hoàn tất. Ngược lại, nếu tập lệnh được chạy giống như tên tệp, thì một tập hợp con riêng biệt (với một bộ biến hoàn toàn riêng biệt) sẽ được sinh ra để chạy tập lệnh.
Có một sự khác biệt tinh tế giữa việc thực thi một tập lệnh bằng cách chạy .ss64script (dot ss64script) và. ss64script (dấu chấm ss64script)
đầu tiên đang chạy một tệp bị ẩn khỏi lệnh 'ls', (mặc dù ls -a sẽ hiển thị các tệp bị ẩn), tùy chọn thứ hai sẽ thực thi ss64script ngay cả khi nó không được đặt thành tệp thực thi với chmod.
TL; DR
Dấu chấm giống như lệnh nguồn.
source là một lệnh Unix để đánh giá tệp theo lệnh, như một danh sách các lệnh, được thực thi trong ngữ cảnh hiện tại.
Trích xuất từ https://en.wikipedia.org/wiki/Source_(command)