Trong shell POSIX, .
là một nội dung đặc biệt, do đó, lỗi của nó khiến cho shell thoát ra (trong một số shell như bash
, nó chỉ được thực hiện khi ở chế độ POSIX).
Những gì đủ điều kiện là một lỗi phụ thuộc vào vỏ. Không phải tất cả đều thoát do lỗi cú pháp khi phân tích tệp, nhưng hầu hết sẽ thoát khi không tìm thấy hoặc mở tệp có nguồn gốc. Tôi không biết bất kỳ cái gì sẽ thoát nếu lệnh cuối cùng trong tệp có nguồn gốc được trả về với trạng thái thoát khác không (trừ khi errexit
tất nhiên là tùy chọn được bật).
Làm ở đây:
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
Có phải là trường hợp bạn muốn tìm nguồn tệp nếu nó ở đó và không nếu nó không (hoặc trống ở đây với -s
).
Đó là, nó không nên được coi là một lỗi (lỗi nghiêm trọng trong shell POSIX) nếu tệp không có ở đó, tệp đó được coi là một tệp tùy chọn.
Nó vẫn sẽ là một lỗi (nghiêm trọng) nếu tệp không thể đọc được hoặc là một thư mục hoặc (trong một số shell) nếu có lỗi cú pháp trong khi phân tích nó sẽ là điều kiện lỗi thực sự cần được báo cáo.
Một số người sẽ tranh luận rằng có một điều kiện chủng tộc. Nhưng điều duy nhất có nghĩa là shell sẽ thoát với lỗi nếu tệp bị xóa ở giữa [
và .
, nhưng tôi cho rằng nó hợp lệ khi coi đó là lỗi mà tệp đường dẫn cố định này sẽ đột nhiên biến mất trong khi tập lệnh là đang chạy.
Mặt khác,
command . "$NVM_DIR/nvm.sh" 2> /dev/null
trong đó command
loại bỏ thuộc tính đặc biệt cho .
lệnh (vì vậy nó không thoát khỏi vỏ bị lỗi) sẽ không hoạt động như sau:
- nó sẽ ẩn
.
các lỗi nhưng cũng là lỗi của các lệnh chạy trong tệp có nguồn gốc
- nó cũng sẽ ẩn các điều kiện lỗi thực sự như tệp có quyền sai.
Các cú pháp phổ biến khác (xem ví dụ grep -r /etc/default /etc/init*
trên các hệ thống Debian để biết các tập lệnh init chưa được chuyển đổi thành systemd
(nơi EnvironmentFile=-/etc/default/service
được sử dụng để chỉ định tệp môi trường tùy chọn thay thế)) bao gồm:
[ -e "$file" ] && . "$file"
Kiểm tra tập tin ở đó, vẫn nguồn nếu nó trống. Vẫn còn lỗi nghiêm trọng nếu không thể mở được (ngay cả khi nó ở đó hoặc ở đó). Bạn có thể thấy nhiều biến thể hơn như [ -f "$file" ]
(tồn tại và là một tệp thông thường ), [ -r "$file" ]
(có thể đọc được) hoặc kết hợp các biến thể đó.
[ ! -e "$file" ] || . "$file"
Một phiên bản tốt hơn một chút. Làm cho nó rõ ràng hơn rằng các tập tin không tồn tại là một trường hợp OK. Điều đó cũng có nghĩa là ý $?
chí phản ánh trạng thái thoát của lệnh cuối cùng được chạy $file
(trong trường hợp trước, nếu bạn nhận được 1
, bạn không biết liệu đó có phải là do $file
không tồn tại hay nếu lệnh đó thất bại).
command . "$file"
Yêu cầu tệp sẽ ở đó, nhưng không thoát nếu không thể hiểu được.
[ ! -e "$file" ] || command . "$file"
Kết hợp các cách trên: không sao nếu tệp không có ở đó và đối với trình bao POSIX, lỗi mở (hoặc phân tích) tệp được báo cáo nhưng không gây tử vong (có thể được mong muốn hơn ~/.profile
).
Lưu ý: zsh
Tuy nhiên, bạn không thể sử dụng command
như vậy trừ khi sh
thi đua; lưu ý rằng trong vỏ Korn, source
thực sự là một bí danh cho command .
, một biến thể không đặc biệt của.