Nguồn so với. Tại sao hành vi khác nhau?


17

Gần đây tôi đã học được rằng

. ./.a.a./.a.alà như nhau.

Tuy nhiên cố gắng source source .a.acho một lỗi. IMO, .là bí danh của Bash vì sourcekhông nên cư xử khác biệt, vậy tôi còn thiếu điều gì?

Tiền thưởng, tại sao vẫn . .ổn trong khi source sourcekhông?


8
Bạn có thể đã chọn một tên rõ ràng hơn cho ví dụ của bạn :). Trong mọi trường hợp, bất cứ điều gì đã cho bạn ý tưởng đó . script./scriptlà điều tương tự? Họ chắc chắn là không . Ngoài ra, .không phải là một bí danh source. Đó là cách khác. .là tiêu chuẩn và sourcelà một bí danh của ..
terdon

2
Sau khi dành một chút thời gian để xem các kịch bản shell, bạn đã quen với .lệnh này, nhưng ý tôi là đó sourcelà một lệnh tốt hơn, khi bạn nhìn thấy source somefiletrong một kịch bản, bạn biết ngay câu lệnh đó làm gì, nhưng . somefile không chỉ không rõ nó làm gì, bạn có thể dễ dàng bỏ lỡ . nhân vật hoàn toàn
the_velour_fog

Tiền thưởng, tại sao vậy. . OK trong khi nguồn nguồn không? - ở cách xa các thông báo lỗi bash: .: .: is a directorytrên . .là nhu cầu ok để được giải thích.
phản biện

@terdon - Hoàn toàn đúng. Ví dụ ban đầu là . ./.a.a .trung thực. : -DA đố các loại, nếu bạn muốn. :-) Câu hỏi liên kết là tuyệt vời, cảm ơn rất nhiều. Điều đã cho tôi ý tưởng đó: thực tế là tôi đã thấy không có sự khác biệt trong việc thực thi các tệp theo cách này và thực tế tôi đọc ở đâu đó .là một bí danh cho source. :-)
LAFK nói Phục hồi lại

Câu trả lời:


27

Bạn không thể thay thế .bằng sourcemọi nơi; nếu

. ./.a.a

hoạt động, bạn có thể thay thế cái đầu tiên .(ít nhất là trong Bash):

source ./.a.a

Thứ hai .đại diện cho thư mục hiện tại, bạn không thể thay thế điều đó với source(đặc biệt là không ./sourcenhư bạn đã làm).

source source

sẽ ổn nếu bạn có một tệp được gọi sourcetrong thư mục hiện tại, chứa thứ gì đó có ý nghĩa cho trình bao hiện tại của bạn. Tôi không thể thấy làm thế nào . .sẽ ổn ...

Ngoài ra, . ./.a.a./.a.akhông giống nhau, dạng thứ hai chạy .a.atrong một vỏ riêng. Xem sự khác biệt giữa tìm nguồn cung ứng ('.' Hoặc 'nguồn') và thực thi một tệp trong bash là gì? để biết chi tiết.


9

sourcelà một từ khóa shell được cho là sẽ được sử dụng như thế này: sourcefilenơi filechứa các lệnh shell hợp lệ. Các lệnh shell này sẽ được thực thi trong shell hiện tại như thể được gõ từ dòng lệnh. Bây giờ, .filelàm chính xác như vậy.

Ngoài ra, .một mình có nghĩa là "thư mục làm việc hiện tại" như trong ./xyz(" xyztrong thư mục này") hoặc a/b/./c/./d(trùng với a/b/c/d).

Ngoài ra, .trong tên tệp chỉ có ý nghĩa theo quy ước như trong .foobarđó chỉ ra tệp "ẩn" (không thực sự ...) hoặc như trong foobar.pdf, chỉ ra định dạng tệp theo hậu tố (ở đây .pdf).

Những ý nghĩa khác nhau không thể thay thế cho nhau.


8
.không có cách nào lỗi thời Nó, không giống như sourcecách di chuyển, định nghĩa POSIX để tìm nguồn cung cấp một tệp. Các sourcebí danh là vỏ cụ thể và có thể là vắng mặt (ví dụ như trong dash) hoặc cư xử khác với tiêu chuẩn ..
terdon

Cảm ơn @terdon, Wiki nói rằng nguồn dưới dạng dấu chấm (.) Không được chấp nhận trong trình bao C, nơi lệnh xuất hiện đầu tiên.
Noam Manos

1
@NoamManos có lẽ, nhưng C-shell không phải là POSIX, vì vậy nó có thể (và không) hoạt động rất khác nhau.
terdon
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.