Ý nghĩa của dấu chấm trước lệnh trong shell là gì?


75

Trong khi làm theo hướng dẫn gỡ lỗi nhật thực android, tôi gặp phải các lệnh sau.

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

Vấn đề của tôi là những gì các dấu chấm trước build/envsetup.shcó nghĩa là gì?

Câu trả lời:


79

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 sourcechính nó là một lệnh dựng sẵn shell. Và sourcetoán tử dấu chấm là từ đồng nghĩa.

Thí dụ

Nói rằng tôi đã có các nội dung sau đây trong một sample.shtậ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.

Ví dụ

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 envbiến:

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string

71

Để 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 fookịch bản như thế này

. ./foo

Hoặc, tương đương:

source ./foo

Nếu chúng ta làm pwdsau đó, 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.


6
Câu trả lời của bạn tốt hơn câu trả lời, tôi hiểu cách bạn giải thích, cảm ơn!
Ahmed

Dun-da-da-duuuun! (xin vui lòng đánh trống) ... và cụm từ quan trọng nhất ở đây là!: 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.
Gabriel Staples

5

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.


1

Làm thế nào để tìm hiểu.

# 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.

Tôi nghĩ rằng có một dấu phẩy bị thiếu trong hướng dẫn. Nó nên nói các lệnh Thực thi từ một tập tin, trong trình bao hiện tại. Hãy
ctrl-alt-delor

1

. (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.

Nguồn


0

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)


2
Chào mừng bạn đến với U & L! Câu trả lời này trùng lặp thông tin đã có trong câu trả lời được chấp nhận và không thực sự thêm bất cứ điều gì.
JigglyNaga
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.